From: Eric Botcazou Date: Sat, 26 Mar 2011 09:34:40 +0000 (+0000) Subject: inline.adb (Back_End_Cannot_Inline): Lift restriction on calls to subprograms without... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5daed84a544a8e2bd3017ad77975abd9831953b7;p=gcc.git inline.adb (Back_End_Cannot_Inline): Lift restriction on calls to subprograms without a previous spec declared in... * inline.adb (Back_End_Cannot_Inline): Lift restriction on calls to subprograms without a previous spec declared in the same unit. * gcc-interface/trans.c (Compilation_Unit_to_gnu): Process inlined subprograms at the end of the unit instead of at the beginning. * gcc-interface/utils.c (create_subprog_decl): Check that the entity isn't public for the special handling of non-inline functions nested inside inline external functions. From-SVN: r171551 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 65bb6d0f6df..a1131ce465a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,6 +1,16 @@ +2011-03-26 Eric Botcazou + + * inline.adb (Back_End_Cannot_Inline): Lift restriction on calls to + subprograms without a previous spec declared in the same unit. + * gcc-interface/trans.c (Compilation_Unit_to_gnu): Process inlined + subprograms at the end of the unit instead of at the beginning. + * gcc-interface/utils.c (create_subprog_decl): Check that the entity + isn't public for the special handling of non-inline functions nested + inside inline external functions. + 2011-03-25 Jeff Law - * ada/gcc-interface/utils.c (def_fn_type): Add missing va_end. + * gcc-interface/utils.c (def_fn_type): Add missing va_end. 2011-03-24 Eric Botcazou diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index ab0725b75b5..f6d83af5761 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -3793,6 +3793,20 @@ Compilation_Unit_to_gnu (Node_Id gnat_node) finalize_from_with_types (); } + if (type_annotate_only && gnat_node == Cunit (Main_Unit)) + { + elaborate_all_entities (gnat_node); + + if (Nkind (Unit (gnat_node)) == N_Subprogram_Declaration + || Nkind (Unit (gnat_node)) == N_Generic_Package_Declaration + || Nkind (Unit (gnat_node)) == N_Generic_Subprogram_Declaration) + return; + } + + process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty, + true, true); + add_stmt (gnat_to_gnu (Unit (gnat_node))); + /* If we can inline, generate code for all the inlined subprograms. */ if (optimize) { @@ -3822,20 +3836,6 @@ Compilation_Unit_to_gnu (Node_Id gnat_node) } } - if (type_annotate_only && gnat_node == Cunit (Main_Unit)) - { - elaborate_all_entities (gnat_node); - - if (Nkind (Unit (gnat_node)) == N_Subprogram_Declaration - || Nkind (Unit (gnat_node)) == N_Generic_Package_Declaration - || Nkind (Unit (gnat_node)) == N_Generic_Subprogram_Declaration) - return; - } - - process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty, - true, true); - add_stmt (gnat_to_gnu (Unit (gnat_node))); - /* Process any pragmas and actions following the unit. */ add_stmt_list (Pragmas_After (Aux_Decls_Node (gnat_node))); add_stmt_list (Actions (Aux_Decls_Node (gnat_node))); diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 181e22a7f98..2cfd1ce4997 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -1790,6 +1790,7 @@ create_subprog_decl (tree subprog_name, tree asm_name, We could inline the nested function as well but it's probably better to err on the side of too little inlining. */ if (!inline_flag + && !public_flag && current_function_decl && DECL_DECLARED_INLINE_P (current_function_decl) && DECL_EXTERNAL (current_function_decl)) diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb index f40edd92d79..ddb4715ce13 100644 --- a/gcc/ada/inline.adb +++ b/gcc/ada/inline.adb @@ -368,12 +368,6 @@ package body Inline is -- inlined under ZCX because the numeric suffix generated by gigi -- will be different in the body and the place of the inlined call. -- - -- If the body to be inlined contains calls to subprograms declared - -- in the same body that have no previous spec, the back-end cannot - -- inline either because the bodies to be inlined are processed before - -- the rest of the enclosing package body, and gigi will then find - -- references to entities that have not been elaborated yet. - -- -- This procedure must be carefully coordinated with the back end. ---------------------------- @@ -384,41 +378,6 @@ package body Inline is Decl : constant Node_Id := Unit_Declaration_Node (Subp); Body_Ent : Entity_Id; Ent : Entity_Id; - Bad_Call : Node_Id; - - function Process (N : Node_Id) return Traverse_Result; - -- Look for calls to subprograms with no previous spec, declared - -- in the same enclosing package body. - - ------------- - -- Process -- - ------------- - - function Process (N : Node_Id) return Traverse_Result is - begin - if Nkind (N) = N_Procedure_Call_Statement - or else Nkind (N) = N_Function_Call - then - if Is_Entity_Name (Name (N)) - and then Comes_From_Source (Entity (Name (N))) - and then - Nkind (Unit_Declaration_Node (Entity (Name (N)))) - = N_Subprogram_Body - and then In_Same_Extended_Unit (Subp, Entity (Name (N))) - then - Bad_Call := N; - return Abandon; - else - return OK; - end if; - else - return OK; - end if; - end Process; - - function Has_Exposed_Call is new Traverse_Func (Process); - - -- Start of processing for Back_End_Cannot_Inline begin if Nkind (Decl) = N_Subprogram_Declaration @@ -454,19 +413,7 @@ package body Inline is Next_Entity (Ent); end loop; - if Has_Exposed_Call - (Unit_Declaration_Node (Corresponding_Body (Decl))) = Abandon - then - if Ineffective_Inline_Warnings then - Error_Msg_N - ("?call to subprogram with no separate spec" - & " prevents inlining!!", Bad_Call); - end if; - - return True; - else - return False; - end if; + return False; end Back_End_Cannot_Inline; -- Start of processing for Add_Inlined_Subprogram diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d2a1762798e..6b2fede5e94 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-26 Eric Botcazou + + * gnat.dg/opt15.adb: New test. + * gnat.dg/opt15_pkg.ad[sb]: New helper. + 2011-03-25 Tobias Burnus PR fortran/48174 diff --git a/gcc/testsuite/gnat.dg/opt15.adb b/gcc/testsuite/gnat.dg/opt15.adb new file mode 100644 index 00000000000..eadc25d7023 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt15.adb @@ -0,0 +1,12 @@ +-- { dg-do compile } +-- { dg-options "-O -gnatn -fdump-tree-optimized" } + +with Opt15_Pkg; use Opt15_Pkg; + +procedure Opt15 is +begin + Trace_Inlined; +end; + +-- { dg-final { scan-tree-dump-not "trace_inlined" "optimized" } } +-- { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/testsuite/gnat.dg/opt15_pkg.adb b/gcc/testsuite/gnat.dg/opt15_pkg.adb new file mode 100644 index 00000000000..ebb1d263e81 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt15_pkg.adb @@ -0,0 +1,13 @@ +package body Opt15_Pkg is + + procedure Trace_Non_Inlined is + begin + raise Program_Error; + end; + + procedure Trace_Inlined is + begin + Trace_Non_Inlined; + end; + +end Opt15_Pkg; diff --git a/gcc/testsuite/gnat.dg/opt15_pkg.ads b/gcc/testsuite/gnat.dg/opt15_pkg.ads new file mode 100644 index 00000000000..f1d0302033d --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt15_pkg.ads @@ -0,0 +1,6 @@ +package Opt15_Pkg is + + procedure Trace_Inlined; + pragma Inline (Trace_Inlined); + +end Opt15_Pkg;