[1/10] debug-early merge: Ada front-end
diff mbox

Message ID 555F1F29.6040606@redhat.com
State New
Headers show

Commit Message

Aldy Hernandez May 22, 2015, 12:20 p.m. UTC
On 05/22/2015 04:31 AM, Eric Botcazou wrote:
>> 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.
>
> Thanks, this looks fine modulo a couple of nits, see below.
>
>> 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?
>
> Sure, just add a ??? comment before the above lines for now.

Done.

>
>
> @@ -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);
>
> The comment needs to be adjusted instead of removed and preferably be the same
> as the one (ajusted too) above the function in utils.c.

Done.

I have queued the attached patch for merge into mainline once the rest 
of the patches are approved.

Thank you.

Patch
diff mbox

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/decl.c b/gcc/ada/gcc-interface/decl.c
index d908a1b..e778616 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -5241,6 +5241,13 @@  gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
       && !Present (Alias (gnat_entity))
       && !(Present (Renamed_Object (gnat_entity)) && saved))
     {
+      /* ?? DECL_ARTIFICIAL, and possibly DECL_IGNORED_P below, should
+	 be set before calling rest_of_decl_compilation above (through
+	 create_var_decl_1).  This is because rest_of_decl_compilation
+	 calls the debugging backend and will create a DIE without
+	 DW_AT_artificial.
+
+	 This is currently causing gnat.dg/specs/debug1.ads to FAIL.  */
       if (!Comes_From_Source (gnat_entity))
 	DECL_ARTIFICIAL (gnu_decl) = 1;
 
diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h
index 6d65fc5..ace4ac8 100644
--- a/gcc/ada/gcc-interface/gigi.h
+++ b/gcc/ada/gcc-interface/gigi.h
@@ -535,8 +535,9 @@  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);
+/* Keep track of types used at the global level and emit debug info
+   for all global types.  */
+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..915cbe1 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);
@@ -5175,8 +5178,11 @@  smaller_form_type_p (tree type, tree orig_type)
 
 static GTY (()) tree dummy_global;
 
+/* Keep track of types used at the global level and emit debug info
+   for all global types.  */
+
 void
-gnat_write_global_declarations (void)
+note_types_used_by_globals (void)
 {
   unsigned int i;
   tree iter;
@@ -5206,26 +5212,12 @@  gnat_write_global_declarations (void)
     }
 
   /* Output debug information for all global type declarations first.  This
-     ensures that global types whose compilation hasn't been finalized yet,
+     ensures that global types whose compilation haven'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);
-    }
 }
 
 /* ************************************************************************