re PR other/28251 (dumped addresses makes diffing dumps unusable)

gcc:
	PR other/28251
	* tree.h (dump_addr): Declare.
	* print-tree.c (dump_addr): New function.
	(print_node_brief, print_node): Use it.
	* print-rtl.c (print_rtx): Likewise.
	* common.opt (-fdump-noaddr): New option.
	* doc/invoke.texi (-fdump-noaddr): Document.
	* loop-unroll.c (si_info_hash): Make hash independent of addresses.
	(ve_info_hash): Likewise.
gcc/testsuite:
	PR other/28251
	gcc.c-torture/unsorted/dump-noaddr.c: New test.
	gcc.c-torture/unsorted/dump-noaddr.x: New driver.

From-SVN: r115519
This commit is contained in:
J"orn Rennecke
2006-07-17 14:44:48 +00:00
committed by Joern Rennecke
parent 9d335249c9
commit 24a7799ea4
10 changed files with 159 additions and 25 deletions

View File

@@ -1,3 +1,15 @@
2006-07-17 J"orn Rennecke <joern.rennecke@st.com>
PR other/28251
* tree.h (dump_addr): Declare.
* print-tree.c (dump_addr): New function.
(print_node_brief, print_node): Use it.
* print-rtl.c (print_rtx): Likewise.
* common.opt (-fdump-noaddr): New option.
* doc/invoke.texi (-fdump-noaddr): Document.
* loop-unroll.c (si_info_hash): Make hash independent of addresses.
(ve_info_hash): Likewise.
2006-07-13 Andrew Haley <aph@redhat.com>
PR tree-optimization/19505

View File

@@ -381,9 +381,13 @@ fdump-
Common Joined RejectNegative
-fdump-<type> Dump various compiler internals to a file
fdump-noaddr
Common Report Var(flag_dump_noaddr)
Suppress output of addresses in debugging dumps
fdump-unnumbered
Common Report Var(flag_dump_unnumbered) VarExists
Suppress output of instruction numbers and line number notes in debugging dumps
Suppress output of instruction numbers, line number notes and addresses in debugging dumps
fearly-inlining
Common Report Var(flag_early_inlining) Init(1)

View File

