aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2012-07-09 12:46:00 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2012-07-09 12:46:00 +0200
commitb3f532ce538f8fc13b7af7cc73b94aa43bb03669 (patch)
tree5b16f576baa23d7e0de6a273e17513f322081aef
parent31821c0f0338034cb09d16029891d96026d7acee (diff)
downloadgcc-b3f532ce538f8fc13b7af7cc73b94aa43bb03669.zip
gcc-b3f532ce538f8fc13b7af7cc73b94aa43bb03669.tar.gz
gcc-b3f532ce538f8fc13b7af7cc73b94aa43bb03669.tar.bz2
[multiple changes]
2012-07-09 Tristan Gingold <gingold@adacore.com> * seh_init.c (__gnat_SEH_error_handler): On Win64 and SEH, return for unknown exceptions. * raise-gcc.c (__gnat_personality_seh0): Call __gnat_SEH_error_handler. 2012-07-09 Joel Brobecker <brobecker@adacore.com brobecker> * exp_dbug.ads (No_Dollar_In_Label): Delete. 2012-07-09 Vincent Pucci <pucci@adacore.com> * sem_ch13.adb (Check_Overloaded_Name): New routine. 2012-07-09 Vincent Pucci <pucci@adacore.com> * freeze.adb (Freeze_Record_Type): Analyze the delayed aspects of the components in a record type. 2012-07-09 Pascal Obry <obry@adacore.com> * prj-util.ads: Minor reformatting. From-SVN: r189369
-rw-r--r--gcc/ada/ChangeLog23
-rw-r--r--gcc/ada/exp_dbug.ads10
-rw-r--r--gcc/ada/freeze.adb28
-rw-r--r--gcc/ada/prj-util.ads22
-rw-r--r--gcc/ada/raise-gcc.c11
-rw-r--r--gcc/ada/seh_init.c8
-rw-r--r--gcc/ada/sem_ch13.adb63
7 files changed, 121 insertions, 44 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 9784e2a..3d7f36b 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,28 @@
2012-07-09 Tristan Gingold <gingold@adacore.com>
+ * seh_init.c (__gnat_SEH_error_handler): On Win64 and SEH,
+ return for unknown exceptions.
+ * raise-gcc.c (__gnat_personality_seh0): Call __gnat_SEH_error_handler.
+
+2012-07-09 Joel Brobecker <brobecker@adacore.com brobecker>
+
+ * exp_dbug.ads (No_Dollar_In_Label): Delete.
+
+2012-07-09 Vincent Pucci <pucci@adacore.com>
+
+ * sem_ch13.adb (Check_Overloaded_Name): New routine.
+
+2012-07-09 Vincent Pucci <pucci@adacore.com>
+
+ * freeze.adb (Freeze_Record_Type): Analyze the delayed aspects of the
+ components in a record type.
+
+2012-07-09 Pascal Obry <obry@adacore.com>
+
+ * prj-util.ads: Minor reformatting.
+
+2012-07-09 Tristan Gingold <gingold@adacore.com>
+
* raise-gcc.c (db_indent): Simplify style, improve comments.
Remove !IN_RTS part (dead).
diff --git a/gcc/ada/exp_dbug.ads b/gcc/ada/exp_dbug.ads
index ac722d7..0290168 100644
--- a/gcc/ada/exp_dbug.ads
+++ b/gcc/ada/exp_dbug.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 1996-2010, Free Software Foundation, Inc. --
+-- Copyright (C) 1996-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -411,14 +411,6 @@ package Exp_Dbug is
-- Conversion between Entities and External Names --
----------------------------------------------------
- No_Dollar_In_Label : constant Boolean := True;
- -- True iff the target does not allow dollar signs ("$") in external names
- -- ??? We want to migrate all platforms to use the same convention. As a
- -- first step, we force this constant to always be True. This constant will
- -- eventually be deleted after we have verified that the migration does not
- -- cause any unforeseen adverse impact. We chose "__" because it is
- -- supported on all platforms, which is not the case of "$".
-
procedure Get_External_Name
(Entity : Entity_Id;
Has_Suffix : Boolean);
diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index 350a1b0..cee956b 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -1906,8 +1906,34 @@ package body Freeze is
Comp := First_Entity (Rec);
Prev := Empty;
while Present (Comp) loop
+ -- Deal with delayed aspect specifications for components. The
+ -- analysis of the aspect is required to be delayed to the freeze
+ -- point, thus we analyze the pragma or attribute definition
+ -- clause in the tree at this point. We also analyze the aspect
+ -- specification node at the freeze point when the aspect doesn't
+ -- correspond to pragma/attribute definition clause.
- -- First handle the component case
+ if Ekind (Comp) = E_Component
+ and then Has_Delayed_Aspects (Comp)
+ then
+ Push_Scope (Rec);
+
+ -- The visibility to the discriminants must be restored in
+ -- order to properly analyze the aspects.
+
+ if Has_Discriminants (Rec) then
+ Install_Discriminants (Rec);
+ Analyze_Aspects_At_Freeze_Point (Comp);
+ Uninstall_Discriminants (Rec);
+
+ else
+ Analyze_Aspects_At_Freeze_Point (Comp);
+ end if;
+
+ Pop_Scope;
+ end if;
+
+ -- Handle the component and discriminant case
if Ekind (Comp) = E_Component
or else Ekind (Comp) = E_Discriminant
diff --git a/gcc/ada/prj-util.ads b/gcc/ada/prj-util.ads
index 89a6491..bdf2948 100644
--- a/gcc/ada/prj-util.ads
+++ b/gcc/ada/prj-util.ads
@@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
--- Copyright (C) 2001-2011, Free Software Foundation, Inc. --
+-- Copyright (C) 2001-2012, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -60,8 +60,8 @@ package Prj.Util is
-- Describe parameters???
procedure Duplicate
- (This : in out Name_List_Index;
- Shared : Shared_Project_Tree_Data_Access);
+ (This : in out Name_List_Index;
+ Shared : Shared_Project_Tree_Data_Access);
-- Duplicate a name list
function Value_Of
@@ -203,14 +203,14 @@ package Prj.Util is
-- the flag Source_Info_File_Exists to True for the tree.
type Source_Info_Data is record
- Project : Name_Id;
- Language : Name_Id;
- Kind : Source_Kind;
- Display_Path_Name : Name_Id;
- Path_Name : Name_Id;
- Unit_Name : Name_Id := No_Name;
- Index : Int := 0;
- Naming_Exception : Naming_Exception_Type := No;
+ Project : Name_Id;
+ Language : Name_Id;
+ Kind : Source_Kind;
+ Display_Path_Name : Name_Id;
+ Path_Name : Name_Id;
+ Unit_Name : Name_Id := No_Name;
+ Index : Int := 0;
+ Naming_Exception : Naming_Exception_Type := No;
end record;
-- Data read from a source info file for a single source
diff --git a/gcc/ada/raise-gcc.c b/gcc/ada/raise-gcc.c
index 53a56e1..0ef580b 100644
--- a/gcc/ada/raise-gcc.c
+++ b/gcc/ada/raise-gcc.c
@@ -1182,11 +1182,22 @@ __gnat_Unwind_ForcedUnwind (_Unwind_Exception *e,
#endif /* __USING_SJLJ_EXCEPTIONS__ */
#ifdef __SEH__
+
+#define STATUS_USER_DEFINED (1U << 29)
+EXCEPTION_DISPOSITION __gnat_SEH_error_handler
+ (struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);
+
EXCEPTION_DISPOSITION
__gnat_personality_seh0 (PEXCEPTION_RECORD ms_exc, void *this_frame,
PCONTEXT ms_orig_context,
PDISPATCHER_CONTEXT ms_disp)
{
+ /* Possibly transform run-time errors into Ada exceptions. As a small
+ optimization, we call __gnat_SEH_error_handler only on non-user
+ exceptions. */
+ if (!(ms_exc->ExceptionCode & STATUS_USER_DEFINED))
+ __gnat_SEH_error_handler (ms_exc, this_frame, ms_orig_context, ms_disp);
+
return _GCC_specific_handler (ms_exc, this_frame, ms_orig_context,
ms_disp, __gnat_personality_imp);
}
diff --git a/gcc/ada/seh_init.c b/gcc/ada/seh_init.c
index fa5310f..84c5d3b 100644
--- a/gcc/ada/seh_init.c
+++ b/gcc/ada/seh_init.c
@@ -178,9 +178,15 @@ __gnat_SEH_error_handler (struct _EXCEPTION_RECORD* ExceptionRecord,
msg = "EXCEPTION_STACK_OVERFLOW";
break;
- default:
+ default:
+#if defined (_WIN64) && defined (__SEH__)
+ /* On Windows x64, do not transform other exception as they could
+ be caught by user (when SEH is used to propagate exceptions). */
+ return;
+#else
exception = &program_error;
msg = "unhandled signal";
+#endif
}
#if ! defined (_WIN64)
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 4f2c685..8deb37b 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -6350,25 +6350,18 @@ package body Sem_Ch13 is
-- but Expression (Ident) is a preanalyzed copy of the expression,
-- preanalyzed just after the freeze point.
- begin
- -- Case of aspects Dimension, Dimension_System and Synchronization
+ procedure Check_Overloaded_Name;
+ -- For aspects whose expression is simply a name, this routine checks if
+ -- the name is overloaded or not. If so, it verifies there is an
+ -- interpretation that matches the entity obtained at the freeze point,
+ -- otherwise the compiler complains.
- if A_Id = Aspect_Synchronization then
- return;
-
- -- Case of stream attributes, just have to compare entities. However,
- -- the expression is just a name (possibly overloaded), and there may
- -- be stream operations declared for unrelated types, so we just need
- -- to verify that one of these interpretations is the one available at
- -- at the freeze point.
-
- elsif A_Id = Aspect_Input or else
- A_Id = Aspect_Output or else
- A_Id = Aspect_Read or else
- A_Id = Aspect_Write
- then
- Analyze (End_Decl_Expr);
+ ---------------------------
+ -- Check_Overloaded_Name --
+ ---------------------------
+ procedure Check_Overloaded_Name is
+ begin
if not Is_Overloaded (End_Decl_Expr) then
Err := Entity (End_Decl_Expr) /= Entity (Freeze_Expr);
@@ -6391,6 +6384,29 @@ package body Sem_Ch13 is
end loop;
end;
end if;
+ end Check_Overloaded_Name;
+
+ -- Start of processing for Check_Aspect_At_End_Of_Declarations
+
+ begin
+ -- Case of aspects Dimension, Dimension_System and Synchronization
+
+ if A_Id = Aspect_Synchronization then
+ return;
+
+ -- Case of stream attributes, just have to compare entities. However,
+ -- the expression is just a name (possibly overloaded), and there may
+ -- be stream operations declared for unrelated types, so we just need
+ -- to verify that one of these interpretations is the one available at
+ -- at the freeze point.
+
+ elsif A_Id = Aspect_Input or else
+ A_Id = Aspect_Output or else
+ A_Id = Aspect_Read or else
+ A_Id = Aspect_Write
+ then
+ Analyze (End_Decl_Expr);
+ Check_Overloaded_Name;
elsif A_Id = Aspect_Variable_Indexing or else
A_Id = Aspect_Constant_Indexing or else
@@ -6402,16 +6418,19 @@ package body Sem_Ch13 is
Set_Is_Frozen (Ent, False);
Analyze (End_Decl_Expr);
- Analyze (Aspect_Rep_Item (ASN));
Set_Is_Frozen (Ent, True);
-- If the end of declarations comes before any other freeze
-- point, the Freeze_Expr is not analyzed: no check needed.
- Err :=
- Analyzed (Freeze_Expr)
- and then not In_Instance
- and then Entity (End_Decl_Expr) /= Entity (Freeze_Expr);
+ if Analyzed (Freeze_Expr)
+ and then not In_Instance
+ then
+ Check_Overloaded_Name;
+
+ else
+ Err := False;
+ end if;
-- All other cases