aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Quinot <quinot@adacore.com>2013-01-02 10:45:00 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2013-01-02 11:45:00 +0100
commit7130729aa07512f6349dc85d86454cdb6c152b38 (patch)
treecbd214f3fa25a835e09a2646253440c7906ea8c4
parent8ed7930e45b8232ed637f207fc48222112742a51 (diff)
downloadgcc-7130729aa07512f6349dc85d86454cdb6c152b38.zip
gcc-7130729aa07512f6349dc85d86454cdb6c152b38.tar.gz
gcc-7130729aa07512f6349dc85d86454cdb6c152b38.tar.bz2
par_sco.adb: Add SCO generation for task types and single task declarations.
2013-01-02 Thomas Quinot <quinot@adacore.com> * par_sco.adb: Add SCO generation for task types and single task declarations. 2013-01-02 Thomas Quinot <quinot@adacore.com> * fe.h, gnat1drv.adb: Revert previous change. 2013-01-02 Thomas Quinot <quinot@adacore.com> * get_scos.adb: When adding an instance table entry for a non-nested instantiation, make sure the Enclosing_Instance is correctly set to 0. From-SVN: r194793
-rw-r--r--gcc/ada/ChangeLog10
-rw-r--r--gcc/ada/fe.h2
-rw-r--r--gcc/ada/gcc-interface/gigi.h2
-rw-r--r--gcc/ada/gcc-interface/misc.c17
-rw-r--r--gcc/ada/gcc-interface/trans.c10
-rw-r--r--gcc/ada/get_scos.adb10
-rw-r--r--gcc/ada/gnat1drv.adb7
-rw-r--r--gcc/ada/par_sco.adb80
8 files changed, 78 insertions, 60 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 17ddd26..15f39e1 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,11 @@
+2013-01-02 Thomas Quinot <quinot@adacore.com>
+
+ * par_sco.adb: Add SCO generation for task types and single
+ task declarations.
+ * get_scos.adb: When adding an instance table entry for a
+ non-nested instantiation, make sure the Enclosing_Instance is
+ correctly set to 0.
+
2013-01-02 Hristian Kirtchev <kirtchev@adacore.com>
* sem_attr.adb (Analyze_Attribute): Skip the special _Parent
@@ -12,8 +20,6 @@
* switch-c.adb, fe.h, back_end.adb: Enable generation of instantiation
information in debug info unconditionally when using -fdump-scos,
instead of relying on a separate command line switch -fdebug-instances.
- * gcc-interface/gigi.h, gcc-interface/misc.c
- (set_flag_debug_instances): New subprogram.
* gcc-interface/Make-lang.in: Update dependencies.
2013-01-02 Ed Schonberg <schonberg@adacore.com>
diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h
index 6c752e8..552a8bf 100644
--- a/gcc/ada/fe.h
+++ b/gcc/ada/fe.h
@@ -182,6 +182,7 @@ extern Boolean In_Same_Source_Unit (Node_Id, Node_Id);
#define Exception_Extra_Info opt__exception_extra_info
#define Exception_Locations_Suppressed opt__exception_locations_suppressed
#define Exception_Mechanism opt__exception_mechanism
+#define Generate_SCO_Instance_Table opt__generate_sco_instance_table
#define Global_Discard_Names opt__global_discard_names
typedef enum {Setjmp_Longjmp, Back_End_Exceptions} Exception_Mechanism_Type;
@@ -190,6 +191,7 @@ extern Boolean Back_Annotate_Rep_Info;
extern Boolean Exception_Extra_Info;
extern Boolean Exception_Locations_Suppressed;
extern Exception_Mechanism_Type Exception_Mechanism;
+extern Boolean Generate_SCO_Instance_Table;
extern Boolean Global_Discard_Names;
/* restrict: */
diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h
index 28bf938..1d0d2fb 100644
--- a/gcc/ada/gcc-interface/gigi.h
+++ b/gcc/ada/gcc-interface/gigi.h
@@ -255,8 +255,6 @@ extern void gigi (Node_Id gnat_root, int max_gnat_node,
Entity_Id standard_exception_type,
Int gigi_operating_mode);
-extern void set_flag_debug_instances (int);
-
#ifdef __cplusplus
}
#endif
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index 4c5bd32..2fd2743 100644
--- a/gcc/ada/gcc-interface/misc.c
+++ b/gcc/ada/gcc-interface/misc.c
@@ -809,23 +809,6 @@ gnat_eh_personality (void)
return gnat_eh_personality_decl;
}
-/* Set flag_debug_instances. */
-
-void
-set_flag_debug_instances (int val ATTRIBUTE_UNUSED)
-{
-#if 0
- /* Temporary compatibility shim???
- This should be enabled when back-end support for instance info in
- DWARF is merged at the FSF. */
- flag_debug_instances = val;
-#else
- /* Until then, forcibly turn off SCO instance table generation. */
- extern Boolean opt__generate_sco_instance_table;
- opt__generate_sco_instance_table = False;
-#endif
-}
-
/* Initialize language-specific bits of tree_contains_struct. */
static void
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 74133a4..4d21d2c 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -302,6 +302,16 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED,
type_annotate_only = (gigi_operating_mode == 1);
+#if 0
+ if (Generate_SCO_Instance_Table)
+ flag_debug_instances = 1;
+#else
+ /* Temporary compatibility shim: FSF head back-end does not support instance
+ based debug info discriminators, so disable the generation of the SCO
+ instance table. ??? */
+ Generate_SCO_Instance_Table = False;
+#endif
+
for (i = 0; i < number_file; i++)
{
/* Use the identifier table to make a permanent copy of the filename as
diff --git a/gcc/ada/get_scos.adb b/gcc/ada/get_scos.adb
index 170f5b5..ca90a85 100644
--- a/gcc/ada/get_scos.adb
+++ b/gcc/ada/get_scos.adb
@@ -205,7 +205,7 @@ procedure Get_SCOs is
Nam : Name_Id;
--- Start of processing for Get_Scos
+-- Start of processing for Get_SCOs
begin
SCOs.Initialize;
@@ -265,7 +265,9 @@ begin
pragma Assert (C = '|');
Get_Source_Location (SIE.Inst_Loc);
- if not At_EOL then
+ if At_EOL then
+ SIE.Enclosing_Instance := 0;
+ else
Skip_Spaces;
SIE.Enclosing_Instance :=
SCO_Instance_Index (Get_Int);
@@ -342,6 +344,10 @@ begin
Key := '>';
Typ := Getc;
+ -- Sanity check on dominance marker type indication
+
+ pragma Assert (Typ in 'A' .. 'Z');
+
when '1' .. '9' =>
Typ := ' ';
diff --git a/gcc/ada/gnat1drv.adb b/gcc/ada/gnat1drv.adb
index b2e0647..6e90c2b 100644
--- a/gcc/ada/gnat1drv.adb
+++ b/gcc/ada/gnat1drv.adb
@@ -109,9 +109,6 @@ procedure Gnat1drv is
----------------------------
procedure Adjust_Global_Switches is
- procedure set_flag_debug_instances (Val : Int);
- pragma Import (C, set_flag_debug_instances);
-
begin
-- Debug flag -gnatd.I is a synonym for Generate_SCIL and requires code
-- generation.
@@ -576,10 +573,6 @@ procedure Gnat1drv is
end if;
end if;
- -- Set back-end flag_debug_instances from corresponding front-end flag
-
- set_flag_debug_instances (Boolean'Pos (Generate_SCO_Instance_Table));
-
-- Finally capture adjusted value of Suppress_Options as the initial
-- value for Scope_Suppress, which will be modified as we move from
-- scope to scope (by Suppress/Unsuppress/Overflow_Checks pragmas).
diff --git a/gcc/ada/par_sco.adb b/gcc/ada/par_sco.adb
index 8062563..c272d02 100644
--- a/gcc/ada/par_sco.adb
+++ b/gcc/ada/par_sco.adb
@@ -154,18 +154,21 @@ package body Par_SCO is
-- Process L, a list of statements or declarations dominated by D.
-- If P is present, it is processed as though it had been prepended to L.
+ -- The following Traverse_* routines perform appropriate calls to
+ -- Traverse_Declarations_Or_Statements to traverse specific node kinds
+
procedure Traverse_Generic_Package_Declaration (N : Node_Id);
procedure Traverse_Handled_Statement_Sequence
(N : Node_Id;
D : Dominant_Info := No_Dominant);
- procedure Traverse_Package_Body (N : Node_Id);
- procedure Traverse_Package_Declaration (N : Node_Id);
- procedure Traverse_Protected_Body (N : Node_Id);
- procedure Traverse_Protected_Definition (N : Node_Id);
+ procedure Traverse_Package_Body (N : Node_Id);
+ procedure Traverse_Package_Declaration (N : Node_Id);
procedure Traverse_Subprogram_Or_Task_Body
(N : Node_Id;
D : Dominant_Info := No_Dominant);
- -- Traverse the corresponding construct, generating SCO table entries
+
+ procedure Traverse_Sync_Definition (N : Node_Id);
+ -- Traverse a protected definition or task definition
procedure Write_SCOs_To_ALI_File is new Put_SCOs;
-- Write SCO information to the ALI file using routines in Lib.Util
@@ -958,9 +961,7 @@ package body Par_SCO is
N_Task_Body |
N_Generic_Instantiation =>
- Traverse_Declarations_Or_Statements
- (L => No_List,
- P => Lu);
+ Traverse_Declarations_Or_Statements (L => No_List, P => Lu);
when others =>
@@ -1356,14 +1357,17 @@ package body Par_SCO is
N_Timed_Entry_Call |
N_Conditional_Entry_Call |
N_Asynchronous_Select |
- N_Single_Protected_Declaration =>
+ N_Single_Protected_Declaration |
+ N_Single_Task_Declaration =>
T := F;
- when N_Protected_Type_Declaration =>
+ when N_Protected_Type_Declaration | N_Task_Type_Declaration =>
if Has_Aspects (N) then
To_Node := Last (Aspect_Specifications (N));
+
elsif Present (Discriminant_Specifications (N)) then
To_Node := Last (Discriminant_Specifications (N));
+
else
To_Node := Defining_Identifier (N);
end if;
@@ -1550,7 +1554,7 @@ package body Par_SCO is
when N_Protected_Body =>
Set_Statement_Entry;
- Traverse_Protected_Body (N);
+ Traverse_Declarations_Or_Statements (Declarations (N));
-- Exit statement, which is an exit statement in the SCO sense,
-- so it is included in the current statement sequence, but
@@ -1960,18 +1964,18 @@ package body Par_SCO is
-- All other cases, which extend the current statement sequence
-- but do not terminate it, even if they have nested decisions.
- when N_Protected_Type_Declaration =>
+ when N_Protected_Type_Declaration | N_Task_Type_Declaration =>
Extend_Statement_Sequence (N, 't');
Process_Decisions_Defer (Discriminant_Specifications (N), 'X');
Set_Statement_Entry;
- Traverse_Protected_Definition (Protected_Definition (N));
+ Traverse_Sync_Definition (N);
- when N_Single_Protected_Declaration =>
+ when N_Single_Protected_Declaration | N_Single_Task_Declaration =>
Extend_Statement_Sequence (N, 'o');
Set_Statement_Entry;
- Traverse_Protected_Definition (Protected_Definition (N));
+ Traverse_Sync_Definition (N);
when others =>
@@ -2112,36 +2116,52 @@ package body Par_SCO is
Traverse_Declarations_Or_Statements (Private_Declarations (Spec));
end Traverse_Package_Declaration;
- -----------------------------
- -- Traverse_Protected_Body --
- -----------------------------
+ ------------------------------
+ -- Traverse_Sync_Definition --
+ ------------------------------
- procedure Traverse_Protected_Body (N : Node_Id) is
- begin
- Traverse_Declarations_Or_Statements (Declarations (N));
- end Traverse_Protected_Body;
+ procedure Traverse_Sync_Definition (N : Node_Id) is
+ Dom_Info : Dominant_Info := ('S', N);
+ -- The first declaration is dominated by the protected or task [type]
+ -- declaration.
- -----------------------------------
- -- Traverse_Protected_Definition --
- -----------------------------------
+ Sync_Def : Node_Id;
+ -- N's protected or task definition
- procedure Traverse_Protected_Definition (N : Node_Id) is
- Dom_Info : Dominant_Info := ('S', Parent (N));
- Vis_Decl : constant List_Id := Visible_Declarations (N);
+ Vis_Decl : List_Id;
+ -- Sync_Def's Visible_Declarations
begin
+ case Nkind (N) is
+ when N_Single_Protected_Declaration | N_Protected_Type_Declaration =>
+ Sync_Def := Protected_Definition (N);
+
+ when N_Single_Task_Declaration | N_Task_Type_Declaration =>
+ Sync_Def := Task_Definition (N);
+
+ when others =>
+ raise Program_Error;
+ end case;
+
+ Vis_Decl := Visible_Declarations (Sync_Def);
+
Traverse_Declarations_Or_Statements
(L => Vis_Decl,
D => Dom_Info);
+ -- If visible declarations are present, the first private declaration
+ -- is dominated by the last visible declaration.
+
+ -- This is incorrect if Last (Vis_Decl) does not generate a SCO???
+
if not Is_Empty_List (Vis_Decl) then
Dom_Info.N := Last (Vis_Decl);
end if;
Traverse_Declarations_Or_Statements
- (L => Private_Declarations (N),
+ (L => Private_Declarations (Sync_Def),
D => Dom_Info);
- end Traverse_Protected_Definition;
+ end Traverse_Sync_Definition;
--------------------------------------
-- Traverse_Subprogram_Or_Task_Body --