From 1a6f1dc6333bef2a643eacacbbc31f83a10e28ee Mon Sep 17 00:00:00 2001
From: marxin <mliska@suse.cz>
Date: Tue, 9 May 2017 13:22:23 +0200
Subject: [PATCH 1/2] Port -fopt-info to new option infrastructure.
---
gcc/dumpfile.c | 332 ++++++++++++++++++++++++++------------------------------
gcc/dumpfile.h | 125 ++++++++++++++-------
gcc/passes.c | 2 +-
gcc/tree-pass.h | 2 +-
4 files changed, 240 insertions(+), 221 deletions(-)
@@ -33,10 +33,10 @@ along with GCC; see the file COPYING3. If not see
#define skip_leading_substring(whole, part) \
(strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part))
-static dump_flags_t pflags; /* current dump_flags */
-static dump_flags_t alt_flags; /* current opt_info flags */
+static dump_flags_t pflags; /* current dump_flags */
+static optgroup_dump_flags_t opt_info_flags; /* current opt_info flags */
-static void dump_loc (dump_flags_t, FILE *, source_location);
+static void dump_loc (optgroup_dump_flags_t, FILE *, source_location);
static FILE *dump_open_alternate_stream (struct dump_file_info *);
/* These are currently used for communicating between passes.
@@ -51,31 +51,33 @@ dump_flags_t dump_flags;
TREE_DUMP_INDEX enumeration in dumpfile.h. */
static struct dump_file_info dump_files[TDI_end] =
{
- {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, false, false},
+ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, optgroup_dump_flags_t (),
+ optgroup_dump_flags_t (), 0, 0, 0, false, false},
{".cgraph", "ipa-cgraph", NULL, NULL, NULL, NULL, NULL, TDF_IPA,
- 0, 0, 0, 0, 0, false, false},
- {".type-inheritance", "ipa-type-inheritance", NULL, NULL, NULL, NULL, NULL, TDF_IPA,
- 0, 0, 0, 0, 0, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 0, false, false},
+ {".type-inheritance", "ipa-type-inheritance", NULL, NULL, NULL, NULL, NULL,
+ TDF_IPA, optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 0,
+ false, false},
{".ipa-clones", "ipa-clones", NULL, NULL, NULL, NULL, NULL, TDF_IPA,
- 0, 0, 0, 0, 0, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 0, false, false},
{".tu", "translation-unit", NULL, NULL, NULL, NULL, NULL, TDF_TREE,
- 0, 0, 0, 0, 1, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 1, false, false},
{".class", "class-hierarchy", NULL, NULL, NULL, NULL, NULL, TDF_TREE,
- 0, 0, 0, 0, 2, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 2, false, false},
{".original", "tree-original", NULL, NULL, NULL, NULL, NULL, TDF_TREE,
- 0, 0, 0, 0, 3, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 3, false, false},
{".gimple", "tree-gimple", NULL, NULL, NULL, NULL, NULL, TDF_TREE,
- 0, 0, 0, 0, 4, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 4, false, false},
{".nested", "tree-nested", NULL, NULL, NULL, NULL, NULL, TDF_TREE,
- 0, 0, 0, 0, 5, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 5, false, false},
#define FIRST_AUTO_NUMBERED_DUMP 6
{NULL, "tree-all", NULL, NULL, NULL, NULL, NULL, TDF_TREE,
- 0, 0, 0, 0, 0, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 0, false, false},
{NULL, "rtl-all", NULL, NULL, NULL, NULL, NULL, TDF_RTL,
- 0, 0, 0, 0, 0, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 0, false, false},
{NULL, "ipa-all", NULL, NULL, NULL, NULL, NULL, TDF_IPA,
- 0, 0, 0, 0, 0, false, false},
+ optgroup_dump_flags_t (), optgroup_dump_flags_t (), 0, 0, 0, false, false},
};
/* Define a name->number mapping for a dump flag value. */
@@ -94,9 +96,7 @@ static const struct dump_option_value_info dump_options[] =
{"slim", TDF_SLIM},
{"raw", TDF_RAW},
{"graph", TDF_GRAPH},
- {"details", (TDF_DETAILS | MSG_OPTIMIZED_LOCATIONS
- | MSG_MISSED_OPTIMIZATION
- | MSG_NOTE)},
+ {"details", TDF_DETAILS},
{"cselib", TDF_CSELIB},
{"stats", TDF_STATS},
{"blocks", TDF_BLOCKS},
@@ -112,10 +112,6 @@ static const struct dump_option_value_info dump_options[] =
{"enumerate_locals", TDF_ENUMERATE_LOCALS},
{"scev", TDF_SCEV},
{"gimple", TDF_GIMPLE},
- {"optimized", MSG_OPTIMIZED_LOCATIONS},
- {"missed", MSG_MISSED_OPTIMIZATION},
- {"note", MSG_NOTE},
- {"optall", MSG_ALL},
{"all", ~(TDF_RAW | TDF_SLIM | TDF_LINENO | TDF_TREE | TDF_RTL | TDF_IPA
| TDF_STMTADDR | TDF_GRAPH | TDF_DIAGNOSTIC | TDF_VERBOSE
| TDF_RHS_ONLY | TDF_NOUID | TDF_ENUMERATE_LOCALS | TDF_SCEV
@@ -123,18 +119,6 @@ static const struct dump_option_value_info dump_options[] =
{NULL, 0}
};
-/* A subset of the dump_options table which is used for -fopt-info
- types. This must be consistent with the MSG_* flags in dumpfile.h.
- */
-static const struct dump_option_value_info optinfo_verbosity_options[] =
-{
- {"optimized", MSG_OPTIMIZED_LOCATIONS},
- {"missed", MSG_MISSED_OPTIMIZATION},
- {"note", MSG_NOTE},
- {"all", MSG_ALL},
- {NULL, 0}
-};
-
template <typename E>
dump_option_node<E>::dump_option_node (const char *name, E enum_value):
m_name (name), m_enum_value (enum_value), m_children (), m_mask (0)
@@ -179,7 +163,7 @@ uint64_t
dump_option_node<E>::parse (const char *token)
{
char *s = xstrdup (token);
- uint64_t r = parse (s);
+ uint64_t r = parse (strtok (s, "-"));
free (s);
return r;
@@ -189,6 +173,13 @@ template <typename E>
uint64_t
dump_option_node<E>::parse (char *token)
{
+ return parse_internal (strtok (token, "-"));
+}
+
+template <typename E>
+uint64_t
+dump_option_node<E>::parse_internal (char *token)
+{
if (token == NULL)
return m_mask;
@@ -202,19 +193,61 @@ dump_option_node<E>::parse (char *token)
if (strcmp (m_children[i]->m_name, token) == 0)
{
token = strtok (NULL, "-");
- return m_children[i]->parse (token);
+ return m_children[i]->parse_internal (token);
}
return 0;
}
+optgroup_option_hierarchy::optgroup_option_hierarchy ()
+{
+ root = new node (NULL, OPTGROUP_NONE);
+
+ node *n = new node ("ipa", OPTGROUP_IPA);
+ n->register_suboption (new node ("optimized", OPTGROUP_IPA_OPTIMIZED));
+ n->register_suboption (new node ("missed", OPTGROUP_IPA_MISSED));
+ n->register_suboption (new node ("note", OPTGROUP_IPA_NOTE));
+ root->register_suboption (n);
+
+ n = new node ("loop", OPTGROUP_LOOP);
+ n->register_suboption (new node ("optimized", OPTGROUP_LOOP_OPTIMIZED));
+ n->register_suboption (new node ("missed", OPTGROUP_LOOP_MISSED));
+ n->register_suboption (new node ("note", OPTGROUP_LOOP_NOTE));
+ root->register_suboption (n);
+
+ n = new node ("inline", OPTGROUP_INLINE);
+ n->register_suboption (new node ("optimized", OPTGROUP_INLINE_OPTIMIZED));
+ n->register_suboption (new node ("missed", OPTGROUP_INLINE_MISSED));
+ n->register_suboption (new node ("note", OPTGROUP_INLINE_NOTE));
+ root->register_suboption (n);
+
+ n = new node ("omp", OPTGROUP_OMP);
+ n->register_suboption (new node ("optimized", OPTGROUP_OMP_OPTIMIZED));
+ n->register_suboption (new node ("missed", OPTGROUP_OMP_MISSED));
+ n->register_suboption (new node ("note", OPTGROUP_OMP_NOTE));
+ root->register_suboption (n);
+
+ n = new node ("vec", OPTGROUP_VEC);
+ n->register_suboption (new node ("optimized", OPTGROUP_VEC_OPTIMIZED));
+ n->register_suboption (new node ("missed", OPTGROUP_VEC_MISSED));
+ n->register_suboption (new node ("note", OPTGROUP_VEC_NOTE));
+ root->register_suboption (n);
+
+ n = new node ("other", OPTGROUP_OTHER);
+ n->register_suboption (new node ("optimized", OPTGROUP_OTHER_OPTIMIZED));
+ n->register_suboption (new node ("missed", OPTGROUP_OTHER_MISSED));
+ n->register_suboption (new node ("note", OPTGROUP_OTHER_NOTE));
+ root->register_suboption (n);
+
+ root->initialize (optgroup_dump_flags_t::m_mask_translation);
+}
+
gcc::dump_manager::dump_manager ():
m_next_dump (FIRST_AUTO_NUMBERED_DUMP),
m_extra_dump_files (NULL),
m_extra_dump_files_in_use (0),
m_extra_dump_files_alloced (0)
{
- initialize_options ();
}
gcc::dump_manager::~dump_manager ()
@@ -236,14 +269,12 @@ gcc::dump_manager::~dump_manager ()
XDELETEVEC (const_cast <char *> (dfi->alt_filename));
}
XDELETEVEC (m_extra_dump_files);
-
- delete (optgroup_options);
}
unsigned int
gcc::dump_manager::
dump_register (const char *suffix, const char *swtch, const char *glob,
- dump_flags_t flags, optgroup_dump_flags_t optgroup_flags,
+ dump_flags_t flags, optgroup_dump_flags_t optgroup_flags,
bool take_ownership)
{
int num = m_next_dump++;
@@ -266,7 +297,7 @@ dump_register (const char *suffix, const char *swtch, const char *glob,
m_extra_dump_files[count].swtch = swtch;
m_extra_dump_files[count].glob = glob;
m_extra_dump_files[count].pflags = flags;
- m_extra_dump_files[count].optgroup_flags = optgroup_flags;
+ m_extra_dump_files[count].pass_optgroup_flags = optgroup_flags;
m_extra_dump_files[count].num = num;
m_extra_dump_files[count].owns_strings = take_ownership;
@@ -393,7 +424,7 @@ dump_open_alternate_stream (struct dump_file_info *dfi)
/* Print source location on DFILE if enabled. */
void
-dump_loc (dump_flags_t dump_kind, FILE *dfile, source_location loc)
+dump_loc (optgroup_dump_flags_t dump_kind, FILE *dfile, source_location loc)
{
if (dump_kind)
{
@@ -412,29 +443,30 @@ dump_loc (dump_flags_t dump_kind, FILE *dfile, source_location loc)
EXTRA_DUMP_FLAGS on the dump streams if DUMP_KIND is enabled. */
void
-dump_gimple_stmt (dump_flags_t dump_kind, dump_flags_t extra_dump_flags,
+dump_gimple_stmt (optgroup_dump_flags_t dump_kind,
+ dump_flags_t extra_dump_flags,
gimple *gs, int spc)
{
- if (dump_file && (dump_kind & pflags))
+ if (dump_file)
print_gimple_stmt (dump_file, gs, spc, dump_flags | extra_dump_flags);
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
print_gimple_stmt (alt_dump_file, gs, spc, dump_flags | extra_dump_flags);
}
/* Similar to dump_gimple_stmt, except additionally print source location. */
void
-dump_gimple_stmt_loc (dump_flags_t dump_kind, source_location loc,
+dump_gimple_stmt_loc (optgroup_dump_flags_t dump_kind, source_location loc,
dump_flags_t extra_dump_flags, gimple *gs, int spc)
{
- if (dump_file && (dump_kind & pflags))
+ if (dump_file)
{
dump_loc (dump_kind, dump_file, loc);
print_gimple_stmt (dump_file, gs, spc, dump_flags | extra_dump_flags);
}
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
{
dump_loc (dump_kind, alt_dump_file, loc);
print_gimple_stmt (alt_dump_file, gs, spc, dump_flags | extra_dump_flags);
@@ -445,13 +477,14 @@ dump_gimple_stmt_loc (dump_flags_t dump_kind, source_location loc,
DUMP_KIND is enabled. */
void
-dump_generic_expr (dump_flags_t dump_kind, dump_flags_t extra_dump_flags,
+dump_generic_expr (optgroup_dump_flags_t dump_kind,
+ dump_flags_t extra_dump_flags,
tree t)
{
- if (dump_file && (dump_kind & pflags))
+ if (dump_file)
print_generic_expr (dump_file, t, dump_flags | extra_dump_flags);
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
print_generic_expr (alt_dump_file, t, dump_flags | extra_dump_flags);
}
@@ -460,16 +493,16 @@ dump_generic_expr (dump_flags_t dump_kind, dump_flags_t extra_dump_flags,
location. */
void
-dump_generic_expr_loc (int dump_kind, source_location loc,
+dump_generic_expr_loc (optgroup_dump_flags_t dump_kind, source_location loc,
dump_flags_t extra_dump_flags, tree t)
{
- if (dump_file && (dump_kind & pflags))
+ if (dump_file)
{
dump_loc (dump_kind, dump_file, loc);
print_generic_expr (dump_file, t, dump_flags | extra_dump_flags);
}
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
{
dump_loc (dump_kind, alt_dump_file, loc);
print_generic_expr (alt_dump_file, t, dump_flags | extra_dump_flags);
@@ -479,9 +512,9 @@ dump_generic_expr_loc (int dump_kind, source_location loc,
/* Output a formatted message using FORMAT on appropriate dump streams. */
void
-dump_printf (dump_flags_t dump_kind, const char *format, ...)
+dump_printf (optgroup_dump_flags_t dump_kind, const char *format, ...)
{
- if (dump_file && (dump_kind & pflags))
+ if (dump_file)
{
va_list ap;
va_start (ap, format);
@@ -489,7 +522,7 @@ dump_printf (dump_flags_t dump_kind, const char *format, ...)
va_end (ap);
}
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
{
va_list ap;
va_start (ap, format);
@@ -501,10 +534,10 @@ dump_printf (dump_flags_t dump_kind, const char *format, ...)
/* Similar to dump_printf, except source location is also printed. */
void
-dump_printf_loc (dump_flags_t dump_kind, source_location loc,
+dump_printf_loc (optgroup_dump_flags_t dump_kind, source_location loc,
const char *format, ...)
{
- if (dump_file && (dump_kind & pflags))
+ if (dump_file)
{
va_list ap;
dump_loc (dump_kind, dump_file, loc);
@@ -513,7 +546,7 @@ dump_printf_loc (dump_flags_t dump_kind, source_location loc,
va_end (ap);
}
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
{
va_list ap;
dump_loc (dump_kind, alt_dump_file, loc);
@@ -570,7 +603,7 @@ dump_start (int phase, dump_flags_t *flag_ptr)
count++;
alt_dump_file = dfi->alt_stream;
/* Initialize current -fopt-info flags. */
- alt_flags = dfi->alt_flags;
+ opt_info_flags = dfi->optgroup_flags;
}
if (flag_ptr)
@@ -605,7 +638,7 @@ dump_finish (int phase)
dump_file = NULL;
alt_dump_file = NULL;
dump_flags = TDI_none;
- alt_flags = 0;
+ opt_info_flags = optgroup_dump_flags_t ();
pflags = 0;
}
@@ -781,45 +814,45 @@ dump_enable_all (dump_flags_t flags, const char *filename)
int
gcc::dump_manager::
opt_info_enable_passes (optgroup_dump_flags_t optgroup_flags,
- dump_flags_t flags, const char *filename)
+ const char *filename)
{
int n = 0;
size_t i;
for (i = TDI_none + 1; i < (size_t) TDI_end; i++)
{
- if ((dump_files[i].optgroup_flags & optgroup_flags))
- {
- const char *old_filename = dump_files[i].alt_filename;
- /* Since this file is shared among different passes, it
- should be opened in append mode. */
- dump_files[i].alt_state = 1;
- dump_files[i].alt_flags |= flags;
- n++;
- /* Override the existing filename. */
- if (filename)
- dump_files[i].alt_filename = xstrdup (filename);
- if (old_filename && filename != old_filename)
- free (CONST_CAST (char *, old_filename));
- }
+ if ((dump_files[i].pass_optgroup_flags & optgroup_flags))
+ {
+ const char *old_filename = dump_files[i].alt_filename;
+ /* Since this file is shared among different passes, it
+ should be opened in append mode. */
+ dump_files[i].alt_state = 1;
+ dump_files[i].optgroup_flags |= optgroup_flags;
+ n++;
+ /* Override the existing filename. */
+ if (filename)
+ dump_files[i].alt_filename = xstrdup (filename);
+ if (old_filename && filename != old_filename)
+ free (CONST_CAST (char *, old_filename));
+ }
}
for (i = 0; i < m_extra_dump_files_in_use; i++)
{
- if ((m_extra_dump_files[i].optgroup_flags & optgroup_flags))
- {
- const char *old_filename = m_extra_dump_files[i].alt_filename;
- /* Since this file is shared among different passes, it
- should be opened in append mode. */
- m_extra_dump_files[i].alt_state = 1;
- m_extra_dump_files[i].alt_flags |= flags;
- n++;
- /* Override the existing filename. */
- if (filename)
- m_extra_dump_files[i].alt_filename = xstrdup (filename);
- if (old_filename && filename != old_filename)
- free (CONST_CAST (char *, old_filename));
- }
+ if ((m_extra_dump_files[i].pass_optgroup_flags & optgroup_flags))
+ {
+ const char *old_filename = m_extra_dump_files[i].alt_filename;
+ /* Since this file is shared among different passes, it
+ should be opened in append mode. */
+ m_extra_dump_files[i].alt_state = 1;
+ m_extra_dump_files[i].optgroup_flags |= optgroup_flags;
+ n++;
+ /* Override the existing filename. */
+ if (filename)
+ m_extra_dump_files[i].alt_filename = xstrdup (filename);
+ if (old_filename && filename != old_filename)
+ free (CONST_CAST (char *, old_filename));
+ }
}
return n;
@@ -929,101 +962,49 @@ dump_switch_p (const char *arg)
return any;
}
-void
-gcc::dump_manager::
-initialize_options ()
-{
- /* Initialize optgroup options. */
- typedef dump_option_node<optgroup_types> node;
-
- optgroup_options = new node (NULL, OPTGROUP_NONE);
- optgroup_options->register_suboption (new node ("ipa", OPTGROUP_IPA));
- optgroup_options->register_suboption (new node ("loop", OPTGROUP_LOOP));
- optgroup_options->register_suboption (new node ("inline", OPTGROUP_INLINE));
- optgroup_options->register_suboption (new node ("omp", OPTGROUP_OMP));
- optgroup_options->register_suboption (new node ("vec", OPTGROUP_VEC));
- optgroup_options->register_suboption (new node ("other", OPTGROUP_OTHER));
-
- optgroup_options->initialize (optgroup_dump_flags_t::m_mask_translation);
-}
+static optgroup_option_hierarchy optgroup_options __attribute__
+((init_priority((200))));
/* Parse ARG as a -fopt-info switch and store flags, optgroup_flags
and filename. Return non-zero if it is a recognized switch. */
static int
-opt_info_switch_p_1 (const char *arg, dump_flags_t *flags,
- optgroup_dump_flags_t *optgroup_flags,
+opt_info_switch_p_1 (const char *arg, optgroup_dump_flags_t *optgroup_flags,
char **filename)
{
- const char *option_value;
- const char *ptr;
- optgroup_dump_flags_t f;
- gcc::dump_manager *dumps = g->get_dumps ();
-
- option_value = arg;
- ptr = option_value;
-
+ char *option_value;
*filename = NULL;
- *flags = 0;
- *optgroup_flags = 0;
+ *optgroup_flags = optgroup_dump_flags_t ();
- if (!ptr)
+ if (!arg)
return 1; /* Handle '-fopt-info' without any additional options. */
+ option_value = xstrdup (arg);
- while (*ptr)
+ char *eq_ptr = strchr (option_value, '=');
+ if (eq_ptr)
{
- const struct dump_option_value_info *option_ptr;
- const char *end_ptr;
- const char *eq_ptr;
- unsigned length;
-
- while (*ptr == '-')
- ptr++;
- end_ptr = strchr (ptr, '-');
- eq_ptr = strchr (ptr, '=');
-
- if (eq_ptr && !end_ptr)
- end_ptr = eq_ptr;
-
- if (!end_ptr)
- end_ptr = ptr + strlen (ptr);
- length = end_ptr - ptr;
-
- for (option_ptr = optinfo_verbosity_options; option_ptr->name;
- option_ptr++)
- if (strlen (option_ptr->name) == length
- && !memcmp (option_ptr->name, ptr, length))
- {
- *flags |= option_ptr->value;
- goto found;
- }
+ *filename = xstrdup (eq_ptr + 1);
+ *eq_ptr = '\0';
+ }
- f = dumps->get_optgroup_options ()->parse (ptr);
- if (f)
- {
- *optgroup_flags |= f;
- goto found;
- }
- if (*ptr == '=')
- {
- /* Interpret rest of the argument as a dump filename. This
- filename overrides other command line filenames. */
- *filename = xstrdup (ptr + 1);
- break;
- }
- else
- {
- warning (0, "unknown option %q.*s in %<-fopt-info-%s%>",
- length, ptr, arg);
- return 0;
- }
- found:;
- ptr = end_ptr;
+ optgroup_dump_flags_t f;
+ f = optgroup_dump_flags_t::from_mask
+ (optgroup_options.root->parse (option_value));
+ if (f)
+ {
+ *optgroup_flags |= f;
+ free (option_value);
+ return 1;
+ }
+ else
+ {
+ warning (0, "unknown option %s in %<-fopt-info-%s%>",
+ option_value, option_value);
+ free (option_value);
+ return 0;
}
-
- return 1;
}
/* Return non-zero if ARG is a recognized switch for
@@ -1032,13 +1013,12 @@ opt_info_switch_p_1 (const char *arg, dump_flags_t *flags,
int
opt_info_switch_p (const char *arg)
{
- dump_flags_t flags;
optgroup_dump_flags_t optgroup_flags;
char *filename;
static char *file_seen = NULL;
gcc::dump_manager *dumps = g->get_dumps ();
- if (!opt_info_switch_p_1 (arg, &flags, &optgroup_flags, &filename))
+ if (!opt_info_switch_p_1 (arg, &optgroup_flags, &filename))
return 0;
if (!filename)
@@ -1053,12 +1033,10 @@ opt_info_switch_p (const char *arg)
}
file_seen = xstrdup (filename);
- if (!flags)
- flags = MSG_OPTIMIZED_LOCATIONS;
if (!optgroup_flags)
optgroup_flags = optgroup_dump_flags_t::get_all ();
- return dumps->opt_info_enable_passes (optgroup_flags, flags, filename);
+ return dumps->opt_info_enable_passes (optgroup_flags, filename);
}
/* Print basic block on the dump streams. */
@@ -1068,7 +1046,7 @@ dump_basic_block (int dump_kind, basic_block bb, int indent)
{
if (dump_file && (dump_kind & pflags))
dump_bb (dump_file, bb, indent, TDF_DETAILS);
- if (alt_dump_file && (dump_kind & alt_flags))
+ if (alt_dump_file && (dump_kind & opt_info_flags))
dump_bb (alt_dump_file, bb, indent, TDF_DETAILS);
}
@@ -84,11 +84,6 @@ enum tree_dump_index
#define TDF_SCEV (1 << 24) /* Dump SCEV details. */
#define TDF_COMMENT (1 << 25) /* Dump lines with prefix ";;" */
#define TDF_GIMPLE (1 << 26) /* Dump in GIMPLE FE syntax */
-#define MSG_OPTIMIZED_LOCATIONS (1 << 27) /* -fopt-info optimized sources */
-#define MSG_MISSED_OPTIMIZATION (1 << 28) /* missed opportunities */
-#define MSG_NOTE (1 << 29) /* general optimization info */
-#define MSG_ALL (MSG_OPTIMIZED_LOCATIONS | MSG_MISSED_OPTIMIZATION \
- | MSG_NOTE)
/* Dump option node is a tree structure that implements
parsing of suboptions and provides mapping between a given enum type E
@@ -106,6 +101,9 @@ struct dump_option_node
/* Parse a given option string and return mask. */
uint64_t parse (const char *token);
+ /* Parse a given option string and return mask. */
+ uint64_t parse (char *token);
+
/* Register a SUBOPTION for a dump option node. */
void register_suboption (dump_option_node<E> *suboption)
{
@@ -118,7 +116,7 @@ private:
uint64_t initialize_masks (unsigned *current, uint64_t *mask_translation);
/* Parse a given option string and return mask. */
- uint64_t parse (char *token);
+ uint64_t parse_internal (char *token);
/* Name of the option. */
const char *m_name;
@@ -146,15 +144,21 @@ struct dump_flags_type
dump_flags_type<E> (): m_mask (0)
{}
- /* Constructor for a MASK. */
- dump_flags_type<E> (uint64_t mask): m_mask (mask)
- {}
-
/* Constructor for a enum value E. */
dump_flags_type<E> (E enum_value)
{
gcc_checking_assert ((unsigned)enum_value <= OPT_MASK_SIZE);
m_mask = m_mask_translation[enum_value];
+ gcc_checking_assert (m_mask != 0);
+ }
+
+ /* Constructor for two enum values. */
+ dump_flags_type<E> (E enum_value, E enum_value2)
+ {
+ gcc_checking_assert ((unsigned)enum_value <= OPT_MASK_SIZE);
+ gcc_checking_assert ((unsigned)enum_value2 <= OPT_MASK_SIZE);
+ m_mask = m_mask_translation[enum_value] | m_mask_translation[enum_value2];
+ gcc_checking_assert (m_mask != 0);
}
/* OR operator for OTHER dump_flags_type. */
@@ -181,6 +185,12 @@ struct dump_flags_type
return m_mask;
}
+ /* Return dump_flags_type for a computed mask. */
+ static inline dump_flags_type from_mask (uint64_t mask)
+ {
+ return dump_flags_type (mask);
+ }
+
/* Return mask that represents all selected options. */
static inline dump_flags_type get_all ()
{
@@ -195,6 +205,12 @@ struct dump_flags_type
/* Translation table between enum values and masks. */
static uint64_t m_mask_translation[OPT_MASK_SIZE];
+
+private:
+ /* Constructor. */
+ dump_flags_type<E> (uint64_t mask): m_mask (mask)
+ {}
+
};
/* Flags used for -fopt-info groups. */
@@ -203,11 +219,29 @@ enum optgroup_types
{
OPTGROUP_NONE,
OPTGROUP_IPA,
+ OPTGROUP_IPA_OPTIMIZED,
+ OPTGROUP_IPA_MISSED,
+ OPTGROUP_IPA_NOTE,
OPTGROUP_LOOP,
+ OPTGROUP_LOOP_OPTIMIZED,
+ OPTGROUP_LOOP_MISSED,
+ OPTGROUP_LOOP_NOTE,
OPTGROUP_INLINE,
+ OPTGROUP_INLINE_OPTIMIZED,
+ OPTGROUP_INLINE_MISSED,
+ OPTGROUP_INLINE_NOTE,
OPTGROUP_OMP,
+ OPTGROUP_OMP_OPTIMIZED,
+ OPTGROUP_OMP_MISSED,
+ OPTGROUP_OMP_NOTE,
OPTGROUP_VEC,
+ OPTGROUP_VEC_OPTIMIZED,
+ OPTGROUP_VEC_MISSED,
+ OPTGROUP_VEC_NOTE,
OPTGROUP_OTHER,
+ OPTGROUP_OTHER_OPTIMIZED,
+ OPTGROUP_OTHER_MISSED,
+ OPTGROUP_OTHER_NOTE,
OPTGROUP_COUNT
};
@@ -226,20 +260,21 @@ typedef uint64_t dump_flags_t;
/* Define a tree dump switch. */
struct dump_file_info
{
- const char *suffix; /* suffix to give output file. */
- const char *swtch; /* command line dump switch */
- const char *glob; /* command line glob */
- const char *pfilename; /* filename for the pass-specific stream */
+ const char *suffix; /* suffix to give output file. */
+ const char *swtch; /* command line dump switch */
+ const char *glob; /* command line glob */
+ const char *pfilename; /* filename for the pass-specific stream */
const char *alt_filename; /* filename for the -fopt-info stream */
- FILE *pstream; /* pass-specific dump stream */
- FILE *alt_stream; /* -fopt-info stream */
+ FILE *pstream; /* pass-specific dump stream */
+ FILE *alt_stream; /* -fopt-info stream */
dump_flags_t pflags; /* dump flags */
- optgroup_dump_flags_t optgroup_flags; /* optgroup flags for -fopt-info */
- int alt_flags; /* flags for opt-info */
- int pstate; /* state of pass-specific stream */
- int alt_state; /* state of the -fopt-info stream */
- int num; /* dump file number */
- bool owns_strings; /* fields "suffix", "swtch", "glob" can be
+ optgroup_dump_flags_t pass_optgroup_flags; /* a pass flags for -fopt-info */
+ optgroup_dump_flags_t optgroup_flags; /* flags for -fopt-info given
+ by a user */
+ int pstate; /* state of pass-specific stream */
+ int alt_state; /* state of the -fopt-info stream */
+ int num; /* dump file number */
+ bool owns_strings; /* fields "suffix", "swtch", "glob" can be
const strings, or can be dynamically
allocated, needing free. */
bool graph_dump_initialized; /* When a given dump file is being initialized,
@@ -253,15 +288,18 @@ extern FILE *dump_begin (int, dump_flags_t *);
extern void dump_end (int, FILE *);
extern int opt_info_switch_p (const char *);
extern const char *dump_flag_name (int);
-extern void dump_printf (dump_flags_t, const char *, ...) ATTRIBUTE_PRINTF_2;
-extern void dump_printf_loc (dump_flags_t, source_location,
+extern void dump_printf (optgroup_dump_flags_t,
+ const char *, ...) ATTRIBUTE_PRINTF_2;
+extern void dump_printf_loc (optgroup_dump_flags_t, source_location,
const char *, ...) ATTRIBUTE_PRINTF_3;
-extern void dump_basic_block (int, basic_block, int);
-extern void dump_generic_expr_loc (int, source_location, int, tree);
-extern void dump_generic_expr (dump_flags_t, dump_flags_t, tree);
-extern void dump_gimple_stmt_loc (dump_flags_t, source_location, dump_flags_t,
- gimple *, int);
-extern void dump_gimple_stmt (dump_flags_t, dump_flags_t, gimple *, int);
+extern void dump_basic_block (optgroup_dump_flags_t, basic_block, int);
+extern void dump_generic_expr_loc (optgroup_dump_flags_t, source_location,
+ int, tree);
+extern void dump_generic_expr (optgroup_dump_flags_t, dump_flags_t, tree);
+extern void dump_gimple_stmt_loc (optgroup_dump_flags_t, source_location,
+ dump_flags_t, gimple *, int);
+extern void dump_gimple_stmt (optgroup_dump_flags_t, dump_flags_t, gimple *,
+ int);
extern void print_combine_total_stats (void);
extern bool enable_rtl_dump_file (void);
@@ -286,6 +324,20 @@ dump_enabled_p (void)
return (dump_file || alt_dump_file);
}
+/* Optgroup option hierarchy. */
+
+struct optgroup_option_hierarchy
+{
+ /* Contructor. */
+ optgroup_option_hierarchy();
+
+ /* Initialize optgroup options. */
+ typedef dump_option_node<optgroup_types> node;
+
+ /* Root option node. */
+ node *root;
+};
+
namespace gcc {
class dump_manager
@@ -346,12 +398,6 @@ public:
const char *
dump_flag_name (int phase) const;
- /* Return optgroup_types dump options. */
- dump_option_node<optgroup_types> *get_optgroup_options ()
- {
- return optgroup_options;
- }
-
private:
int
@@ -365,9 +411,7 @@ private:
int
opt_info_enable_passes (optgroup_dump_flags_t optgroup_flags,
- dump_flags_t flags, const char *filename);
-
- void initialize_options ();
+ const char *filename);
private:
@@ -377,9 +421,6 @@ private:
size_t m_extra_dump_files_in_use;
size_t m_extra_dump_files_alloced;
- /* Dump option node for optgroup_types enum. */
- dump_option_node<optgroup_types> *optgroup_options;
-
/* Grant access to dump_enable_all. */
friend bool ::enable_rtl_dump_file (void);
@@ -779,7 +779,7 @@ pass_manager::register_one_dump_file (opt_pass *pass)
char num[11];
dump_flags_t flags;
int id;
- int optgroup_flags = OPTGROUP_NONE;
+ optgroup_dump_flags_t optgroup_flags;
gcc::dump_manager *dumps = m_ctxt->get_dumps ();
/* See below in next_pass_1. */
@@ -47,7 +47,7 @@ struct pass_data
const char *name;
/* The -fopt-info optimization group flags as defined in dumpfile.h. */
- unsigned int optinfo_flags;
+ optgroup_dump_flags_t optinfo_flags;
/* The timevar id associated with this pass. */
/* ??? Ideally would be dynamically assigned. */
--
2.12.2