diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2015-11-12 11:55:37 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2015-11-12 11:55:37 +0100 |
commit | 1d4b96e007641088199133bb37a13338eb4fb2ff (patch) | |
tree | 34ae13ea914b1a19196c1f49ae686f6b549cc8aa /gcc/ada/gcc-interface/trans.c | |
parent | 81501d2b45d990aaab9c0c3b85a13b4315ed567e (diff) | |
download | gcc-1d4b96e007641088199133bb37a13338eb4fb2ff.zip gcc-1d4b96e007641088199133bb37a13338eb4fb2ff.tar.gz gcc-1d4b96e007641088199133bb37a13338eb4fb2ff.tar.bz2 |
decl.c (gnat_to_gnu_entity): Create IMPORTED_DECL nodes to describe the subprogram renamings which are...
2015-11-12 Pierre-Marie de Rodat <derodat@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity): Create
IMPORTED_DECL nodes to describe the subprogram renamings which
are relevant at debug time.
* gcc-interface/gigi.h (get_debug_scope): Add declaration.
* gcc-interface/trans.c (Identifier_to_gnu): Consider
N_Defining_Operator_Symbol as valid entities.
(gnat_to_gnu): Handle N_Defining_Operator_Symbol the same way as
other entities. Introduce a specific handling for
N_Subprogram_Renaming_Declaration: call gnat_to_gnu_entity on
the entity defined for relevant ones.
(process_decls): Process subprogram renaming declarations during
the second pass only.
* gcc-interface/utils.c (get_debug_scope): Make it external.
Consider N_Defining_Operator_Symbol as valid entities.
(gnat_write_global_declarations): Output debugging information
for top-level imported declarations.
* gcc-interface/Makefile.in: Fix typo.
From-SVN: r230227
Diffstat (limited to 'gcc/ada/gcc-interface/trans.c')
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index a347b3b..b23cc51 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -1027,7 +1027,8 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) original type. Similarly, a class-wide type is equivalent to a subtype of itself. Finally, if the types are Itypes, one may be a copy of the other, which is also legal. */ - gnat_temp = (Nkind (gnat_node) == N_Defining_Identifier + gnat_temp = ((Nkind (gnat_node) == N_Defining_Identifier + || Nkind (gnat_node) == N_Defining_Operator_Symbol) ? gnat_node : Entity (gnat_node)); gnat_temp_type = Etype (gnat_temp); @@ -5694,6 +5695,7 @@ gnat_to_gnu (Node_Id gnat_node) case N_Expanded_Name: case N_Operator_Symbol: case N_Defining_Identifier: + case N_Defining_Operator_Symbol: gnu_result = Identifier_to_gnu (gnat_node, &gnu_result_type); /* If atomic access is required on the RHS, build the atomic load. */ @@ -5957,13 +5959,39 @@ gnat_to_gnu (Node_Id gnat_node) } break; + case N_Subprogram_Renaming_Declaration: + { + const Node_Id gnat_renaming = Defining_Entity (gnat_node); + const Node_Id gnat_renamed = Renamed_Entity (gnat_renaming); + + gnu_result = alloc_stmt_list (); + + /* Materializing renamed subprograms will only benefit the debugging + information as they aren't referenced in the generated code. So + skip them when they aren't needed. Avoid doing this if: + + - there is a freeze node: in this case the renamed entity is not + elaborated yet; + - the renamed subprogram is intrinsic: it will not be available in + the debugging information (note that both or only one of the + renaming and the renamed subprograms can be intrinsic). */ + if (No (Freeze_Node (gnat_renaming)) + && Needs_Debug_Info (gnat_renaming) + && Present (gnat_renamed) + && (Ekind (gnat_renamed) == E_Function + || Ekind (gnat_renamed) == E_Procedure) + && !Is_Intrinsic_Subprogram (gnat_renaming) + && !Is_Intrinsic_Subprogram (gnat_renamed)) + gnat_to_gnu_entity (gnat_renaming, gnat_to_gnu (gnat_renamed), 1); + break; + } + case N_Implicit_Label_Declaration: gnat_to_gnu_entity (Defining_Entity (gnat_node), NULL_TREE, 1); gnu_result = alloc_stmt_list (); break; case N_Number_Declaration: - case N_Subprogram_Renaming_Declaration: case N_Package_Renaming_Declaration: /* These are fully handled in the front end. */ /* ??? For package renamings, find a way to use GENERIC namespaces so @@ -8553,6 +8581,12 @@ process_decls (List_Id gnat_decls, List_Id gnat_decls2, || Nkind (gnat_decl) == N_Protected_Body_Stub) ; + /* Renamed subprograms may not be elaborated yet at this point + since renamings do not trigger freezing. Wait for the second + pass to take care of them. */ + else if (Nkind (gnat_decl) == N_Subprogram_Renaming_Declaration) + ; + else add_stmt (gnat_to_gnu (gnat_decl)); } @@ -8581,6 +8615,9 @@ process_decls (List_Id gnat_decls, List_Id gnat_decls2, else if (Nkind (gnat_decl) == N_Freeze_Entity) process_decls (Actions (gnat_decl), Empty, Empty, false, true); + + else if (Nkind (gnat_decl) == N_Subprogram_Renaming_Declaration) + add_stmt (gnat_to_gnu (gnat_decl)); } } |