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:
parent
b1b2b511e5
commit
0c09a01e9e
@ -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.
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -3220,11 +3220,20 @@ 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);
|
||||
|
||||
/* 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 ... */
|
||||
|
||||
case is_enabled:
|
||||
|
Loading…
Reference in New Issue
Block a user