[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 13 Nov 2015 11:14:34 +0000 (12:14 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 13 Nov 2015 11:14:34 +0000 (12:14 +0100)
2015-11-13  Eric Botcazou  <ebotcazou@adacore.com>

* init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC,
fix CFI and add return sequence.

2015-11-13  Ed Schonberg  <schonberg@adacore.com>

* 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.

From-SVN: r230302

gcc/ada/ChangeLog
gcc/ada/exp_fixd.adb
gcc/ada/init.c
gcc/ada/sem_ch6.adb
gcc/ada/sem_res.adb

index de1a91da2fe1acb8bb76360ab53b5eb31f9e6632..22fa12f8083a479a84735a5e8e57aa57a8bfd2c5 100644 (file)
@@ -1,3 +1,15 @@
+2015-11-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC,
+       fix CFI and add return sequence.
+
+2015-11-13  Ed Schonberg  <schonberg@adacore.com>
+
+       * 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  <gil@adacore.com>
 
        * g-debpoo.adb (Print_Address): print address in hexadecimal as
index de4a60a8b476e9112b4bc4999f074efb9a0d4b76..78f8e724c4f09eb76801fca0c37767514f620883 100644 (file)
@@ -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;
 
index 4acf1a290157aad9ea0b0fac7d6d03a2d814cee0..65761b01873358a8dcfabd9e13705d90cd7cf559 100644 (file)
@@ -2301,8 +2301,8 @@ char __gnat_alternate_stack[32 * 1024]; /* 1 * MINSIGSTKSZ */
 #include <sys/ucontext.h>
 
 /* 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,
index a40baa59292c77eedfe2b324271b29b47fd9870f..a9a1a57dbfdbaf1f1a892f06fdeb0e7d3bd98687 100644 (file)
@@ -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));
 
index 049f2a28bf961fa5ed682cf560cf2174bf7814ec..f6d71ce98c49c32e56284888d95a2579f7a82a57 100644 (file)
@@ -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),