aboutsummaryrefslogtreecommitdiff
path: root/gcc/opts.c
diff options
context:
space:
mode:
authorWish Wu <wishwu007@gmail.com>2017-09-06 14:30:46 +0000
committerJakub Jelinek <jakub@gcc.gnu.org>2017-09-06 16:30:46 +0200
commitf6e50a7d64e9b165b54ed3e333a6793a0183c77e (patch)
treea8dd0e66bf4e2c57b0422c8dc9ed9ab8e9e1ebfd /gcc/opts.c
parent181613096914e3791c7ae68ad53a2fae571b9c5f (diff)
downloadgcc-f6e50a7d64e9b165b54ed3e333a6793a0183c77e.zip
gcc-f6e50a7d64e9b165b54ed3e333a6793a0183c77e.tar.gz
gcc-f6e50a7d64e9b165b54ed3e333a6793a0183c77e.tar.bz2
asan.c (initialize_sanitizer_builtins): Add BT_FN_VOID_UINT8_UINT8...
* asan.c (initialize_sanitizer_builtins): Add BT_FN_VOID_UINT8_UINT8, BT_FN_VOID_UINT16_UINT16, BT_FN_VOID_UINT32_UINT32, BT_FN_VOID_UINT64_UINT64, BT_FN_VOID_FLOAT_FLOAT, BT_FN_VOID_DOUBLE_DOUBLE and BT_FN_VOID_UINT64_PTR variables. * builtin-types.def (BT_FN_VOID_UINT8_UINT8): New fn type. (BT_FN_VOID_UINT16_UINT16): Likewise. (BT_FN_VOID_UINT32_UINT32): Likewise. (BT_FN_VOID_FLOAT_FLOAT): Likewise. (BT_FN_VOID_DOUBLE_DOUBLE): Likewise. (BT_FN_VOID_UINT64_PTR): Likewise. * common.opt (flag_sanitize_coverage): New variable. (fsanitize-coverage=trace-pc): Remove. (fsanitize-coverage=): Add. * flag-types.h (enum sanitize_coverage_code): New enum. * fold-const.c (fold_range_test): Disable non-short-circuit optimization if flag_sanitize_coverage. (fold_truth_andor): Likewise. * tree-ssa-ifcombine.c (ifcombine_ifandif): Likewise. * opts.c (COVERAGE_SANITIZER_OPT): Define. (coverage_sanitizer_opts): New array. (get_closest_sanitizer_option): Add OPTS argument, handle also OPT_fsanitize_coverage_. (parse_sanitizer_options): Adjusted to also handle OPT_fsanitize_coverage_. (common_handle_option): Add OPT_fsanitize_coverage_. * sancov.c (instrument_comparison, instrument_switch): New function. (sancov_pass): Add trace-cmp support. * sanitizer.def (BUILT_IN_SANITIZER_COV_TRACE_CMP1, BUILT_IN_SANITIZER_COV_TRACE_CMP2, BUILT_IN_SANITIZER_COV_TRACE_CMP4, BUILT_IN_SANITIZER_COV_TRACE_CMP8, BUILT_IN_SANITIZER_COV_TRACE_CONST_CMP1, BUILT_IN_SANITIZER_COV_TRACE_CONST_CMP2, BUILT_IN_SANITIZER_COV_TRACE_CONST_CMP4, BUILT_IN_SANITIZER_COV_TRACE_CONST_CMP8, BUILT_IN_SANITIZER_COV_TRACE_CMPF, BUILT_IN_SANITIZER_COV_TRACE_CMPD, BUILT_IN_SANITIZER_COV_TRACE_SWITCH): New builtins. * doc/invoke.texi: Document -fsanitize-coverage=trace-cmp. * gcc.dg/sancov/cmp0.c: New test. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r251801
Diffstat (limited to 'gcc/opts.c')
-rw-r--r--gcc/opts.c70
1 files changed, 51 insertions, 19 deletions
diff --git a/gcc/opts.c b/gcc/opts.c
index a7f926b..5aa5d06 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1526,6 +1526,17 @@ const struct sanitizer_opts_s sanitizer_opts[] =
{ NULL, 0U, 0UL, false }
};
+/* -f{,no-}sanitize-coverage= suboptions. */
+const struct sanitizer_opts_s coverage_sanitizer_opts[] =
+{
+#define COVERAGE_SANITIZER_OPT(name, flags) \
+ { #name, flags, sizeof #name - 1, true }
+ COVERAGE_SANITIZER_OPT (trace-pc, SANITIZE_COV_TRACE_PC),
+ COVERAGE_SANITIZER_OPT (trace-cmp, SANITIZE_COV_TRACE_CMP),
+#undef COVERAGE_SANITIZER_OPT
+ { NULL, 0U, 0UL, false }
+};
+
/* A struct for describing a run of chars within a string. */
struct string_fragment
@@ -1556,31 +1567,34 @@ struct edit_distance_traits<const string_fragment &>
/* Given ARG, an unrecognized sanitizer option, return the best
matching sanitizer option, or NULL if there isn't one.
- CODE is OPT_fsanitize_ or OPT_fsanitize_recover_.
+ OPTS is array of candidate sanitizer options.
+ CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or
+ OPT_fsanitize_coverage_.
VALUE is non-zero for the regular form of the option, zero
for the "no-" form (e.g. "-fno-sanitize-recover="). */
static const char *
get_closest_sanitizer_option (const string_fragment &arg,
+ const struct sanitizer_opts_s *opts,
enum opt_code code, int value)
{
best_match <const string_fragment &, const char*> bm (arg);
- for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
+ for (int i = 0; opts[i].name != NULL; ++i)
{
/* -fsanitize=all is not valid, so don't offer it. */
- if (sanitizer_opts[i].flag == ~0U
- && code == OPT_fsanitize_
+ if (code == OPT_fsanitize_
+ && opts[i].flag == ~0U
&& value)
continue;
/* For -fsanitize-recover= (and not -fno-sanitize-recover=),
don't offer the non-recoverable options. */
- if (!sanitizer_opts[i].can_recover
- && code == OPT_fsanitize_recover_
+ if (code == OPT_fsanitize_recover_
+ && !opts[i].can_recover
&& value)
continue;
- bm.consider (sanitizer_opts[i].name);
+ bm.consider (opts[i].name);
}
return bm.get_best_meaningful_candidate ();
}
@@ -1594,6 +1608,13 @@ parse_sanitizer_options (const char *p, location_t loc, int scode,
unsigned int flags, int value, bool complain)
{
enum opt_code code = (enum opt_code) scode;
+
+ const struct sanitizer_opts_s *opts;
+ if (code == OPT_fsanitize_coverage_)
+ opts = coverage_sanitizer_opts;
+ else
+ opts = sanitizer_opts;
+
while (*p != 0)
{
size_t len, i;
@@ -1611,12 +1632,11 @@ parse_sanitizer_options (const char *p, location_t loc, int scode,
}
/* Check to see if the string matches an option class name. */
- for (i = 0; sanitizer_opts[i].name != NULL; ++i)
- if (len == sanitizer_opts[i].len
- && memcmp (p, sanitizer_opts[i].name, len) == 0)
+ for (i = 0; opts[i].name != NULL; ++i)
+ if (len == opts[i].len && memcmp (p, opts[i].name, len) == 0)
{
/* Handle both -fsanitize and -fno-sanitize cases. */
- if (value && sanitizer_opts[i].flag == ~0U)
+ if (value && opts[i].flag == ~0U)
{
if (code == OPT_fsanitize_)
{
@@ -1633,14 +1653,14 @@ parse_sanitizer_options (const char *p, location_t loc, int scode,
-fsanitize-recover=return if -fsanitize-recover=undefined
is selected. */
if (code == OPT_fsanitize_recover_
- && sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
+ && opts[i].flag == SANITIZE_UNDEFINED)
flags |= (SANITIZE_UNDEFINED
& ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN));
else
- flags |= sanitizer_opts[i].flag;
+ flags |= opts[i].flag;
}
else
- flags &= ~sanitizer_opts[i].flag;
+ flags &= ~opts[i].flag;
found = true;
break;
}
@@ -1649,21 +1669,27 @@ parse_sanitizer_options (const char *p, location_t loc, int scode,
{
const char *hint
= get_closest_sanitizer_option (string_fragment (p, len),
- code, value);
+ opts, code, value);
+
+ const char *suffix;
+ if (code == OPT_fsanitize_recover_)
+ suffix = "-recover";
+ else if (code == OPT_fsanitize_coverage_)
+ suffix = "-coverage";
+ else
+ suffix = "";
if (hint)
error_at (loc,
"unrecognized argument to -f%ssanitize%s= option: %q.*s;"
" did you mean %qs?",
value ? "" : "no-",
- code == OPT_fsanitize_ ? "" : "-recover",
- (int) len, p, hint);
+ suffix, (int) len, p, hint);
else
error_at (loc,
"unrecognized argument to -f%ssanitize%s= option: %q.*s",
value ? "" : "no-",
- code == OPT_fsanitize_ ? "" : "-recover",
- (int) len, p);
+ suffix, (int) len, p);
}
if (comma == NULL)
@@ -1956,6 +1982,12 @@ common_handle_option (struct gcc_options *opts,
&= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
break;
+ case OPT_fsanitize_coverage_:
+ opts->x_flag_sanitize_coverage
+ = parse_sanitizer_options (arg, loc, code,
+ opts->x_flag_sanitize_coverage, value, true);
+ break;
+
case OPT_O:
case OPT_Os:
case OPT_Ofast: