diff options
Diffstat (limited to 'translate/grt/grt-signals.adb')
-rw-r--r-- | translate/grt/grt-signals.adb | 63 |
1 files changed, 22 insertions, 41 deletions
diff --git a/translate/grt/grt-signals.adb b/translate/grt/grt-signals.adb index 590aced..d939a97 100644 --- a/translate/grt/grt-signals.adb +++ b/translate/grt/grt-signals.adb @@ -84,7 +84,7 @@ package body Grt.Signals is (Mode : Mode_Type; Init_Val : Value_Union; Mode_Sig : Mode_Signal_Type; - Resolv_Proc : System.Address; + Resolv_Proc : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -95,7 +95,7 @@ package body Grt.Signals is Sig_Table.Increment_Last; if Current_Resolv = null then - if Resolv_Proc /= Null_Address then + if Resolv_Proc /= null then Resolv := new Resolved_Signal_Type' (Resolv_Proc => Resolv_Proc, Resolv_Inst => Resolv_Inst, @@ -106,7 +106,7 @@ package body Grt.Signals is Resolv := null; end if; else - if Resolv_Proc /= Null_Address then + if Resolv_Proc /= null then -- Only one resolution function is allowed! Internal_Error ("create_signal"); end if; @@ -209,7 +209,7 @@ package body Grt.Signals is end if; end Ghdl_Signal_Merge_Rti; - procedure Ghdl_Signal_Create_Resolution (Proc : System.Address; + procedure Ghdl_Signal_Create_Resolution (Proc : Resolver_Acc; Instance : System.Address; Sig : System.Address; Nbr_Sig : Ghdl_Index_Type) @@ -815,7 +815,7 @@ package body Grt.Signals is function Ghdl_Create_Signal_B2 (Init_Val : Ghdl_B2; - Resolv_Func : System.Address; + Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -886,7 +886,7 @@ package body Grt.Signals is function Ghdl_Create_Signal_E8 (Init_Val : Ghdl_E8; - Resolv_Func : System.Address; + Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -957,7 +957,7 @@ package body Grt.Signals is function Ghdl_Create_Signal_E32 (Init_Val : Ghdl_E32; - Resolv_Func : System.Address; + Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -1030,7 +1030,7 @@ package body Grt.Signals is function Ghdl_Create_Signal_I32 (Init_Val : Ghdl_I32; - Resolv_Func : System.Address; + Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -1103,7 +1103,7 @@ package body Grt.Signals is function Ghdl_Create_Signal_I64 (Init_Val : Ghdl_I64; - Resolv_Func : System.Address; + Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -1176,7 +1176,7 @@ package body Grt.Signals is function Ghdl_Create_Signal_F64 (Init_Val : Ghdl_F64; - Resolv_Func : System.Address; + Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) return Ghdl_Signal_Ptr is @@ -1330,7 +1330,7 @@ package body Grt.Signals is -- Note: bit and boolean are both mode_b2. Res := Create_Signal (Mode_B2, Value_Union'(Mode => Mode_B2, B2 => True), - Mode, Null_Address, Null_Address); + Mode, null, Null_Address); Last_Implicit_Signal := Res; @@ -1400,7 +1400,7 @@ package body Grt.Signals is (To_Ghdl_Rti_Access (Guard_Rti'Address)); Res := Create_Signal (Mode_B2, Value_Union'(Mode => Mode_B2, B2 => Proc.all (This)), - Mode_Guard, Null_Address, Null_Address); + Mode_Guard, null, Null_Address); Res.S.Guard_Func := Proc; Res.S.Guard_Instance := This; Last_Implicit_Signal := Res; @@ -1420,7 +1420,7 @@ package body Grt.Signals is Res : Ghdl_Signal_Ptr; begin Res := Create_Signal (Sig.Mode, Sig.Value, - Mode_Delayed, Null_Address, Null_Address); + Mode_Delayed, null, Null_Address); Res.S.Time := Val; if Val > 0 then Res.Flink := Future_List; @@ -1744,25 +1744,6 @@ package body Grt.Signals is -- return Length; -- end Get_Nbr_Non_Null_Source; - type Resolver_Acc is access procedure - (Instance : System.Address; - Val : System.Address; - Bool_Vec : System.Address; - Vec_Len : Ghdl_Index_Type; - Nbr_Drv : Ghdl_Index_Type; - Nbr_Ports : Ghdl_Index_Type); - - -- On some platforms, GNAT use a descriptor (instead of a trampoline) for - -- nested subprograms. This descriptor contains the address of the - -- subprogram and the address of the chain. An unaligned pointer to this - -- descriptor (address + 1) is then used for 'Access, and every indirect - -- call check for unaligned address. - -- - -- Disable this feature (as a resolver is never a nested subprogram), so - -- code generated by ghdl is compatible with ghdl runtimes built with - -- gnat. - pragma Convention (C, Resolver_Acc); - function To_Resolver_Acc is new Ada.Unchecked_Conversion (Source => System.Address, Target => Resolver_Acc); @@ -1811,13 +1792,12 @@ package body Grt.Signals is end if; -- Call the procedure. - To_Resolver_Acc (Resolv.Resolv_Proc).all - (Resolv.Resolv_Inst, - Resolv.Resolv_Ptr, - Vec'Address, - Length, - Sig.S.Nbr_Drivers, - Sig.Nbr_Ports); + Resolv.Resolv_Proc.all (Resolv.Resolv_Inst, + Resolv.Resolv_Ptr, + Vec'Address, + Length, + Sig.S.Nbr_Drivers, + Sig.Nbr_Ports); end Compute_Resolved_Signal; type Conversion_Func_Acc is access procedure (Instance : System.Address); @@ -2559,8 +2539,9 @@ package body Grt.Signals is if Resolv /= null and then Resolv.Sig_Range.First = I and then Resolv.Sig_Range.Last = I - and then (Resolv.Resolv_Proc - = Ieee_Std_Logic_1164_Resolved_Resolv_Ptr) + and then + (Resolv.Resolv_Proc + = To_Resolver_Acc (Ieee_Std_Logic_1164_Resolved_Resolv_Ptr)) and then Sig.S.Nbr_Drivers + Sig.Nbr_Ports <= 1 then -- Optimization: remove resolver if there is at most one |