From a418679d8d389c0960a17eded96bb9ddb7e33cb6 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 24 Aug 2006 15:30:45 +0200 Subject: [PATCH] re PR debug/26881 (internal compiler error in dwarf2out_finish) PR debug/26881 * cgraph.c: Fix comments. (cgraph_varpool_mark_needed_node): Mark only variables not already output to file. * cgraphunit.c: Update comments; include gt-cgraphunit.h (cgraph_varpool_assembled_nodes_queue): New static variable. (cgraph_varpool_assemble_decl): Record output decls for debug out code. (cgraph_varpool_output_debug_info): New function. (cgraph_finalize_compilation_unit, cgraph_optimize): Call it. * Makefile.in: Add gt-cgraphunit.h * gcc.dg/debug/pr26881.c: New file. From-SVN: r116374 --- gcc/ChangeLog | 13 +++++++ gcc/Makefile.in | 7 ++-- gcc/cgraph.c | 7 ++-- gcc/cgraphunit.c | 58 ++++++++++++++++++++-------- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/debug/pr26881.c | 16 ++++++++ 6 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/debug/pr26881.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d62c53b9623..a201c69d3ba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2006-08-24 Jan Hubicka + + PR debug/26881 + * cgraph.c: Fix comments. + (cgraph_varpool_mark_needed_node): Mark only variables not already + output to file. + * cgraphunit.c: Update comments; include gt-cgraphunit.h + (cgraph_varpool_assembled_nodes_queue): New static variable. + (cgraph_varpool_assemble_decl): Record output decls for debug out code. + (cgraph_varpool_output_debug_info): New function. + (cgraph_finalize_compilation_unit, cgraph_optimize): Call it. + * Makefile.in: Add gt-cgraphunit.h + 2006-08-24 Jan Hubicka * predict.c (probability_reliable_p): New predicate. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 46465b0d80a..db1619c8c00 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2290,7 +2290,8 @@ cgraphunit.o : cgraphunit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ $(TREE_H) langhooks.h $(TREE_INLINE_H) toplev.h $(FLAGS_H) $(GGC_H) \ $(TARGET_H) $(CGRAPH_H) intl.h pointer-set.h $(FUNCTION_H) $(TREE_GIMPLE_H) \ $(TREE_FLOW_H) tree-pass.h $(C_COMMON_H) debug.h $(DIAGNOSTIC_H) \ - $(FIBHEAP_H) output.h $(PARAMS_H) $(RTL_H) $(TIMEVAR_H) ipa-prop.h + $(FIBHEAP_H) output.h $(PARAMS_H) $(RTL_H) $(TIMEVAR_H) ipa-prop.h \ + gt-cgraphunit.h ipa.o : ipa.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(CGRAPH_H) ipa-prop.o : ipa-prop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ langhooks.h $(GGC_H) $(TARGET_H) $(CGRAPH_H) ipa-prop.h \ @@ -2867,7 +2868,7 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/ipa-reference.c $(srcdir)/tree-ssa-structalias.h \ $(srcdir)/tree-ssa-structalias.c \ $(srcdir)/c-pragma.h $(srcdir)/omp-low.c \ - $(srcdir)/targhooks.c $(out_file) \ + $(srcdir)/targhooks.c $(srcdir)/cgraphunit.c $(out_file) \ @all_gtfiles@ GTFILES_FILES_LANGS = @all_gtfiles_files_langs@ @@ -2899,7 +2900,7 @@ gt-tree-profile.h gt-tree-ssa-address.h \ gt-tree-ssanames.h gt-tree-iterator.h gt-gimplify.h \ gt-tree-phinodes.h gt-tree-nested.h \ gt-tree-ssa-operands.h gt-tree-ssa-propagate.h \ -gt-tree-ssa-structalias.h gt-ipa-inline.h \ +gt-tree-ssa-structalias.h gt-ipa-inline.h gt-cgraphunit.h \ gt-stringpool.h gt-targhooks.h gt-omp-low.h : s-gtype ; @true define echo_quoted_to_gtyp diff --git a/gcc/cgraph.c b/gcc/cgraph.c index dc98ccf0958..372b90d5eaa 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -47,9 +47,9 @@ The callgraph: be accessed in such an invisible way and it shall be considered an entry point to the callgraph. - Intraprocedural information: + Interprocedural information: - Callgraph is place to store data needed for intraprocedural optimization. + Callgraph is place to store data needed for interprocedural optimization. All data structures are divided into three components: local_info that is produced while analyzing the function, global_info that is result of global walking of the callgraph on the end of compilation and @@ -921,7 +921,8 @@ cgraph_varpool_reset_queue (void) void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *node) { - if (!node->needed && node->finalized) + if (!node->needed && node->finalized + && !TREE_ASM_WRITTEN (node->decl)) cgraph_varpool_enqueue_needed_node (node); node->needed = 1; } diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 00351d25779..053359277ad 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1,4 +1,4 @@ -/* Callgraph based intraprocedural optimizations. +/* Callgraph based interprocedural optimizations. Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by Jan Hubicka @@ -20,7 +20,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This module implements main driver of compilation process as well as - few basic intraprocedural optimizers. + few basic interprocedural optimizers. The main scope of this file is to act as an interface in between tree based frontends and the backend (and middle end) @@ -174,6 +174,9 @@ static tree record_reference (tree *, int *, void *); static void cgraph_output_pending_asms (void); static void cgraph_increase_alignment (void); +/* Lists all assembled variables to be sent to debugger output later on. */ +static GTY(()) struct cgraph_varpool_node *cgraph_varpool_assembled_nodes_queue; + /* Records tree nodes seen in record_reference. Simply using walk_tree_without_duplicates doesn't guarantee each node is visited once because it gets a new htab upon each recursive call from @@ -856,18 +859,7 @@ cgraph_varpool_assemble_decl (struct cgraph_varpool_node *node) && (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl))) { assemble_variable (decl, 0, 1, 0); - /* Local static variables are never seen by check_global_declarations - so we need to output debug info by hand. */ - if (DECL_CONTEXT (decl) - && (TREE_CODE (DECL_CONTEXT (decl)) == BLOCK - || TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL) - && errorcount == 0 && sorrycount == 0) - { - timevar_push (TV_SYMOUT); - (*debug_hooks->global_decl) (decl); - timevar_pop (TV_SYMOUT); - } - return true; + return TREE_ASM_WRITTEN (decl); } return false; @@ -893,11 +885,39 @@ cgraph_varpool_assemble_pending_decls (void) cgraph_varpool_nodes_queue = cgraph_varpool_nodes_queue->next_needed; if (cgraph_varpool_assemble_decl (node)) - changed = true; - node->next_needed = NULL; + { + changed = true; + node->next_needed = cgraph_varpool_assembled_nodes_queue; + cgraph_varpool_assembled_nodes_queue = node; + node->finalized = 1; + } + else + node->next_needed = NULL; } return changed; } +/* Output all variables enqueued to be assembled. */ +static void +cgraph_varpool_output_debug_info (void) +{ + timevar_push (TV_SYMOUT); + if (errorcount == 0 && sorrycount == 0) + while (cgraph_varpool_assembled_nodes_queue) + { + struct cgraph_varpool_node *node = cgraph_varpool_assembled_nodes_queue; + + /* Local static variables are never seen by check_global_declarations + so we need to output debug info by hand. */ + if (DECL_CONTEXT (node->decl) + && (TREE_CODE (DECL_CONTEXT (node->decl)) == BLOCK + || TREE_CODE (DECL_CONTEXT (node->decl)) == FUNCTION_DECL) + && errorcount == 0 && sorrycount == 0) + (*debug_hooks->global_decl) (node->decl); + cgraph_varpool_assembled_nodes_queue = node->next_needed; + node->next_needed = 0; + } + timevar_pop (TV_SYMOUT); +} /* Output all asm statements we have stored up to be output. */ @@ -1043,6 +1063,7 @@ cgraph_finalize_compilation_unit (void) { cgraph_output_pending_asms (); cgraph_assemble_pending_functions (); + cgraph_varpool_output_debug_info (); return; } @@ -1495,6 +1516,7 @@ cgraph_optimize (void) { cgraph_output_pending_asms (); cgraph_varpool_assemble_pending_decls (); + cgraph_varpool_output_debug_info (); return; } @@ -1506,7 +1528,7 @@ cgraph_optimize (void) timevar_push (TV_CGRAPHOPT); if (!quiet_flag) - fprintf (stderr, "Performing intraprocedural optimizations\n"); + fprintf (stderr, "Performing interprocedural optimizations\n"); cgraph_function_and_variable_visibility (); if (cgraph_dump_file) @@ -1551,6 +1573,7 @@ cgraph_optimize (void) cgraph_varpool_remove_unreferenced_decls (); cgraph_varpool_assemble_pending_decls (); + cgraph_varpool_output_debug_info (); } if (cgraph_dump_file) @@ -1891,3 +1914,4 @@ save_inline_function_body (struct cgraph_node *node) return first_clone; } +#include "gt-cgraphunit.h" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 51f2d928b0d..92a3acbe721 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-08-24 Jan Hubicka + + PR debug/26881 + * gcc.dg/debug/pr26881.c: New file. + 2006-08-23 Paul Thomas PR fortran/28788 diff --git a/gcc/testsuite/gcc.dg/debug/pr26881.c b/gcc/testsuite/gcc.dg/debug/pr26881.c new file mode 100644 index 00000000000..156a2c4550f --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/pr26881.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-g -O0" } */ +int +main (int argc, char **argv) +{ + if (0) + { + static union + { + } + u; + typedef char tt; + static tt c[8]; + return c[0] == 0x01 && c[1] == 0x02; + } +} -- 2.30.2