aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-24 13:30:45 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-24 13:30:45 +0000
commitcd6bca0272fbfc3d7d64b9d399f2aae4f7514587 (patch)
tree2478b3f5d0e0838e0af2b96bb6f0306cfbf4000d
parente9c873a4dc2262748f2d8392bae51487fc5f06b9 (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116374 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/Makefile.in7
-rw-r--r--gcc/cgraph.c7
-rw-r--r--gcc/cgraphunit.c58
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/debug/pr26881.c16
6 files changed, 83 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d62c53b9623..a201c69d3ba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,18 @@
2006-08-24 Jan Hubicka <jh@suse.cz>
+ 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 <jh@suse.cz>
+
* predict.c (probability_reliable_p): New predicate.
(edge_probability_reliable_p, br_prob_note_reliable_p): Likewise.
(predict_loops): Do not predict loop exit with less than 2%
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 <jh@suse.cz>
+
+ PR debug/26881
+ * gcc.dg/debug/pr26881.c: New file.
+
2006-08-23 Paul Thomas <pault@gcc.gnu.org>
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;
+ }
+}