gigi.h (note_types_used_by_globals): Delete.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 26 Jun 2015 10:21:54 +0000 (10:21 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 26 Jun 2015 10:21:54 +0000 (10:21 +0000)
* gcc-interface/gigi.h (note_types_used_by_globals): Delete.
(gnat_write_global_declarations): New prototype.
* gcc-interface/utils.c (type_decls): Rename back to...
(global_decls): ...this.
(gnat_pushdecls): Revert previous change.
(create_var_decl): Do not output global variables.
(note_types_used_by_globals): Rename back to...
(gnat_write_global_declarations): ...this.  Output variables on the
global_decls vector.
* gcc-interface/misc.c (gnat_parse_file): Adjust to above renaming.

From-SVN: r225003

gcc/ada/ChangeLog
gcc/ada/gcc-interface/gigi.h
gcc/ada/gcc-interface/misc.c
gcc/ada/gcc-interface/utils.c

index a58c80f39ad67d8f8266d70bf3ec075df5a4872a..943395e99a87227f67c5a8976a5846021e97f6a0 100644 (file)
@@ -1,3 +1,16 @@
+2015-06-26  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/gigi.h (note_types_used_by_globals): Delete.
+       (gnat_write_global_declarations): New prototype.
+       * gcc-interface/utils.c (type_decls): Rename back to...
+       (global_decls): ...this.
+       (gnat_pushdecls): Revert previous change.
+       (create_var_decl): Do not output global variables.
+       (note_types_used_by_globals): Rename back to...
+       (gnat_write_global_declarations): ...this.  Output variables on the
+       global_decls vector.
+       * gcc-interface/misc.c (gnat_parse_file): Adjust to above renaming.
+
 2015-06-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/gigi.h (create_var_decl_1): Rename into...
index 4f95d3f77e541d9331e75f1e9f8674e1e94d1307..67977b01f8788a3645d0be71c8128d6b57018f51 100644 (file)
@@ -531,9 +531,8 @@ 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);
 
-/* 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);
+/* Perform final processing on global declarations.  */
+extern void gnat_write_global_declarations (void);
 
 /* Return the unsigned version of a TYPE_NODE, a scalar type.  */
 extern tree gnat_unsigned_type (tree type_node);
index bb11ce49b83a8f0f7cbdd172765537f792bad64f..2f397ba1fe7842c5e3495823d654990e1eabf2ba 100644 (file)
@@ -113,7 +113,8 @@ gnat_parse_file (void)
   /* Call the front end.  */
   _ada_gnat1drv ();
 
-  note_types_used_by_globals ();
+  /* Write the global declarations.  */
+  gnat_write_global_declarations ();
 }
 
 /* Return language mask for option processing.  */
index b32bc892fa5d019263789fa72fb8927a4ad00548..e4b0ebac320fbe254f31baa035ee1b660c371d8c 100644 (file)
@@ -218,8 +218,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 type declarations.  */
-static GTY(()) vec<tree, va_gc> *type_decls;
+/* An array of global declarations.  */
+static GTY(()) vec<tree, va_gc> *global_decls;
 
 /* An array of builtin function declarations.  */
 static GTY(()) vec<tree, va_gc> *builtin_decls;
@@ -753,10 +753,7 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
            vec_safe_push (builtin_decls, decl);
        }
       else if (global_bindings_p ())
-       {
-         if (TREE_CODE (decl) == TYPE_DECL)
-           vec_safe_push (type_decls, decl);
-       }
+       vec_safe_push (global_decls, decl);
       else
        {
          DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
@@ -2439,19 +2436,13 @@ create_var_decl (tree name, tree asm_name, tree type, tree init,
   /* Add this decl to the current binding level.  */
   gnat_pushdecl (var_decl, gnat_node);
 
-  if (TREE_CODE (var_decl) == VAR_DECL)
+  if (TREE_CODE (var_decl) == VAR_DECL && asm_name)
     {
-      if (asm_name)
-       {
-         /* Let the target mangle the name if this isn't a verbatim asm.  */
-         if (*IDENTIFIER_POINTER (asm_name) != '*')
-           asm_name = targetm.mangle_decl_assembler_name (var_decl, asm_name);
-
-         SET_DECL_ASSEMBLER_NAME (var_decl, asm_name);
-       }
+      /* Let the target mangle the name if this isn't a verbatim asm.  */
+      if (*IDENTIFIER_POINTER (asm_name) != '*')
+       asm_name = targetm.mangle_decl_assembler_name (var_decl, asm_name);
 
-      if (global_bindings_p ())
-       rest_of_decl_compilation (var_decl, true, 0);
+      SET_DECL_ASSEMBLER_NAME (var_decl, asm_name);
     }
 
   return var_decl;
@@ -5200,13 +5191,12 @@ smaller_form_type_p (tree type, tree orig_type)
   return tree_int_cst_lt (size, osize) != 0;
 }
 
-/* Keep track of types used at the global level and emit debug info
-   for all global types.  */
+/* Perform final processing on global declarations.  */
 
 static GTY (()) tree dummy_global;
 
 void
-note_types_used_by_globals (void)
+gnat_write_global_declarations (void)
 {
   unsigned int i;
   tree iter;
@@ -5235,13 +5225,20 @@ note_types_used_by_globals (void)
        }
     }
 
-  /* Output debug information for all global type declarations.  This ensures
-     that global types whose compilation cannot been finalized earlier, e.g.
-     pointers to Taft amendment types, have their compilation finalized in
-     the right context.  */
-  FOR_EACH_VEC_SAFE_ELT (type_decls, i, iter)
-    if (!DECL_IGNORED_P (iter))
+  /* Output debug information for all global type declarations first.  This
+     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))
       debug_hooks->type_decl (iter, false);
+
+  /* Then output the global variables.  We need to do that after the debug
+     information is emitted above so that "forward" type declarations are
+     properly merged with their definition in the debug information.  */
+  FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
+    if (TREE_CODE (iter) == VAR_DECL)
+      rest_of_decl_compilation (iter, true, 0);
 }
 
 /* ************************************************************************