aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2015-11-13 12:14:34 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2015-11-13 12:14:34 +0100
commit7dae9ca0a92cd1c1d03f9a37271e47a84c6c79ef (patch)
tree64490512a4d76256ca385ffe7e6abe4cc2894a04 /gcc/ada
parent9babab64280b4e2c86be70896ba73b11e1908663 (diff)
downloadgcc-7dae9ca0a92cd1c1d03f9a37271e47a84c6c79ef.zip
gcc-7dae9ca0a92cd1c1d03f9a37271e47a84c6c79ef.tar.gz
gcc-7dae9ca0a92cd1c1d03f9a37271e47a84c6c79ef.tar.bz2
[multiple changes]
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
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog12
-rw-r--r--gcc/ada/exp_fixd.adb17
-rw-r--r--gcc/ada/init.c35
-rw-r--r--gcc/ada/sem_ch6.adb2
-rw-r--r--gcc/ada/sem_res.adb2
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 <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
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 <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,
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),