From 0c09a01e9ea0608df0ae6754f67d630c1e40bb04 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 15 May 2017 08:27:44 +0000 Subject: trans.c (Compilation_Unit_to_gnu): Skip subprograms on the inlined list that are not public. * gcc-interface/trans.c (Compilation_Unit_to_gnu): Skip subprograms on the inlined list that are not public. * gcc-interface/utils.c (create_subprog_decl): Clear TREE_PUBLIC if there is a pragma Inline_Always on the subprogram. From-SVN: r248051 --- gcc/ada/gcc-interface/utils.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'gcc/ada/gcc-interface/utils.c') diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 4fabddf..345b8a4 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -3220,10 +3220,19 @@ create_subprog_decl (tree name, tree asm_name, tree type, tree param_decl_list, case is_required: if (Back_End_Inlining) - decl_attributes (&subprog_decl, - tree_cons (get_identifier ("always_inline"), - NULL_TREE, NULL_TREE), - ATTR_FLAG_TYPE_IN_PLACE); + { + decl_attributes (&subprog_decl, + tree_cons (get_identifier ("always_inline"), + NULL_TREE, NULL_TREE), + ATTR_FLAG_TYPE_IN_PLACE); + + /* Inline_Always guarantees that every direct call is inlined and + that there is no indirect reference to the subprogram, so the + instance in the original package (as well as its clones in the + client packages created for inter-unit inlining) can be made + private, which causes the out-of-line body to be eliminated. */ + TREE_PUBLIC (subprog_decl) = 0; + } /* ... fall through ... */ -- cgit v1.1