Kind = 0;
BlacklistFile = "";
MsanTrackOrigins = false;
- AsanZeroBaseShadow = false;
+ AsanZeroBaseShadow = AZBSK_Default;
UbsanTrapOnError = false;
}
clear();
}
-SanitizerArgs::SanitizerArgs(const ToolChain &TC,
+SanitizerArgs::SanitizerArgs(const Driver &D,
const llvm::opt::ArgList &Args) {
clear();
- parse(TC, Args);
+ parse(D, Args);
}
-void SanitizerArgs::parse(const ToolChain &TC,
+void SanitizerArgs::parse(const Driver &D,
const llvm::opt::ArgList &Args) {
unsigned AllKinds = 0; // All kinds of sanitizers that were turned on
// at least once (possibly, disabled further).
- const Driver &D = TC.getDriver();
for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) {
unsigned Add, Remove;
if (!parse(D, Args, *I, Add, Remove, true))
// Parse -f(no-)sanitize-address-zero-base-shadow options.
if (NeedsAsan) {
- bool IsAndroid = (TC.getTriple().getEnvironment() == llvm::Triple::Android);
- bool ZeroBaseShadowDefault = IsAndroid;
- AsanZeroBaseShadow =
- Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow,
- options::OPT_fno_sanitize_address_zero_base_shadow,
- ZeroBaseShadowDefault);
- // Zero-base shadow is a requirement on Android.
- if (IsAndroid && !AsanZeroBaseShadow) {
- D.Diag(diag::err_drv_argument_not_allowed_with)
- << "-fno-sanitize-address-zero-base-shadow"
- << lastArgumentForKind(D, Args, Address);
- }
+ if (Arg *A = Args.getLastArg(
+ options::OPT_fsanitize_address_zero_base_shadow,
+ options::OPT_fno_sanitize_address_zero_base_shadow))
+ AsanZeroBaseShadow = A->getOption().matches(
+ options::OPT_fsanitize_address_zero_base_shadow)
+ ? AZBSK_On
+ : AZBSK_Off;
}
}
-void SanitizerArgs::addArgs(const llvm::opt::ArgList &Args,
+void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const {
if (!Kind)
return;
+ const Driver &D = TC.getDriver();
SmallString<256> SanitizeOpt("-fsanitize=");
#define SANITIZER(NAME, ID) \
if (Kind & ID) \
if (MsanTrackOrigins)
CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins"));
- if (AsanZeroBaseShadow)
- CmdArgs.push_back(
- Args.MakeArgString("-fsanitize-address-zero-base-shadow"));
+ if (needsAsanRt()) {
+ if (hasAsanZeroBaseShadow(TC)) {
+ CmdArgs.push_back(
+ Args.MakeArgString("-fsanitize-address-zero-base-shadow"));
+ } else if (TC.getTriple().getEnvironment() == llvm::Triple::Android) {
+ // Zero-base shadow is a requirement on Android.
+ D.Diag(diag::err_drv_argument_not_allowed_with)
+ << "-fno-sanitize-address-zero-base-shadow"
+ << lastArgumentForKind(D, Args, Address);
+ }
+ }
// Workaround for PR16386.
if (needsMsanRt())
CmdArgs.push_back(Args.MakeArgString("-fno-assume-sane-operator-new"));
}
+bool SanitizerArgs::hasAsanZeroBaseShadow(const ToolChain &TC) const {
+ if (AsanZeroBaseShadow != AZBSK_Default)
+ return AsanZeroBaseShadow == AZBSK_On;
+ // Zero-base shadow is used by default only on Android.
+ return TC.getTriple().getEnvironment() == llvm::Triple::Android;
+}
+
unsigned SanitizerArgs::parse(const char *Value) {
unsigned ParsedKind = llvm::StringSwitch<SanitizeKind>(Value)
#define SANITIZER(NAME, ID) .Case(NAME, ID)
HasZeroBaseShadow = Thread | Memory | DataFlow
};
unsigned Kind;
+
std::string BlacklistFile;
bool MsanTrackOrigins;
- bool AsanZeroBaseShadow;
+ enum AsanZeroBaseShadowKind {
+ AZBSK_Default, // Default value is toolchain-specific.
+ AZBSK_On,
+ AZBSK_Off
+ } AsanZeroBaseShadow;
bool UbsanTrapOnError;
public:
SanitizerArgs();
/// Parses the sanitizer arguments from an argument list.
- SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args);
+ SanitizerArgs(const Driver &D, const llvm::opt::ArgList &Args);
- void parse(const ToolChain &TC, const llvm::opt::ArgList &Args);
+ void parse(const Driver &D, const llvm::opt::ArgList &Args);
bool needsAsanRt() const { return Kind & NeedsAsanRt; }
bool needsTsanRt() const { return Kind & NeedsTsanRt; }
bool sanitizesVptr() const { return Kind & Vptr; }
bool notAllowedWithTrap() const { return Kind & NotAllowedWithTrap; }
- bool hasZeroBaseShadow() const {
- return (Kind & HasZeroBaseShadow) || AsanZeroBaseShadow;
+ bool hasZeroBaseShadow(const ToolChain &TC) const {
+ return (Kind & HasZeroBaseShadow) || hasAsanZeroBaseShadow(TC);
}
-
- void addArgs(const llvm::opt::ArgList &Args,
+ void addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const;
private:
void clear();
+ bool hasAsanZeroBaseShadow(const ToolChain &TC) const;
+
/// Parse a single value from a -fsanitize= or -fno-sanitize= value list.
/// Returns OR of members of the \c SanitizeKind enumeration, or \c 0
/// if \p Value is not known.
Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
- SanitizerArgs Sanitize(getToolChain(), Args);
- Sanitize.addArgs(Args, CmdArgs);
+ SanitizerArgs Sanitize(D, Args);
+ Sanitize.addArgs(getToolChain(), Args, CmdArgs);
if (!Args.hasFlag(options::OPT_fsanitize_recover,
options::OPT_fno_sanitize_recover,
Args.AddAllArgs(CmdArgs, options::OPT_L);
- SanitizerArgs Sanitize(getToolChain(), Args);
+ SanitizerArgs Sanitize(getToolChain().getDriver(), Args);
// If we're building a dynamic lib with -fsanitize=address,
// unresolved symbols may appear. Mark all
// of them as dynamic_lookup. Linking executables is handled in
const Driver &D = ToolChain.getDriver();
const bool isAndroid =
ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
- SanitizerArgs Sanitize(getToolChain(), Args);
+ SanitizerArgs Sanitize(D, Args);
const bool IsPIE =
!Args.hasArg(options::OPT_shared) &&
- (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow());
+ (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain));
ArgStringList CmdArgs;