diff options
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)); } } |