@@ -262,7 +262,7 @@ Objective-C and Objective-C++ Dialects}.
@item Debugging Options
@xref{Debugging Options,,Options for Debugging Your Program or GCC}.
@gccoptlist{-d@var{letters} -dumpspecs -dumpmachine -dumpversion @gol
-fdump-unnumbered -fdump-translation-unit@r{[}-@var{n}@r{]} @gol
-fdump-noaddr -fdump-unnumbered -fdump-translation-unit@r{[}-@var{n}@r{]} @gol
-fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol
-fdump-ipa-all -fdump-ipa-cgraph @gol
-fdump-tree-all @gol
@@ -4005,10 +4005,17 @@ with @samp{r} (@option{-fdump-rtl-expand}).
Dump debugging information during parsing, to standard error.
@end table
@item -fdump-noaddr
@opindex fdump-noaddr
When doing debugging dumps (see @option{-d} option above), suppress
address output. This makes it more feasible to use diff on debugging
dumps for compiler invocations with different compiler binaries and/or
different text / bss / data / heap / stack / dso start locations.
@item -fdump-unnumbered
@opindex fdump-unnumbered
When doing debugging dumps (see @option{-d} option above), suppress instruction
numbers and line number note output. This makes it more feasible to
numbers, line number note and address output. This makes it more feasible to
use diff on debugging dumps for compiler invocations with different
options, in particular with and without @option{-g}.

View File

@@ -1466,7 +1466,7 @@ unroll_loop_stupid (struct loops *loops, struct loop *loop)
static hashval_t
si_info_hash (const void *ivts)
{
return htab_hash_pointer (((struct iv_to_split *) ivts)->insn);
return (hashval_t) INSN_UID (((struct iv_to_split *) ivts)->insn);
}
/* An equality functions for information about insns to split. */
@@ -1485,7 +1485,7 @@ si_info_eq (const void *ivts1, const void *ivts2)
static hashval_t
ve_info_hash (const void *ves)
{
return htab_hash_pointer (((struct var_to_expand *) ves)->insn);
return (hashval_t) INSN_UID (((struct var_to_expand *) ves)->insn);
}
/* Return true if IVTS1 and IVTS2 (which are really both of type

View File

@@ -283,12 +283,9 @@ print_rtx (rtx in_rtx)
case NOTE_INSN_BLOCK_BEG:
case NOTE_INSN_BLOCK_END:
fprintf (outfile, " ");
if (flag_dump_unnumbered)
fprintf (outfile, "#");
else
fprintf (outfile, "%p",
(char *) NOTE_BLOCK (in_rtx));
#ifndef GENERATOR_FILE
dump_addr (outfile, " ", NOTE_BLOCK (in_rtx));
#endif
sawclose = 1;
break;
@@ -539,7 +536,9 @@ print_rtx (rtx in_rtx)
break;
case 't':
fprintf (outfile, " %p", (void *) XTREE (in_rtx, i));
#ifndef GENERATOR_FILE
dump_addr (outfile, " ", XTREE (in_rtx, i));
#endif
break;
case '*':

View File

@@ -57,6 +57,16 @@ debug_tree (tree node)
putc ('\n', stderr);
}
/* Print PREFIX and ADDR to FILE. */
void
dump_addr (FILE *file, const char *prefix, void *addr)
{
if (flag_dump_noaddr || flag_dump_unnumbered)
fprintf (file, "%s#", prefix);
else
fprintf (file, "%s%p", prefix, addr);
}
/* Print a node in brief fashion, with just the code, address and name. */
void
@@ -73,8 +83,8 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent)
name if any. */
if (indent > 0)
fprintf (file, " ");
fprintf (file, "%s <%s %p",
prefix, tree_code_name[(int) TREE_CODE (node)], (char *) node);
fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]);
dump_addr (file, " ", node);
if (class == tcc_declaration)
{
@@ -218,8 +228,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
indent_to (file, indent);
/* Print the slot this node is in, and its code, and address. */
fprintf (file, "%s <%s %p",
prefix, tree_code_name[(int) TREE_CODE (node)], (void *) node);
fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]);
dump_addr (file, " ", node);
/* Print the name, if any. */
if (class == tcc_declaration)
@@ -505,8 +515,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
&& DECL_STRUCT_FUNCTION (node) != 0)
{
indent_to (file, indent + 4);
fprintf (file, "saved-insns %p",
(void *) DECL_STRUCT_FUNCTION (node));
dump_addr (file, "saved-insns ", DECL_STRUCT_FUNCTION (node));
}
if ((TREE_CODE (node) == VAR_DECL || TREE_CODE (node) == PARM_DECL)
@@ -778,15 +787,16 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
break;
case STATEMENT_LIST:
fprintf (file, " head %p tail %p stmts",
(void *) node->stmt_list.head, (void *) node->stmt_list.tail);
dump_addr (file, " head ", node->stmt_list.head);
dump_addr (file, " tail ", node->stmt_list.tail);
fprintf (file, " stmts");
{
tree_stmt_iterator i;
for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
{
/* Not printing the addresses of the (not-a-tree)
'struct tree_stmt_list_node's. */
fprintf (file, " %p", (void *)tsi_stmt (i));
dump_addr (file, " ", tsi_stmt (i));
}
fprintf (file, "\n");
for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
@@ -826,11 +836,9 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
{
indent_to (file, indent + 3);
if (SSA_NAME_PTR_INFO (node))
fprintf (file, " ptr-info %p",
(void *) SSA_NAME_PTR_INFO (node));
dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
if (SSA_NAME_VALUE (node))
fprintf (file, " value %p",
(void *) SSA_NAME_VALUE (node));
dump_addr (file, " value ", SSA_NAME_VALUE (node));
}
break;

View File

@@ -1,3 +1,9 @@
2006-07-17 J"orn Rennecke <joern.rennecke@st.com>
PR other/28251
gcc.c-torture/unsorted/dump-noaddr.c: New test.
gcc.c-torture/unsorted/dump-noaddr.x: New driver.
2006-07-17 Richard Guenther <rguenther@suse.de>
PR tree-optimization/28238

View File

@@ -0,0 +1,48 @@
#if MASK & 1
#define t16(x) x x x x x x x x x x x x x x x x
#define M (sizeof (t16(t16(t16(t16(t16(" ")))))) - 1)
#endif
#if MASK & 2
#define M 1048576
#endif
typedef struct s {
int c;
void *vp;
struct s *s;
}s;
typedef int (*fpt) (const char *, void *, int *);
int M_var = M;
extern void exit (int);
int
f (int start, int end, int *a, int *b, int c, s *sp)
{
int count = 0;
int i;
for (i = start; i <= end; i++)
{
a[i] = b[i] + c;
count ++;
}
(*(fpt)sp->s->vp) ("Hello World!\n", &exit, &M_var);
return count;
}
int
g (int i)
{
switch (i)
{
case 1: return 42;
case 2: return 60;
case 3: return 7;
case 4: return 3;
case 5: return M;
default: return 0;
}
}

View File

@@ -0,0 +1,49 @@
# This checks if -fdump-noaddr dumps are done consistently.
proc dump_compare { src options } {
global srcdir subdir
global tmpdir
exec echo $src
global torture_with_loops
set option_list $torture_with_loops
set dumpbase dump-noaddr
# ??? passing -dumpbase to the gcc driver doesn't work, since it will pass
# another -dumpbase option to override it.
# loop through all the options
foreach option $option_list {
# c-torture-compile ${dumpbase}_1 "$option $options -DMASK=1 -x c -da -fdump-tree-all"
# c-torture-compile ${dumpbase}_2 "$option $options -DMASK=2 -x c -da -fdump-tree-all"
# c-torture-compile ${dumpbase}_3 "$option $options -DMASK=3 -x c -da -fdump-tree-all"
file delete -force dump1
file delete -force dump2
file mkdir dump1
file mkdir dump2
cd dump1
c-torture-compile $src "$option $options -DMASK=1 -x c --param ggc-min-heapsize=1 -da -fdump-tree-all -fdump-noaddr"
cd ../dump2
c-torture-compile $src "$option $options -DMASK=2 -x c -da -fdump-tree-all -fdump-noaddr"
cd ..
foreach dump1 [lsort [glob -nocomplain dump1/*]] {
regsub dump1/ $dump1 dump2/ dump2
set dumptail [file tail $dump1]
#puts "$option $dump1"
set tmp [ diff "$dump1" "$dump2" ]
if { $tmp == 0 } {
untested "$option $dumptail comparison"
} elseif { $tmp == 1 } {
pass "$option $dumptail comparison"
} else {
fail "$option $dumptail comparison"
}
#exec diff $dump1 $dump2
}
}
file delete -force dump1
file delete -force dump2
}
catch {dump_compare $src $options} result
puts $result
verbose result
return 1

View File

@@ -4340,6 +4340,7 @@ extern void print_rtl (FILE *, rtx);
/* In print-tree.c */
extern void debug_tree (tree);
#ifdef BUFSIZ
extern void dump_addr (FILE*, const char *, void *);
extern void print_node (FILE *, const char *, tree, int);
extern void print_node_brief (FILE *, const char *, tree, int);
extern void indent_to (FILE *, int);