diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/BackendUtil.cpp | 18 | ||||
-rw-r--r-- | lib/Driver/SanitizerArgs.h | 8 | ||||
-rw-r--r-- | lib/Driver/Tools.cpp | 19 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 4 |
4 files changed, 38 insertions, 11 deletions
diff --git a/lib/CodeGen/BackendUtil.cpp b/lib/CodeGen/BackendUtil.cpp index 8a3ee398cd..b938aacf1f 100644 --- a/lib/CodeGen/BackendUtil.cpp +++ b/lib/CodeGen/BackendUtil.cpp @@ -164,12 +164,16 @@ static void addAddressSanitizerPasses(const PassManagerBuilder &Builder, static_cast<const PassManagerBuilderWrapper&>(Builder); const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts(); const LangOptions &LangOpts = BuilderWrapper.getLangOpts(); - PM.add(createAddressSanitizerFunctionPass(LangOpts.Sanitize.InitOrder, - LangOpts.Sanitize.UseAfterReturn, - LangOpts.Sanitize.UseAfterScope, - CGOpts.SanitizerBlacklistFile)); - PM.add(createAddressSanitizerModulePass(LangOpts.Sanitize.InitOrder, - CGOpts.SanitizerBlacklistFile)); + PM.add(createAddressSanitizerFunctionPass( + LangOpts.Sanitize.InitOrder, + LangOpts.Sanitize.UseAfterReturn, + LangOpts.Sanitize.UseAfterScope, + CGOpts.SanitizerBlacklistFile, + CGOpts.SanitizeAddressZeroBaseShadow)); + PM.add(createAddressSanitizerModulePass( + LangOpts.Sanitize.InitOrder, + CGOpts.SanitizerBlacklistFile, + CGOpts.SanitizeAddressZeroBaseShadow)); } static void addMemorySanitizerPass(const PassManagerBuilder &Builder, @@ -177,7 +181,7 @@ static void addMemorySanitizerPass(const PassManagerBuilder &Builder, const PassManagerBuilderWrapper &BuilderWrapper = static_cast<const PassManagerBuilderWrapper&>(Builder); const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts(); - PM.add(createMemorySanitizerPass(CGOpts.MemorySanitizerTrackOrigins, + PM.add(createMemorySanitizerPass(CGOpts.SanitizeMemoryTrackOrigins, CGOpts.SanitizerBlacklistFile)); } diff --git a/lib/Driver/SanitizerArgs.h b/lib/Driver/SanitizerArgs.h index 0955889004..ea89904e58 100644 --- a/lib/Driver/SanitizerArgs.h +++ b/lib/Driver/SanitizerArgs.h @@ -41,9 +41,11 @@ class SanitizerArgs { unsigned Kind; std::string BlacklistFile; bool MsanTrackOrigins; + bool AsanZeroBaseShadow; public: - SanitizerArgs() : Kind(0), BlacklistFile(""), MsanTrackOrigins(false) {} + SanitizerArgs() : Kind(0), BlacklistFile(""), MsanTrackOrigins(false), + AsanZeroBaseShadow(false) {} /// Parses the sanitizer arguments from an argument list. SanitizerArgs(const Driver &D, const ArgList &Args); @@ -72,6 +74,10 @@ class SanitizerArgs { if (MsanTrackOrigins) CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins")); + + if (AsanZeroBaseShadow) + CmdArgs.push_back(Args.MakeArgString( + "-fsanitize-address-zero-base-shadow")); } private: diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 3132e75000..0cc9ea2537 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1444,7 +1444,8 @@ static bool UseRelaxAll(Compilation &C, const ArgList &Args) { } SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) - : Kind(0), BlacklistFile(""), MsanTrackOrigins(false) { + : Kind(0), BlacklistFile(""), MsanTrackOrigins(false), + AsanZeroBaseShadow(false) { for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) { unsigned Add, Remove; @@ -1493,11 +1494,18 @@ SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) } // Parse -f(no-)sanitize-memory-track-origins options. - if (Kind & Memory) + if (NeedsMsan) MsanTrackOrigins = Args.hasFlag(options::OPT_fsanitize_memory_track_origins, options::OPT_fno_sanitize_memory_track_origins, /* Default */false); + + // Parse -f(no-)sanitize-address-zero-base-shadow options. + if (NeedsAsan) + AsanZeroBaseShadow = + Args.hasFlag(options::OPT_fsanitize_address_zero_base_shadow, + options::OPT_fno_sanitize_address_zero_base_shadow, + /* Default */false); } /// If AddressSanitizer is enabled, add appropriate linker flags (Linux). @@ -1517,6 +1525,13 @@ static void addAsanRTLinux(const ToolChain &TC, const ArgList &Args, CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibAsan)); } else { if (!Args.hasArg(options::OPT_shared)) { + bool ZeroBaseShadow = Args.hasFlag( + options::OPT_fsanitize_address_zero_base_shadow, + options::OPT_fno_sanitize_address_zero_base_shadow, false); + if (ZeroBaseShadow && !Args.hasArg(options::OPT_pie)) { + TC.getDriver().Diag(diag::err_drv_argument_only_allowed_with) << + "-fsanitize-address-zero-base-shadow" << "-pie"; + } // LibAsan is "libclang_rt.asan-<ArchName>.a" in the Linux library // resource directory. SmallString<128> LibAsan(TC.getDriver().ResourceDir); diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 9329b3bc1b..a16b822d23 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -404,8 +404,10 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir); Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file); Opts.SanitizerBlacklistFile = Args.getLastArgValue(OPT_fsanitize_blacklist); - Opts.MemorySanitizerTrackOrigins = + Opts.SanitizeMemoryTrackOrigins = Args.hasArg(OPT_fsanitize_memory_track_origins); + Opts.SanitizeAddressZeroBaseShadow = + Args.hasArg(OPT_fsanitize_address_zero_base_shadow); Opts.SSPBufferSize = Args.getLastArgIntValue(OPT_stack_protector_buffer_size, 8, Diags); Opts.StackRealignment = Args.hasArg(OPT_mstackrealign); |