diff options
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/Make-lang.in | 2 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 25 |
3 files changed, 30 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 0af991d..1ea386b 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2011-06-06 Eric Botcazou <ebotcazou@adacore.com> + + * gcc-interface/utils.c: Include diagnostic.h. + (gnat_write_global_declarations): Output debug information for all + global type declarations before finalizing the compilation unit. + * gcc-interface/Make-lang.in (ada/utils.o): Add dependency. + 2011-05-25 Jakub Jelinek <jakub@redhat.com> * gcc-interface/utils.c (def_fn_type): Remove extra va_end. diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in index dbd1f08..53f9f8d 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -1237,7 +1237,7 @@ ada/trans.o : ada/gcc-interface/trans.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ ada/utils.o : ada/gcc-interface/utils.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TM_H) $(TREE_H) $(FLAGS_H) toplev.h $(RTL_H) output.h debug.h convert.h \ - $(TARGET_H) function.h langhooks.h $(CGRAPH_H) \ + $(TARGET_H) function.h langhooks.h $(CGRAPH_H) $(DIAGNOSTIC_H) \ $(TREE_DUMP_H) $(TREE_INLINE_H) tree-iterator.h \ ada/gcc-interface/ada.h ada/types.h ada/atree.h ada/elists.h ada/namet.h \ ada/nlists.h ada/stringt.h ada/uintp.h ada/fe.h ada/sinfo.h ada/einfo.h \ diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index ad2ff2a..0f2a331 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -38,6 +38,7 @@ #include "target.h" #include "langhooks.h" #include "cgraph.h" +#include "diagnostic.h" #include "tree-dump.h" #include "tree-inline.h" #include "tree-iterator.h" @@ -4756,6 +4757,9 @@ static GTY (()) tree dummy_global; void gnat_write_global_declarations (void) { + unsigned int i; + tree iter; + /* If we have declared types as used at the global level, insert them in the global hash table. We use a dummy variable for this purpose. */ if (!VEC_empty (tree, types_used_by_cur_var_decl)) @@ -4773,13 +4777,28 @@ 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, + for example pointers to Taft amendment types, have their compilation + finalized in the right context. */ + FOR_EACH_VEC_ELT (tree, global_decls, i, iter) + if (TREE_CODE (iter) == TYPE_DECL) + debug_hooks->global_decl (iter); + /* Proceed to optimize and emit assembly. FIXME: shouldn't be the front end's responsibility to call this. */ cgraph_finalize_compilation_unit (); - /* Emit debug info for all global declarations. */ - emit_debug_global_declarations (VEC_address (tree, global_decls), - VEC_length (tree, global_decls)); + /* 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_ELT (tree, global_decls, i, iter) + if (TREE_CODE (iter) != TYPE_DECL) + debug_hooks->global_decl (iter); + timevar_pop (TV_SYMOUT); + } } /* ************************************************************************ |