re checking -fdump-passes
From-SVN: r174930
This commit is contained in:
parent
71fb4f92ba
commit
deced1e236
7 changed files with 164 additions and 7 deletions
|
@ -1,3 +1,13 @@
|
|||
2011-06-10 David Li <davidxl@google.com>
|
||||
|
||||
* cgraphunit.c (cgraph_finalize_compilation_unit): Pass dump.
|
||||
* passes.c (passr_eq): New function.
|
||||
(create_pass_tab): New function.
|
||||
(pass_traverse): New function.
|
||||
(dump_one_pass): New function.
|
||||
(dump_pass_list): New function.
|
||||
(dump_passes): New function.
|
||||
|
||||
2011-06-10 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* cgraph.c (cgraph_set_nothrow_flag_1): Update cgraph after
|
||||
|
@ -331,6 +341,7 @@
|
|||
register classes.
|
||||
* doc/tm.texi: Regenerate.
|
||||
|
||||
>>>>>>> .r174929
|
||||
2011-06-09 Kaz Kojima <kkojima@gcc.gnu.org>
|
||||
|
||||
PR target/49307
|
||||
|
|
|
@ -1106,6 +1106,9 @@ cgraph_finalize_compilation_unit (void)
|
|||
fflush (stderr);
|
||||
}
|
||||
|
||||
if (flag_dump_passes)
|
||||
dump_passes ();
|
||||
|
||||
/* Gimplify and lower all functions, compute reachability and
|
||||
remove unreachable nodes. */
|
||||
cgraph_analyze_functions ();
|
||||
|
|
|
@ -1012,6 +1012,10 @@ fdump-noaddr
|
|||
Common Report Var(flag_dump_noaddr)
|
||||
Suppress output of addresses in debugging dumps
|
||||
|
||||
fdump-passes
|
||||
Common Var(flag_dump_passes) Init(0)
|
||||
Dump optimization passes
|
||||
|
||||
fdump-unnumbered
|
||||
Common Report Var(flag_dump_unnumbered)
|
||||
Suppress output of instruction numbers, line number notes and addresses in debugging dumps
|
||||
|
|
|
@ -291,6 +291,7 @@ Objective-C and Objective-C++ Dialects}.
|
|||
-fdump-translation-unit@r{[}-@var{n}@r{]} @gol
|
||||
-fdump-class-hierarchy@r{[}-@var{n}@r{]} @gol
|
||||
-fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline @gol
|
||||
-fdump-passes @gol
|
||||
-fdump-statistics @gol
|
||||
-fdump-tree-all @gol
|
||||
-fdump-tree-original@r{[}-@var{n}@r{]} @gol
|
||||
|
@ -5071,7 +5072,8 @@ pair seperated by a colon. The range is inclusive in both ends. If the range
|
|||
is trivial, the number pair can be simplified as a single number. If the
|
||||
function's cgraph node's @var{uid} is falling within one of the specified ranges,
|
||||
the @var{pass} is disabled for that function. The @var{uid} is shown in the
|
||||
function header of a dump file.
|
||||
function header of a dump file, and the pass names can be dumped by using
|
||||
option @option{-fdump-passes}.
|
||||
|
||||
@item -fdisable-tree-@var{pass}
|
||||
@item -fdisable-tree-@var{pass}=@var{range-list}
|
||||
|
@ -5495,6 +5497,11 @@ Dump after function inlining.
|
|||
|
||||
@end table
|
||||
|
||||
@item -fdump-passes
|
||||
@opindex fdump-passes
|
||||
Dump the list of optimization passes that are turned on and off by
|
||||
the current command line options.
|
||||
|
||||
@item -fdump-statistics-@var{option}
|
||||
@opindex fdump-statistics
|
||||
Enable and control dumping of pass statistics in a separate file. The
|
||||
|
|
129
gcc/passes.c
129
gcc/passes.c
|
@ -478,7 +478,7 @@ passr_eq (const void *p1, const void *p2)
|
|||
return !strcmp (s1->unique_name, s2->unique_name);
|
||||
}
|
||||
|
||||
static htab_t pass_name_tab = NULL;
|
||||
static htab_t name_to_pass_map = NULL;
|
||||
|
||||
/* Register PASS with NAME. */
|
||||
|
||||
|
@ -488,11 +488,11 @@ register_pass_name (struct opt_pass *pass, const char *name)
|
|||
struct pass_registry **slot;
|
||||
struct pass_registry pr;
|
||||
|
||||
if (!pass_name_tab)
|
||||
pass_name_tab = htab_create (256, passr_hash, passr_eq, NULL);
|
||||
if (!name_to_pass_map)
|
||||
name_to_pass_map = htab_create (256, passr_hash, passr_eq, NULL);
|
||||
|
||||
pr.unique_name = name;
|
||||
slot = (struct pass_registry **) htab_find_slot (pass_name_tab, &pr, INSERT);
|
||||
slot = (struct pass_registry **) htab_find_slot (name_to_pass_map, &pr, INSERT);
|
||||
if (!*slot)
|
||||
{
|
||||
struct pass_registry *new_pr;
|
||||
|
@ -506,6 +506,124 @@ register_pass_name (struct opt_pass *pass, const char *name)
|
|||
return; /* Ignore plugin passes. */
|
||||
}
|
||||
|
||||
/* Map from pass id to canonicalized pass name. */
|
||||
|
||||
typedef const char *char_ptr;
|
||||
DEF_VEC_P(char_ptr);
|
||||
DEF_VEC_ALLOC_P(char_ptr, heap);
|
||||
static VEC(char_ptr, heap) *pass_tab = NULL;
|
||||
|
||||
/* Callback function for traversing NAME_TO_PASS_MAP. */
|
||||
|
||||
static int
|
||||
pass_traverse (void **slot, void *data ATTRIBUTE_UNUSED)
|
||||
{
|
||||
struct pass_registry **p = (struct pass_registry **)slot;
|
||||
struct opt_pass *pass = (*p)->pass;
|
||||
|
||||
gcc_assert (pass->static_pass_number > 0);
|
||||
gcc_assert (pass_tab);
|
||||
|
||||
VEC_replace (char_ptr, pass_tab, pass->static_pass_number,
|
||||
(*p)->unique_name);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* The function traverses NAME_TO_PASS_MAP and creates a pass info
|
||||
table for dumping purpose. */
|
||||
|
||||
static void
|
||||
create_pass_tab (void)
|
||||
{
|
||||
if (!flag_dump_passes)
|
||||
return;
|
||||
|
||||
VEC_safe_grow_cleared (char_ptr, heap,
|
||||
pass_tab, passes_by_id_size + 1);
|
||||
htab_traverse (name_to_pass_map, pass_traverse, NULL);
|
||||
}
|
||||
|
||||
static bool override_gate_status (struct opt_pass *, tree, bool);
|
||||
|
||||
/* Dump the instantiated name for PASS. IS_ON indicates if PASS
|
||||
is turned on or not. */
|
||||
|
||||
static void
|
||||
dump_one_pass (struct opt_pass *pass, int pass_indent)
|
||||
{
|
||||
int indent = 3 * pass_indent;
|
||||
const char *pn;
|
||||
bool is_on, is_really_on;
|
||||
|
||||
is_on = (pass->gate == NULL) ? true : pass->gate();
|
||||
is_really_on = override_gate_status (pass, current_function_decl, is_on);
|
||||
|
||||
if (pass->static_pass_number <= 0)
|
||||
pn = pass->name;
|
||||
else
|
||||
pn = VEC_index (char_ptr, pass_tab, pass->static_pass_number);
|
||||
|
||||
fprintf (stderr, "%*s%-40s%*s:%s%s\n", indent, " ", pn,
|
||||
(15 - indent < 0 ? 0 : 15 - indent), " ",
|
||||
is_on ? " ON" : " OFF",
|
||||
((!is_on) == (!is_really_on) ? ""
|
||||
: (is_really_on ? " (FORCED_ON)" : " (FORCED_OFF)")));
|
||||
}
|
||||
|
||||
/* Dump pass list PASS with indentation INDENT. */
|
||||
|
||||
static void
|
||||
dump_pass_list (struct opt_pass *pass, int indent)
|
||||
{
|
||||
do
|
||||
{
|
||||
dump_one_pass (pass, indent);
|
||||
if (pass->sub)
|
||||
dump_pass_list (pass->sub, indent + 1);
|
||||
pass = pass->next;
|
||||
}
|
||||
while (pass);
|
||||
}
|
||||
|
||||
/* Dump all optimization passes. */
|
||||
|
||||
void
|
||||
dump_passes (void)
|
||||
{
|
||||
struct cgraph_node *n, *node = NULL;
|
||||
tree save_fndecl = current_function_decl;
|
||||
|
||||
create_pass_tab();
|
||||
|
||||
n = cgraph_nodes;
|
||||
while (n)
|
||||
{
|
||||
if (DECL_STRUCT_FUNCTION (n->decl))
|
||||
{
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
push_cfun (DECL_STRUCT_FUNCTION (node->decl));
|
||||
current_function_decl = node->decl;
|
||||
|
||||
dump_pass_list (all_lowering_passes, 1);
|
||||
dump_pass_list (all_small_ipa_passes, 1);
|
||||
dump_pass_list (all_regular_ipa_passes, 1);
|
||||
dump_pass_list (all_lto_gen_passes, 1);
|
||||
dump_pass_list (all_passes, 1);
|
||||
|
||||
pop_cfun ();
|
||||
current_function_decl = save_fndecl;
|
||||
}
|
||||
|
||||
|
||||
/* Returns the pass with NAME. */
|
||||
|
||||
static struct opt_pass *
|
||||
|
@ -513,9 +631,8 @@ get_pass_by_name (const char *name)
|
|||
{
|
||||
struct pass_registry **slot, pr;
|
||||
|
||||
gcc_assert (pass_name_tab);
|
||||
pr.unique_name = name;
|
||||
slot = (struct pass_registry **) htab_find_slot (pass_name_tab,
|
||||
slot = (struct pass_registry **) htab_find_slot (name_to_pass_map,
|
||||
&pr, NO_INSERT);
|
||||
|
||||
if (!slot || !*slot)
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-passes" } */
|
||||
|
||||
unsigned res;
|
||||
|
||||
void
|
||||
foo (unsigned code, int len)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < len; i++)
|
||||
res |= code & 1;
|
||||
}
|
||||
|
||||
/* { dg-prune-output ".*" } */
|
|
@ -639,5 +639,6 @@ extern void do_per_function_toporder (void (*) (void *), void *);
|
|||
|
||||
extern void disable_pass (const char *);
|
||||
extern void enable_pass (const char *);
|
||||
extern void dump_passes (void);
|
||||
|
||||
#endif /* GCC_TREE_PASS_H */
|
||||
|
|
Loading…
Add table
Reference in a new issue