diff options
author | Wish Wu <wishwu007@gmail.com> | 2017-09-06 14:30:46 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-09-06 16:30:46 +0200 |
commit | f6e50a7d64e9b165b54ed3e333a6793a0183c77e (patch) | |
tree | a8dd0e66bf4e2c57b0422c8dc9ed9ab8e9e1ebfd /gcc/opts.c | |
parent | 181613096914e3791c7ae68ad53a2fae571b9c5f (diff) | |
download | gcc-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.c | 70 |
1 files changed, 51 insertions, 19 deletions
@@ -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: |