Commit 0c09a01e by Eric Botcazou Committed by Eric Botcazou

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
parent b1b2b511
2017-05-15 Eric Botcazou <ebotcazou@adacore.com> 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. * gcc-interface/trans.c (gnat_to_gnu) <N_Aggregate>: Fix formatting.
<N_Allocator>: Use properly typed constants. <N_Allocator>: Use properly typed constants.
(extract_values): Move around. (extract_values): Move around.
......
...@@ -5472,6 +5472,15 @@ Compilation_Unit_to_gnu (Node_Id gnat_node) ...@@ -5472,6 +5472,15 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
if (!optimize && !Has_Pragma_Inline_Always (gnat_entity)) if (!optimize && !Has_Pragma_Inline_Always (gnat_entity))
continue; 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)); gnat_body = Parent (Declaration_Node (gnat_entity));
if (Nkind (gnat_body) != N_Subprogram_Body) if (Nkind (gnat_body) != N_Subprogram_Body)
{ {
......
...@@ -3220,10 +3220,19 @@ create_subprog_decl (tree name, tree asm_name, tree type, tree param_decl_list, ...@@ -3220,10 +3220,19 @@ create_subprog_decl (tree name, tree asm_name, tree type, tree param_decl_list,
case is_required: case is_required:
if (Back_End_Inlining) if (Back_End_Inlining)
decl_attributes (&subprog_decl, {
tree_cons (get_identifier ("always_inline"), decl_attributes (&subprog_decl,
NULL_TREE, NULL_TREE), tree_cons (get_identifier ("always_inline"),
ATTR_FLAG_TYPE_IN_PLACE); 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 ... */ /* ... fall through ... */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment