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
This commit is contained in:
Eric Botcazou 2017-05-15 08:27:44 +00:00 committed by Eric Botcazou
parent b1b2b511e5
commit 0c09a01e9e
3 changed files with 29 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2017-05-15 Eric Botcazou <ebotcazou@adacore.com>
* 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.
2017-05-15 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (gnat_to_gnu) <N_Aggregate>: Fix formatting.

View File

@ -5472,6 +5472,15 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
if (!optimize && !Has_Pragma_Inline_Always (gnat_entity))
continue;
/* The set of inlined subprograms is computed from data recorded early
during expansion and it can be a strict superset of the final set
computed after semantic analysis, for example if a call to such a
subprogram occurs in a pragma Assert and assertions are disabled.
In that case, semantic analysis resets Is_Public to false but the
entry for the subprogram in the inlining tables is stalled. */
if (!Is_Public (gnat_entity))
continue;
gnat_body = Parent (Declaration_Node (gnat_entity));
if (Nkind (gnat_body) != N_Subprogram_Body)
{

View File

@ -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 ... */