On 05/08/2015 06:26 AM, Eric Botcazou wrote:
[Jason, question below.]
What's the replacement mechanism for the first pass on global_decls? The
comment explains that generating debug info must be delayed in this case.
My apologies for the delay on Ada. I have reworked the patch to leave
the first pass on the TYPE_DECLs which are definitely needed. I also
optimized things a bit, since we don't need to save all the globals any
more.
There is one regression which I'd like you and Jason's input before
proceeding:
+FAIL: gnat.dg/specs/debug1.ads scan-assembler-times DW_AT_artificial 17
The problem is that the Ada front-end twiddles the DECL_ARTIFICIAL flag
*after* it has called debug_hooks->early_global_decl(). The function
gnat_to_gnu_entity() calls create_var_decl_1->rest_of_decl_compilation,
but then much later twiddles DECL_ARTIFICIAL:
if (!Comes_From_Source (gnat_entity))
DECL_ARTIFICIAL (gnu_decl) = 1;
Twiddling DECL_ARTIFICIAL after we create early dwarf, means the DIE
does not get the DW_AT_artificial. Would it be possible for you guys
(ahem, Ada folk) to set DECL_ARTIFICIAL before calling
rest_of_decl_compilation?
If not, Jason I suppose we could tag the DW_AT_artificial in
late_global_decl when we notice it now has DECL_ARTIFICIAL set. But I'd
prefer not to hack things this way.
Thoughts?
Aldy
gcc/ada/
* gcc-interface/gigi.h (note_types_used_by_globals): Rename from
gnat_write_global_declarations.
* gcc-interface/misc.c (gnat_parse_file): Call
note_types_used_by_globals.
Remove LANG_HOOKS_WRITE_GLOBALS.
* gcc-interface/utils.c: Rename global_decls to type_decls.
(gnat_write_global_declarations): Rename
to note_types_used_by_globals.
Remove call to finalize_compilation_unit.
Remove debug_hooks->global_decl() call for globals.
(gnat_pushdecls): Only insert into type_decls if TYPE_DECL.
diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h
index 6d65fc5..fead2be 100644
--- a/gcc/ada/gcc-interface/gigi.h
+++ b/gcc/ada/gcc-interface/gigi.h
@@ -535,8 +535,7 @@ extern tree gnat_type_for_size (unsigned precision, int unsignedp);
an unsigned type; otherwise a signed type is returned. */
extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
-/* Emit debug info for all global variable declarations. */
-extern void gnat_write_global_declarations (void);
+extern void note_types_used_by_globals (void);
/* Return the unsigned version of a TYPE_NODE, a scalar type. */
extern tree gnat_unsigned_type (tree type_node);
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index edaab97..2056a61 100644
--- a/gcc/ada/gcc-interface/misc.c
+++ b/gcc/ada/gcc-interface/misc.c
@@ -122,6 +122,8 @@ gnat_parse_file (void)
/* Call the front end. */
_ada_gnat1drv ();
+
+ note_types_used_by_globals ();
}
/* Return language mask for option processing. */
@@ -972,8 +974,6 @@ gnat_init_ts (void)
#define LANG_HOOKS_GETDECLS lhd_return_null_tree_v
#undef LANG_HOOKS_PUSHDECL
#define LANG_HOOKS_PUSHDECL gnat_return_tree
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS gnat_write_global_declarations
#undef LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
#undef LANG_HOOKS_PRINT_DECL
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 5968857..3ef3a3a 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -227,8 +227,8 @@ 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. */
-static GTY(()) vec<tree, va_gc> *global_decls;
+/* An array of global type declarations. */
+static GTY(()) vec<tree, va_gc> *type_decls;
/* An array of builtin function declarations. */
static GTY(()) vec<tree, va_gc> *builtin_decls;
@@ -765,7 +765,10 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
vec_safe_push (builtin_decls, decl);
}
else if (global_bindings_p ())
- vec_safe_push (global_decls, decl);
+ {
+ if (TREE_CODE (decl) == TYPE_DECL)
+ vec_safe_push (type_decls, decl);
+ }
else
{
DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
@@ -5176,7 +5179,7 @@ smaller_form_type_p (tree type, tree orig_type)
static GTY (()) tree dummy_global;
void
-gnat_write_global_declarations (void)
+note_types_used_by_globals (void)
{
unsigned int i;
tree iter;
@@ -5209,23 +5212,9 @@ gnat_write_global_declarations (void)
ensures that global types whose compilation hasn't been finalized yet,
for example pointers to Taft amendment types, have their compilation
finalized in the right context. */
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
+ FOR_EACH_VEC_SAFE_ELT (type_decls, i, iter)
+ if (!DECL_IGNORED_P (iter))
debug_hooks->type_decl (iter, false);
-
- /* Proceed to optimize and emit assembly. */
- symtab->finalize_compilation_unit ();
-
- /* After cgraph has had a chance to emit everything that's going to
- be emitted, output debug information for the rest of globals. */
- if (!seen_error ())
- {
- timevar_push (TV_SYMOUT);
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
- debug_hooks->global_decl (iter);
- timevar_pop (TV_SYMOUT);
- }
}
/* ************************************************************************