mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 03:46:53 -05:00
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:
committed by
Joern Rennecke
parent
9d335249c9
commit
24a7799ea4
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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}.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 '*':
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
48
gcc/testsuite/gcc.c-torture/unsorted/dump-noaddr.c
Normal file
48
gcc/testsuite/gcc.c-torture/unsorted/dump-noaddr.c
Normal 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;
|
||||
}
|
||||
}
|
||||
49
gcc/testsuite/gcc.c-torture/unsorted/dump-noaddr.x
Normal file
49
gcc/testsuite/gcc.c-torture/unsorted/dump-noaddr.x
Normal 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
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user