Commit 228ee426 by Eric Botcazou Committed by Eric Botcazou

re PR lto/50492 (Ada bootstrap failure --with-build-config=bootstrap-lto)

	PR lto/50492
	* gcc-interface/gigi.h (gnat_pushdecl): Adjust comment.
	* gcc-interface/utils.c (global_context): New variable.
	(gnat_pushdecl): Initialize it and set it as the DECL_CONTEXT of DECLs
	that are either public external or at top level.  Use "No" macro.
	(end_subprog_body): Call decl_function_context.
	(rest_of_subprog_body_compilation): Likewise.

From-SVN: r179652
parent b97bf1ac
2011-10-07 Eric Botcazou <ebotcazou@adacore.com> 2011-10-07 Eric Botcazou <ebotcazou@adacore.com>
PR lto/50492
* gcc-interface/gigi.h (gnat_pushdecl): Adjust comment.
* gcc-interface/utils.c (global_context): New variable.
(gnat_pushdecl): Initialize it and set it as the DECL_CONTEXT of DECLs
that are either public external or at top level. Use "No" macro.
(end_subprog_body): Call decl_function_context.
(rest_of_subprog_body_compilation): Likewise.
2011-10-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/gigi.h (gnat_useless_type_conversion): Declare. * gcc-interface/gigi.h (gnat_useless_type_conversion): Declare.
(rest_of_subprog_body_compilation): Likewise. (rest_of_subprog_body_compilation): Likewise.
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: For renaming, * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: For renaming,
......
...@@ -450,8 +450,8 @@ extern void set_block_jmpbuf_decl (tree decl); ...@@ -450,8 +450,8 @@ extern void set_block_jmpbuf_decl (tree decl);
/* Get the setjmp_decl, if any, for the current binding level. */ /* Get the setjmp_decl, if any, for the current binding level. */
extern tree get_block_jmpbuf_decl (void); extern tree get_block_jmpbuf_decl (void);
/* Records a ..._DECL node DECL as belonging to the current lexical scope /* Record DECL as belonging to the current lexical scope and use GNAT_NODE
and uses GNAT_NODE for location information. */ for location information and flag propagation. */
extern void gnat_pushdecl (tree decl, Node_Id gnat_node); extern void gnat_pushdecl (tree decl, Node_Id gnat_node);
extern void gnat_init_gcc_eh (void); extern void gnat_init_gcc_eh (void);
......
...@@ -200,6 +200,9 @@ static GTY(()) struct gnat_binding_level *current_binding_level; ...@@ -200,6 +200,9 @@ static GTY(()) struct gnat_binding_level *current_binding_level;
/* A chain of gnat_binding_level structures awaiting reuse. */ /* A chain of gnat_binding_level structures awaiting reuse. */
static GTY((deletable)) struct gnat_binding_level *free_binding_level; static GTY((deletable)) struct gnat_binding_level *free_binding_level;
/* The context to be used for global declarations. */
static GTY(()) tree global_context;
/* An array of global declarations. */ /* An array of global declarations. */
static GTY(()) VEC(tree,gc) *global_decls; static GTY(()) VEC(tree,gc) *global_decls;
...@@ -497,15 +500,19 @@ gnat_zaplevel (void) ...@@ -497,15 +500,19 @@ gnat_zaplevel (void)
free_binding_level = level; free_binding_level = level;
} }
/* Records a ..._DECL node DECL as belonging to the current lexical scope /* Record DECL as belonging to the current lexical scope and use GNAT_NODE
and uses GNAT_NODE for location information and propagating flags. */ for location information and flag propagation. */
void void
gnat_pushdecl (tree decl, Node_Id gnat_node) gnat_pushdecl (tree decl, Node_Id gnat_node)
{ {
/* If this decl is public external or at toplevel, there is no context. */ /* If DECL is public external or at top level, it has global context. */
if ((TREE_PUBLIC (decl) && DECL_EXTERNAL (decl)) || global_bindings_p ()) if ((TREE_PUBLIC (decl) && DECL_EXTERNAL (decl)) || global_bindings_p ())
DECL_CONTEXT (decl) = 0; {
if (!global_context)
global_context = build_translation_unit_decl (NULL_TREE);
DECL_CONTEXT (decl) = global_context;
}
else else
{ {
DECL_CONTEXT (decl) = current_function_decl; DECL_CONTEXT (decl) = current_function_decl;
...@@ -518,11 +525,12 @@ gnat_pushdecl (tree decl, Node_Id gnat_node) ...@@ -518,11 +525,12 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
DECL_STATIC_CHAIN (decl) = 1; DECL_STATIC_CHAIN (decl) = 1;
} }
TREE_NO_WARNING (decl) = (gnat_node == Empty || Warnings_Off (gnat_node)); TREE_NO_WARNING (decl) = (No (gnat_node) || Warnings_Off (gnat_node));
/* Set the location of DECL and emit a declaration for it. */ /* Set the location of DECL and emit a declaration for it. */
if (Present (gnat_node)) if (Present (gnat_node))
Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl)); Sloc_to_locus (Sloc (gnat_node), &DECL_SOURCE_LOCATION (decl));
add_decl_expr (decl, gnat_node); add_decl_expr (decl, gnat_node);
/* Put the declaration on the list. The list of declarations is in reverse /* Put the declaration on the list. The list of declarations is in reverse
...@@ -1982,7 +1990,7 @@ end_subprog_body (tree body) ...@@ -1982,7 +1990,7 @@ end_subprog_body (tree body)
DECL_SAVED_TREE (fndecl) = body; DECL_SAVED_TREE (fndecl) = body;
current_function_decl = DECL_CONTEXT (fndecl); current_function_decl = decl_function_context (fndecl);
} }
/* Wrap up compilation of SUBPROG_DECL, a subprogram body. */ /* Wrap up compilation of SUBPROG_DECL, a subprogram body. */
...@@ -2001,7 +2009,7 @@ rest_of_subprog_body_compilation (tree subprog_decl) ...@@ -2001,7 +2009,7 @@ rest_of_subprog_body_compilation (tree subprog_decl)
dump_function (TDI_original, subprog_decl); dump_function (TDI_original, subprog_decl);
/* ??? This special handling of nested functions is probably obsolete. */ /* ??? This special handling of nested functions is probably obsolete. */
if (!DECL_CONTEXT (subprog_decl)) if (!decl_function_context (subprog_decl))
cgraph_finalize_function (subprog_decl, false); cgraph_finalize_function (subprog_decl, false);
else else
/* Register this function with cgraph just far enough to get it /* Register this function with cgraph just far enough to get it
......
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