Commit 45fbea4f by Arnaud Charlet

[multiple changes]

2015-10-23  Olivier Hainque  <hainque@adacore.com>

	* tracebak.c: Fallback to generic unwinder for gcc-sjlj on x86 &
	x86_64 linux
	* tracebak.c: Rework x86 & x86_64 sections to resort to the
	generic unwinder if __USING_SJLJ_EXCEPTIONS__.

2015-10-23  Javier Miranda  <miranda@adacore.com>

	* sem_util.adb (Check_Function_Writable_Actuals): For function
	calls restrict the check to elementary types, as requested by
	RM 6.4.1(6.15/3)

2015-10-23  Arnaud Charlet  <charlet@adacore.com>

	* exp_unst.adb (Unnest_Subprogram): Suppress initialization on
	Decl_ARECnT since we are taking care of all initializations in
	the generated code.

From-SVN: r229233
parent faaf6d35
2015-10-23 Olivier Hainque <hainque@adacore.com>
* tracebak.c: Fallback to generic unwinder for gcc-sjlj on x86 &
x86_64 linux
* tracebak.c: Rework x86 & x86_64 sections to resort to the
generic unwinder if __USING_SJLJ_EXCEPTIONS__.
2015-10-23 Javier Miranda <miranda@adacore.com>
* sem_util.adb (Check_Function_Writable_Actuals): For function
calls restrict the check to elementary types, as requested by
RM 6.4.1(6.15/3)
2015-10-23 Arnaud Charlet <charlet@adacore.com>
* exp_unst.adb (Unnest_Subprogram): Suppress initialization on
Decl_ARECnT since we are taking care of all initializations in
the generated code.
2015-10-23 Ed Schonberg <schonberg@adacore.com> 2015-10-23 Ed Schonberg <schonberg@adacore.com>
* sem_dim.adb (Analyze_Dimension_Extension_Or_Record_Aggregate): * sem_dim.adb (Analyze_Dimension_Extension_Or_Record_Aggregate):
......
...@@ -1174,6 +1174,9 @@ package body Exp_Unst is ...@@ -1174,6 +1174,9 @@ package body Exp_Unst is
-- Now we can insert the AREC declarations into the body -- Now we can insert the AREC declarations into the body
-- type ARECnT is record .. end record; -- type ARECnT is record .. end record;
-- pragma Suppress_Initialization (ARECnT);
-- Note that we need to set the Suppress_Initialization
-- flag after Decl_ARECnT has been analyzed.
Decl_ARECnT := Decl_ARECnT :=
Make_Full_Type_Declaration (Loc, Make_Full_Type_Declaration (Loc,
...@@ -1262,6 +1265,9 @@ package body Exp_Unst is ...@@ -1262,6 +1265,9 @@ package body Exp_Unst is
Analyze (Decl_ARECn, Suppress => All_Checks); Analyze (Decl_ARECn, Suppress => All_Checks);
Analyze (Decl_ARECnP, Suppress => All_Checks); Analyze (Decl_ARECnP, Suppress => All_Checks);
Set_Suppress_Initialization
(Defining_Identifier (Decl_ARECnT));
if Present (Decl_Assign) then if Present (Decl_Assign) then
Analyze (Decl_Assign, Suppress => All_Checks); Analyze (Decl_Assign, Suppress => All_Checks);
end if; end if;
......
...@@ -2232,11 +2232,26 @@ package body Sem_Util is ...@@ -2232,11 +2232,26 @@ package body Sem_Util is
end if; end if;
if Is_Writable_Actual then if Is_Writable_Actual then
if Contains (Writable_Actuals_List, N) then
-- Skip checking the error in non-elementary types since
-- RM 6.4.1(6.15/3) is restricted to elementary types, but
-- store this actual in Writable_Actuals_List since it is
-- needed to perform checks on other constructs that have
-- arbitrary order of evaluation (for example, aggregates).
if not Is_Elementary_Type (Etype (N)) then
if not Contains (Writable_Actuals_List, N) then
Append_New_Elmt (N, To => Writable_Actuals_List);
end if;
-- Second occurrence of an elementary type writable actual
elsif Contains (Writable_Actuals_List, N) then
-- Report the error on the second occurrence of the -- Report the error on the second occurrence of the
-- identifier. We cannot assume that N is the second -- identifier. We cannot assume that N is the second
-- occurrence, since Traverse_Func walks through Field2 -- occurrence (according to their location in the
-- sources), since Traverse_Func walks through Field2
-- last (see comment in the body of Traverse_Func). -- last (see comment in the body of Traverse_Func).
declare declare
...@@ -2262,9 +2277,12 @@ package body Sem_Util is ...@@ -2262,9 +2277,12 @@ package body Sem_Util is
Error_Node, Id); Error_Node, Id);
return Abandon; return Abandon;
end; end;
end if;
Append_New_Elmt (N, To => Writable_Actuals_List); -- First occurrence of a elementary type writable actual
else
Append_New_Elmt (N, To => Writable_Actuals_List);
end if;
else else
if Identifiers_List = No_Elist then if Identifiers_List = No_Elist then
......
...@@ -415,9 +415,9 @@ struct layout ...@@ -415,9 +415,9 @@ struct layout
window of frame N-1 (positive offset from fp), in which we retrieve the window of frame N-1 (positive offset from fp), in which we retrieve the
saved return address. We then end up with our caller's return address. */ saved return address. We then end up with our caller's return address. */
/*------------------------------- x86 ----------------------------------*/ /*---------------------------- x86 & x86_64 ---------------------------------*/
#elif defined (__i386__) #elif defined (__i386__) || defined (__x86_64__)
#if defined (__WIN32) #if defined (__WIN32)
#include <windows.h> #include <windows.h>
...@@ -428,10 +428,12 @@ struct layout ...@@ -428,10 +428,12 @@ struct layout
#define IS_BAD_PTR(ptr) 0 #define IS_BAD_PTR(ptr) 0
#endif #endif
/* Starting with GCC 4.6, -fomit-frame-pointer is turned on by default for /* Use the dwarf2 unwinder when we expect to have dwarf2 tables at
32-bit x86/Linux as well and DWARF 2 unwind tables are emitted instead. hand. Backtraces will reliably stop on frames missing such tables,
See the x86-64 case below for the drawbacks with this approach. */ but our only alternative is the generic unwinder which requires
#if defined (__linux__) && (__GNUC__ * 10 + __GNUC_MINOR__ > 45) compilation forcing a frame pointer to be reliable. */
#if defined (__linux__) && !defined (__USING_SJLJ_EXCEPTIONS__)
#define USE_GCC_UNWINDER #define USE_GCC_UNWINDER
#else #else
#define USE_GENERIC_UNWINDER #define USE_GENERIC_UNWINDER
...@@ -444,9 +446,9 @@ struct layout ...@@ -444,9 +446,9 @@ struct layout
}; };
#define FRAME_LEVEL 1 #define FRAME_LEVEL 1
/* builtin_frame_address (1) is expected to work on this target, and (0) might /* builtin_frame_address (1) is expected to work on this family of targets,
return the soft stack pointer, which does not designate a location where a and (0) might return the soft stack pointer, which does not designate a
backchain and a return address might be found. */ location where a backchain and a return address might be found. */
#define FRAME_OFFSET(FP) 0 #define FRAME_OFFSET(FP) 0
#define PC_ADJUST -2 #define PC_ADJUST -2
...@@ -478,23 +480,6 @@ struct layout ...@@ -478,23 +480,6 @@ struct layout
|| ((*((ptr) - 1) & 0xff) == 0xff) \ || ((*((ptr) - 1) & 0xff) == 0xff) \
|| (((*(ptr) & 0xd0ff) == 0xd0ff)))) || (((*(ptr) & 0xd0ff) == 0xd0ff))))
/*----------------------------- x86_64 ---------------------------------*/
#elif defined (__x86_64__)
#define USE_GCC_UNWINDER
/* The generic unwinder is not used for this target because it is based
on frame layout assumptions that are not reliable on this target (the
rbp register is very likely used for something else than storing the
frame pointer in optimized code). Hence, we use the GCC unwinder
based on DWARF 2 call frame information, although it has the drawback
of not being able to unwind through frames compiled without DWARF 2
information.
*/
#define PC_ADJUST -2
/* The minimum size of call instructions on this architecture is 2 bytes */
/*----------------------------- ia64 ---------------------------------*/ /*----------------------------- ia64 ---------------------------------*/
#elif defined (__ia64__) && (defined (__linux__) || defined (__hpux__)) #elif defined (__ia64__) && (defined (__linux__) || defined (__hpux__))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment