diff options
author | gingold | 2006-11-18 20:33:16 +0000 |
---|---|---|
committer | gingold | 2006-11-18 20:33:16 +0000 |
commit | 301584eaf540c982676f520d662b473e59890584 (patch) | |
tree | 3c8a80a0b57610fcb0e12a4f8985764fae538aa7 | |
parent | b9d724056d765418acf57c2fa7a79b7ef7e73721 (diff) | |
download | ghdl-301584eaf540c982676f520d662b473e59890584.tar.gz ghdl-301584eaf540c982676f520d662b473e59890584.tar.bz2 ghdl-301584eaf540c982676f520d662b473e59890584.zip |
SEH handled
Bug fixes
-rw-r--r-- | doc/ghdl.texi | 15 | ||||
-rw-r--r-- | ortho/mcode/ortho_code-x86-abi.adb | 7 | ||||
-rw-r--r-- | sem_names.adb | 2 | ||||
-rw-r--r-- | sem_stmts.adb | 21 | ||||
-rw-r--r-- | sem_types.adb | 4 | ||||
-rw-r--r-- | translate/grt/config/win32.c | 97 |
6 files changed, 129 insertions, 17 deletions
diff --git a/doc/ghdl.texi b/doc/ghdl.texi index 38ff82a..b0a87c0 100644 --- a/doc/ghdl.texi +++ b/doc/ghdl.texi @@ -608,21 +608,25 @@ run time library. The actual elaboration is performed at run-time. +On Windows this command can be skipped because it is also done by the +run command. + @node Run command, Elaborate and run command, Elaboration command, Building commands @comment node-name, next, previous, up @subsection Run command @cindex run @cindex @option{-r} command -Run (or simulate) an elaborated design hierarchy. +Run (or simulate) a design. @smallexample -$ ghdl -r @var{primary_unit} [@var{secondary_unit}] [@var{simulation_options}] +$ ghdl -r [@var{options}] @var{primary_unit} [@var{secondary_unit}] [@var{simulation_options}] @end smallexample -The arguments are the same as the @xref{Elaboration command}. +The options and arguments are the same as the @xref{Elaboration command}. On GNU/Linux this command simply build the filename of the executable -and execute it. You may also directly execute the program. +and execute it. Options are ignored. You may also directly execute +the program. This command exists for three reasons: @itemize @bullet{} @@ -635,7 +639,8 @@ It works with the Windows implementation, where the code is generated in memory. @end itemize -On Windows this command elaborate and launch the simulation. +On Windows this command elaborate and launch the simulation. As a consequence +you must use the same options used during analysis. @xref{Simulation and run time}, for details on options. diff --git a/ortho/mcode/ortho_code-x86-abi.adb b/ortho/mcode/ortho_code-x86-abi.adb index 67b4de2..0087bb1 100644 --- a/ortho/mcode/ortho_code-x86-abi.adb +++ b/ortho/mcode/ortho_code-x86-abi.adb @@ -26,6 +26,7 @@ with Ortho_Code.Dwarf; with Ortho_Code.X86; use Ortho_Code.X86; with Ortho_Code.X86.Insns; with Ortho_Code.X86.Emits; +with Ortho_Code.X86.Flags; with Binary_File; with Binary_File.Memory; with Ada.Text_IO; @@ -730,7 +731,9 @@ package body Ortho_Code.X86.Abi is (Ortho_Code.X86.Emits.Intrinsics_Symbol (Ortho_Code.X86.Intrinsic_Div_Ov_I64), Divdi3'Address); - Binary_File.Memory.Set_Symbol_Address - (Ortho_Code.X86.Emits.Chkstk_Symbol, Chkstk'Address); + if X86.Flags.Flag_Alloca_Call then + Binary_File.Memory.Set_Symbol_Address + (Ortho_Code.X86.Emits.Chkstk_Symbol, Chkstk'Address); + end if; end Link_Intrinsics; end Ortho_Code.X86.Abi; diff --git a/sem_names.adb b/sem_names.adb index 80dc26e..be72782 100644 --- a/sem_names.adb +++ b/sem_names.adb @@ -2484,7 +2484,7 @@ package body Sem_Names is Base : Iir; begin Prefix := Get_Named_Entity (Get_Prefix (Attr)); - Base := Get_Base_Name (Prefix); + Base := Get_Object_Prefix (Prefix); case Get_Kind (Base) is when Iir_Kind_Signal_Declaration | Iir_Kind_Signal_Interface_Declaration diff --git a/sem_stmts.adb b/sem_stmts.adb index 0bda7f1..555bfbf 100644 --- a/sem_stmts.adb +++ b/sem_stmts.adb @@ -351,7 +351,8 @@ package body Sem_Stmts is Error_Msg_Sem ("implicit GUARD signal cannot be assigned", Stmt); return; when others => - Error_Msg_Sem ("target is not a signal", Stmt); + Error_Msg_Sem ("target (" & Disp_Node (Get_Base_Name (Target)) + & ") is not a signal", Stmt); return; end case; if Get_Name_Staticness (Target_Object) < Staticness then @@ -461,14 +462,18 @@ package body Sem_Stmts is begin Ok := True; -- Find the signal. - Target := Get_Target (Stmt); - Target := Sem_Expression (Target, Sig_Type); - if Target /= Null_Iir then - Set_Target (Stmt, Target); - Check_Target (Stmt, Target); - Sem_Types.Set_Type_Has_Signal (Get_Type (Target)); - else + if Sig_Type = Null_Iir then Ok := False; + else + Target := Get_Target (Stmt); + Target := Sem_Expression (Target, Sig_Type); + if Target /= Null_Iir then + Set_Target (Stmt, Target); + Check_Target (Stmt, Target); + Sem_Types.Set_Type_Has_Signal (Get_Type (Target)); + else + Ok := False; + end if; end if; Expr := Get_Reject_Time_Expression (Stmt); diff --git a/sem_types.adb b/sem_types.adb index 9b35cc6..d7172c4 100644 --- a/sem_types.adb +++ b/sem_types.adb @@ -62,7 +62,9 @@ package body Sem_Types is Func := Get_Resolution_Function (Atype); if Func /= Null_Iir then Func := Get_Named_Entity (Func); - Set_Resolution_Function_Flag (Func, True); + if Func /= Error_Mark then + Set_Resolution_Function_Flag (Func, True); + end if; end if; Mark := Get_Type_Mark (Atype); if Mark /= Null_Iir then diff --git a/translate/grt/config/win32.c b/translate/grt/config/win32.c index 465f929..de09400 100644 --- a/translate/grt/config/win32.c +++ b/translate/grt/config/win32.c @@ -21,6 +21,19 @@ #include <stdio.h> #include <setjmp.h> #include <assert.h> +#include <excpt.h> + +static EXCEPTION_DISPOSITION +ghdl_SEH_handler (struct _EXCEPTION_RECORD* ExceptionRecord, + void *EstablisherFrame, + struct _CONTEXT* ContextRecord, + void *DispatcherContext); + +struct exception_registration +{ + struct exception_registration *prev; + void *handler; +}; struct stack_type { @@ -50,6 +63,19 @@ static VOID __stdcall grt_stack_loop (void *v_stack) { struct stack_type *stack = (struct stack_type *)v_stack; + struct exception_registration er; + struct exception_registration *prev; + + /* Get current handler. */ + asm ("mov %%fs:(0),%0" : "=r" (prev)); + + /* Build regisration. */ + er.prev = prev; + er.handler = ghdl_SEH_handler; + + /* Register. */ + asm ("mov %0,%%fs:(0)" : : "r" (&er)); + while (1) { (*stack->func)(stack->arg); @@ -117,16 +143,87 @@ __ghdl_maybe_return_via_longjump (int val) longjmp (run_env, val); } +extern void grt_stack_error_grow_failed (void); +extern void grt_stack_error_null_access (void); +extern void grt_stack_error_memory_access (void); +extern void grt_overflow_error (void); + +static EXCEPTION_DISPOSITION +ghdl_SEH_handler (struct _EXCEPTION_RECORD* ExceptionRecord, + void *EstablisherFrame, + struct _CONTEXT* ContextRecord, + void *DispatcherContext) +{ + const char *msg = ""; + + switch (ExceptionRecord->ExceptionCode) + { + case EXCEPTION_ACCESS_VIOLATION: + if (ExceptionRecord->ExceptionInformation[1] == 0) + grt_stack_error_null_access (); + else + grt_stack_error_memory_access (); + break; + + case EXCEPTION_FLT_DENORMAL_OPERAND: + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + case EXCEPTION_FLT_INVALID_OPERATION: + case EXCEPTION_FLT_OVERFLOW: + case EXCEPTION_FLT_STACK_CHECK: + case EXCEPTION_FLT_UNDERFLOW: + msg = "floating point error"; + break; + + case EXCEPTION_INT_DIVIDE_BY_ZERO: + msg = "division by 0"; + break; + + case EXCEPTION_INT_OVERFLOW: + grt_overflow_error (); + break; + + case EXCEPTION_STACK_OVERFLOW: + msg = "stack overflow"; + break; + + default: + msg = "unknown reason"; + break; + } + + /* FIXME: is it correct? */ + fprintf (stderr, "exception raised: %s\n", msg); + + __ghdl_maybe_return_via_longjump (1); + return 0; /* This is never reached, avoid compiler warning */ +} + int __ghdl_run_through_longjump (int (*func)(void)) { int res; + struct exception_registration er; + struct exception_registration *prev; + + /* Get current handler. */ + asm ("mov %%fs:(0),%0" : "=r" (prev)); + + /* Build regisration. */ + er.prev = prev; + er.handler = ghdl_SEH_handler; + + /* Register. */ + asm ("mov %0,%%fs:(0)" : : "r" (&er)); run_env_en = 1; res = setjmp (run_env); if (res == 0) res = (*func)(); run_env_en = 0; + + /* Restore. */ + asm ("mov %0,%%fs:(0)" : : "r" (prev)); + return res; } |