diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 32 | ||||
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.h | 4 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 7 |
3 files changed, 33 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index d54ed2225a9..a5cc2ea0041 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -135,6 +135,17 @@ public: void EmitAssembly(BackendAction Action, raw_ostream *OS); }; +// We need this wrapper to access LangOpts from extension functions that +// we add to the PassManagerBuilder. +class PassManagerBuilderWrapper : public PassManagerBuilder { +public: + PassManagerBuilderWrapper(const LangOptions &LangOpts) + : PassManagerBuilder(), LangOpts(LangOpts) {} + const LangOptions &getLangOpts() const { return LangOpts; } +private: + const LangOptions &LangOpts; +}; + } static void addObjCARCAPElimPass(const PassManagerBuilder &Builder, PassManagerBase &PM) { @@ -157,10 +168,15 @@ static void addBoundsCheckingPass(const PassManagerBuilder &Builder, PM.add(createBoundsCheckingPass()); } -static void addAddressSanitizerPass(const PassManagerBuilder &Builder, - PassManagerBase &PM) { - PM.add(createAddressSanitizerFunctionPass()); - PM.add(createAddressSanitizerModulePass()); +static void addAddressSanitizerPasses(const PassManagerBuilder &Builder, + PassManagerBase &PM) { + const PassManagerBuilderWrapper &BuilderWrapper = + static_cast<const PassManagerBuilderWrapper&>(Builder); + const LangOptions &LangOpts = BuilderWrapper.getLangOpts(); + PM.add(createAddressSanitizerFunctionPass(LangOpts.SanitizeInitOrder, + LangOpts.SanitizeUseAfterReturn, + LangOpts.SanitizeUseAfterScope)); + PM.add(createAddressSanitizerModulePass(LangOpts.SanitizeInitOrder)); } static void addThreadSanitizerPass(const PassManagerBuilder &Builder, @@ -178,8 +194,8 @@ void EmitAssemblyHelper::CreatePasses(TargetMachine *TM) { OptLevel = 0; Inlining = CodeGenOpts.NoInlining; } - - PassManagerBuilder PMBuilder; + + PassManagerBuilderWrapper PMBuilder(LangOpts); PMBuilder.OptLevel = OptLevel; PMBuilder.SizeLevel = CodeGenOpts.OptimizeSize; @@ -206,9 +222,9 @@ void EmitAssemblyHelper::CreatePasses(TargetMachine *TM) { if (LangOpts.SanitizeAddress) { PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast, - addAddressSanitizerPass); + addAddressSanitizerPasses); PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, - addAddressSanitizerPass); + addAddressSanitizerPasses); } if (LangOpts.SanitizeThread) { diff --git a/clang/lib/Driver/SanitizerArgs.h b/clang/lib/Driver/SanitizerArgs.h index 52a6c2ec4b1..af92fa070c3 100644 --- a/clang/lib/Driver/SanitizerArgs.h +++ b/clang/lib/Driver/SanitizerArgs.h @@ -28,7 +28,7 @@ class SanitizerArgs { #define SANITIZER(NAME, ID) ID = 1 << SO_##ID, #define SANITIZER_GROUP(NAME, ID, ALIAS) ID = ALIAS, #include "clang/Basic/Sanitizers.def" - NeedsAsanRt = Address, + NeedsAsanRt = AddressFull, NeedsTsanRt = Thread, NeedsUbsanRt = (Undefined & ~Bounds) | Integer }; @@ -44,7 +44,7 @@ class SanitizerArgs { bool needsUbsanRt() const { return Kind & NeedsUbsanRt; } bool sanitizesVptr() const { return Kind & Vptr; } - + void addArgs(const ArgList &Args, ArgStringList &CmdArgs) const { if (!Kind) return; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index f9cb5eff533..f2c1a03caf3 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1474,6 +1474,13 @@ SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) { D.Diag(diag::err_drv_argument_not_allowed_with) << lastArgumentForKind(D, Args, NeedsAsan ? NeedsAsanRt : NeedsTsanRt) << lastArgumentForKind(D, Args, NeedsUbsan ? NeedsUbsanRt : NeedsTsanRt); + + // If -fsanitize contains extra features of ASan, it should also + // explicitly contain -fsanitize=address. + if (NeedsAsan && ((Kind & Address) == 0)) + D.Diag(diag::err_drv_argument_only_allowed_with) + << lastArgumentForKind(D, Args, NeedsAsanRt) + << "-fsanitize=address"; } /// If AddressSanitizer is enabled, add appropriate linker flags (Linux). |