summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/SanitizerArgs.h
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2013-01-29 23:31:22 +0000
committerChad Rosier <mcrosier@apple.com>2013-01-29 23:31:22 +0000
commitae229d599b8ccf5475fbdf2459fc54f2cce3dec7 (patch)
tree29d57285b3689ce43fe6d800e68e6a2caea116a6 /clang/lib/Driver/SanitizerArgs.h
parent01edb9d7d1888604e1b46183a2e82c1c7142d379 (diff)
downloadbcm5719-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.h18
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;
OpenPOWER on IntegriCloud