diff options
author | Chad Rosier <mcrosier@apple.com> | 2013-01-29 23:31:22 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2013-01-29 23:31:22 +0000 |
commit | ae229d599b8ccf5475fbdf2459fc54f2cce3dec7 (patch) | |
tree | 29d57285b3689ce43fe6d800e68e6a2caea116a6 /clang/lib/Driver/SanitizerArgs.h | |
parent | 01edb9d7d1888604e1b46183a2e82c1c7142d379 (diff) | |
download | bcm5719-llvm-ae229d599b8ccf5475fbdf2459fc54f2cce3dec7.tar.gz bcm5719-llvm-ae229d599b8ccf5475fbdf2459fc54f2cce3dec7.zip |
[ubsan] Implement the -fcatch-undefined-behavior flag using a trapping
implementation; this is much more inline with the original implementation
(i.e., pre-ubsan) and does not require run-time library support.
The trapping implementation can be invoked using either '-fcatch-undefined-behavior'
or '-fsanitize=undefined-trap -fsanitize-undefined-trap-on-error', with the latter
being preferred. Eventually, the -fcatch-undefined-behavior' flag will be removed.
llvm-svn: 173848
Diffstat (limited to 'clang/lib/Driver/SanitizerArgs.h')
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.h | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/clang/lib/Driver/SanitizerArgs.h b/clang/lib/Driver/SanitizerArgs.h index a2819598911..bc3aa58331d 100644 --- a/clang/lib/Driver/SanitizerArgs.h +++ b/clang/lib/Driver/SanitizerArgs.h @@ -36,25 +36,32 @@ class SanitizerArgs { NeedsAsanRt = Address, NeedsTsanRt = Thread, NeedsMsanRt = Memory, - NeedsUbsanRt = (Undefined & ~Bounds) | Integer + NeedsUbsanRt = (Undefined & ~Bounds) | Integer, + NotAllowedWithTrap = Vptr }; unsigned Kind; std::string BlacklistFile; bool MsanTrackOrigins; bool AsanZeroBaseShadow; + bool UbsanTrapOnError; public: SanitizerArgs() : Kind(0), BlacklistFile(""), MsanTrackOrigins(false), - AsanZeroBaseShadow(false) {} + AsanZeroBaseShadow(false), UbsanTrapOnError(false) {} /// Parses the sanitizer arguments from an argument list. SanitizerArgs(const Driver &D, const ArgList &Args); bool needsAsanRt() const { return Kind & NeedsAsanRt; } bool needsTsanRt() const { return Kind & NeedsTsanRt; } bool needsMsanRt() const { return Kind & NeedsMsanRt; } - bool needsUbsanRt() const { return Kind & NeedsUbsanRt; } + bool needsUbsanRt() const { + if (UbsanTrapOnError) + return false; + return Kind & NeedsUbsanRt; + } bool sanitizesVptr() const { return Kind & Vptr; } + bool notAllowedWithTrap() const { return Kind & NotAllowedWithTrap; } void addArgs(const ArgList &Args, ArgStringList &CmdArgs) const { if (!Kind) @@ -127,8 +134,9 @@ class SanitizerArgs { Remove = Thread; DeprecatedReplacement = "-fno-sanitize=thread"; } else if (A->getOption().matches(options::OPT_fcatch_undefined_behavior)) { - Add = Undefined; - DeprecatedReplacement = "-fsanitize=undefined"; + Add = UndefinedTrap; + DeprecatedReplacement = + "-fsanitize=undefined-trap -fsanitize-undefined-trap-on-error"; } else if (A->getOption().matches(options::OPT_fbounds_checking) || A->getOption().matches(options::OPT_fbounds_checking_EQ)) { Add = Bounds; |