From dcb0507d1791411b9969823e9025c97855a77e6e Mon Sep 17 00:00:00 2001 From: charlet Date: Fri, 13 Nov 2015 11:14:34 +0000 Subject: [PATCH] 2015-11-13 Eric Botcazou * init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC, fix CFI and add return sequence. 2015-11-13 Ed Schonberg * exp_fixd.adb (Expand_Convert_Float_To_Fixed): If the conversion comes from an attribute reference 'Round, the operation must round and not truncate. * sem_res.adb, sem_ch6.adb: Minor editing. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230302 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ada/ChangeLog | 12 ++++++++++++ gcc/ada/exp_fixd.adb | 17 +++++++++++++++-- gcc/ada/init.c | 35 +++++++++++++++++++++++++---------- gcc/ada/sem_ch6.adb | 2 +- gcc/ada/sem_res.adb | 2 +- 5 files changed, 54 insertions(+), 14 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index de1a91d..22fa12f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,15 @@ +2015-11-13 Eric Botcazou + + * init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC, + fix CFI and add return sequence. + +2015-11-13 Ed Schonberg + + * exp_fixd.adb (Expand_Convert_Float_To_Fixed): If the conversion + comes from an attribute reference 'Round, the operation must + round and not truncate. + * sem_res.adb, sem_ch6.adb: Minor editing. + 2015-11-12 Philippe Gil * g-debpoo.adb (Print_Address): print address in hexadecimal as diff --git a/gcc/ada/exp_fixd.adb b/gcc/ada/exp_fixd.adb index de4a60a..78f8e72 100644 --- a/gcc/ada/exp_fixd.adb +++ b/gcc/ada/exp_fixd.adb @@ -37,6 +37,7 @@ with Sem_Eval; use Sem_Eval; with Sem_Res; use Sem_Res; with Sem_Util; use Sem_Util; with Sinfo; use Sinfo; +with Snames; use Snames; with Stand; use Stand; with Tbuild; use Tbuild; with Uintp; use Uintp; @@ -1695,6 +1696,7 @@ package body Exp_Fixd is Expr : constant Node_Id := Expression (N); Result_Type : constant Entity_Id := Etype (N); Small : constant Ureal := Small_Value (Result_Type); + Truncate : Boolean; begin -- Optimize small = 1, where we can avoid the multiply completely @@ -1704,14 +1706,25 @@ package body Exp_Fixd is -- Normal case where multiply is required -- Rounding is truncating for decimal fixed point types only, - -- see RM 4.6(29). + -- see RM 4.6(29), except if the conversion comes from an attribute + -- reference 'Round (RM 3.5.10 (14)): The attribute is implemented + -- by means of a conversion that must round. else + if Is_Decimal_Fixed_Point_Type (Result_Type) then + Truncate := Nkind (Original_Node (N)) /= N_Attribute_Reference + or else Get_Attribute_Id (Attribute_Name (Original_Node (N))) + /= Attribute_Round; + else + Truncate := False; + end if; + Set_Result (N, Build_Multiply (N, Fpt_Value (Expr), Real_Literal (N, Ureal_1 / Small)), - Rng_Check, Trunc => Is_Decimal_Fixed_Point_Type (Result_Type)); + Rng_Check, + Trunc => Truncate); end if; end Expand_Convert_Float_To_Fixed; diff --git a/gcc/ada/init.c b/gcc/ada/init.c index 4acf1a2..65761b0 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -2301,8 +2301,8 @@ char __gnat_alternate_stack[32 * 1024]; /* 1 * MINSIGSTKSZ */ #include /* Trampoline inserted before raising the exception. It modifies the - stack so that PROC (D, M) looks to be called from the fault point. Note - that LR may be incorrectly set. */ + stack so that it looks to be called directly from the fault point. + Note that LR may be incorrectly restored by unwinding. */ void __gnat_sigtramp (struct Exception_Data *d, const char *m, mcontext_t ctxt, void (*proc)(struct Exception_Data *, const char *)); @@ -2323,17 +2323,19 @@ asm("\n" " ldp q12, q13, [x2, #480]\n" " ldp q14, q15, [x2, #512]\n" /* Read FP from mcontext. */ -" ldp fp, lr, [x2, #248]\n" +" ldr fp, [x2, #248]\n" /* Read SP and PC from mcontext. */ -" ldp x6, x7, [x2, #264]\n" -" add lr, x7, #1\n" +" ldp x6, lr, [x2, #264]\n" " mov sp, x6\n" - /* Create a standard frame. */ + /* Create a minimal frame. */ " stp fp, lr, [sp, #-16]!\n" -" .cfi_def_cfa w29, 16\n" -" .cfi_offset w30, -8\n" -" .cfi_offset w29, -16\n" -" br x3\n" +" .cfi_def_cfa_offset 16\n" +" .cfi_offset 30, -8\n" +" .cfi_offset 29, -16\n" +" blr x3\n" + /* Release our frame and return (should never get here!). */ +" ldp fp, lr, [sp, #16]\n" +" ret\n" " .cfi_endproc\n" ); #endif @@ -2416,6 +2418,9 @@ __gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED, uc->uc_mcontext->__ss.__rbx = uc->uc_mcontext->__ss.__rdx; uc->uc_mcontext->__ss.__rdx = t; } +#elif defined(__arm64__) + ucontext_t *uc = (ucontext_t *)ucontext; + uc->uc_mcontext->__ss.__pc++; #endif } @@ -2447,6 +2452,16 @@ __gnat_error_handler (int sig, siginfo_t *si, void *ucontext) syscall (SYS_sigreturn, NULL, UC_RESET_ALT_STACK); #ifdef __arm64__ + /* ??? Temporary kludge to make stack checking work. The problem is + that the trampoline doesn't restore LR and, consequently, doesn't + make it possible to unwind past an interrupted frame which hasn"t + saved LR on the stack yet. */ + if (__gnat_is_stack_guard ((unsigned long)si->si_addr)) + { + ucontext_t *uc = (ucontext_t *)ucontext; + uc->uc_mcontext->__ss.__pc = uc->uc_mcontext->__ss.__lr; + } + /* On arm64, use a trampoline so that the unwinder won't see the signal frame. */ __gnat_sigtramp (exception, msg, diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index a40baa5..a9a1a57 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -7914,7 +7914,7 @@ package body Sem_Ch6 is when N_Parameter_Association => return - Chars (Selector_Name (E1)) = Chars (Selector_Name (E2)) + Chars (Selector_Name (E1)) = Chars (Selector_Name (E2)) and then FCE (Explicit_Actual_Parameter (E1), Explicit_Actual_Parameter (E2)); diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 049f2a2..f6d71ce 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -1635,7 +1635,7 @@ package body Sem_Res is end if; if Nkind (Old_Sec) = N_Parameter_Association then - if Chars (Selector_Name (Old_Sec)) = + if Chars (Selector_Name (Old_Sec)) = Chars (First_Entity (Op_Id)) then Rewrite (Explicit_Actual_Parameter (Old_Sec), -- 2.7.4