diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-08-19 09:14:21 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-08-19 09:14:21 +0000 |
commit | 609213f9ebc4d074f32b2b4fc6d59ef12b3fb8e6 (patch) | |
tree | 038377ecc1042acd4453d219f0d1053d7b027021 /clang/lib | |
parent | 88e024969b10edc8a3c4117ffe347c061cd9709f (diff) | |
download | bcm5719-llvm-609213f9ebc4d074f32b2b4fc6d59ef12b3fb8e6.tar.gz bcm5719-llvm-609213f9ebc4d074f32b2b4fc6d59ef12b3fb8e6.zip |
Move SanitizerArgs to the clang Driver
Summary:
This change turns SanitizerArgs into high-level options
stored in the Driver, which are parsed lazily. This fixes an issue of multiple copies of the same diagnostic message produced by sanitizer arguments parser.
Reviewers: rsmith
Reviewed By: rsmith
CC: chandlerc, eugenis, cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1341
llvm-svn: 188660
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.h | 129 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.h | 1 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 9 |
7 files changed, 22 insertions, 147 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 32a7d1aafd3..f3b8beb94b8 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -16,6 +16,7 @@ #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Job.h" #include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" #include "clang/Driver/Tool.h" #include "clang/Driver/ToolChain.h" #include "llvm/ADT/ArrayRef.h" @@ -2051,3 +2052,10 @@ std::pair<unsigned, unsigned> Driver::getIncludeExcludeOptionFlagMasks() const { return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask); } + +const SanitizerArgs & +Driver::getOrParseSanitizerArgs(const ArgList &Args) const { + if (!SanitizerArguments.get()) + SanitizerArguments.reset(new SanitizerArgs(*this, Args)); + return *SanitizerArguments.get(); +} diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index fdabf7b2da2..e0a66c3de79 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -6,7 +6,7 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -#include "SanitizerArgs.h" +#include "clang/Driver/SanitizerArgs.h" #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" @@ -31,14 +31,8 @@ SanitizerArgs::SanitizerArgs() { clear(); } -SanitizerArgs::SanitizerArgs(const Driver &D, - const llvm::opt::ArgList &Args) { +SanitizerArgs::SanitizerArgs(const Driver &D, const llvm::opt::ArgList &Args) { clear(); - parse(D, Args); -} - -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). for (ArgList::const_iterator I = Args.begin(), E = Args.end(); I != E; ++I) { diff --git a/clang/lib/Driver/SanitizerArgs.h b/clang/lib/Driver/SanitizerArgs.h deleted file mode 100644 index 8776022eddb..00000000000 --- a/clang/lib/Driver/SanitizerArgs.h +++ /dev/null @@ -1,129 +0,0 @@ -//===--- SanitizerArgs.h - Arguments for sanitizer tools -------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -#ifndef CLANG_LIB_DRIVER_SANITIZERARGS_H_ -#define CLANG_LIB_DRIVER_SANITIZERARGS_H_ - -#include <string> - -#include "llvm/Option/Arg.h" -#include "llvm/Option/ArgList.h" - -namespace clang { -namespace driver { - -class Driver; -class ToolChain; - -class SanitizerArgs { - /// Assign ordinals to sanitizer flags. We'll use the ordinal values as - /// bit positions within \c Kind. - enum SanitizeOrdinal { -#define SANITIZER(NAME, ID) SO_##ID, -#include "clang/Basic/Sanitizers.def" - SO_Count - }; - - /// Bugs to catch at runtime. - enum SanitizeKind { -#define SANITIZER(NAME, ID) ID = 1 << SO_##ID, -#define SANITIZER_GROUP(NAME, ID, ALIAS) ID = ALIAS, -#include "clang/Basic/Sanitizers.def" - NeedsAsanRt = Address, - NeedsTsanRt = Thread, - NeedsMsanRt = Memory, - NeedsDfsanRt = DataFlow, - NeedsLeakDetection = Leak, - NeedsUbsanRt = Undefined | Integer, - NotAllowedWithTrap = Vptr, - HasZeroBaseShadow = Thread | Memory | DataFlow - }; - unsigned Kind; - - std::string BlacklistFile; - bool MsanTrackOrigins; - 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 Driver &D, 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 needsMsanRt() const { return Kind & NeedsMsanRt; } - bool needsLeakDetection() const { return Kind & NeedsLeakDetection; } - bool needsLsanRt() const { - return needsLeakDetection() && !needsAsanRt(); - } - bool needsUbsanRt() const { - return !UbsanTrapOnError && (Kind & NeedsUbsanRt); - } - bool needsDfsanRt() const { return Kind & NeedsDfsanRt; } - - bool sanitizesVptr() const { return Kind & Vptr; } - bool notAllowedWithTrap() const { return Kind & NotAllowedWithTrap; } - bool hasZeroBaseShadow(const ToolChain &TC) const { - return (Kind & HasZeroBaseShadow) || hasAsanZeroBaseShadow(TC); - } - 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. - static unsigned parse(const char *Value); - - /// Parse a -fsanitize= or -fno-sanitize= argument's values, diagnosing any - /// invalid components. - static unsigned parse(const Driver &D, const llvm::opt::Arg *A, - bool DiagnoseErrors); - - /// Parse a single flag of the form -f[no]sanitize=, or - /// -f*-sanitizer. Sets the masks defining required change of Kind value. - /// Returns true if the flag was parsed successfully. - static bool parse(const Driver &D, const llvm::opt::ArgList &Args, - const llvm::opt::Arg *A, unsigned &Add, unsigned &Remove, - bool DiagnoseErrors); - - /// Produce an argument string from ArgList \p Args, which shows how it - /// provides a sanitizer kind in \p Mask. For example, the argument list - /// "-fsanitize=thread,vptr -faddress-sanitizer" with mask \c NeedsUbsanRt - /// would produce "-fsanitize=vptr". - static std::string lastArgumentForKind(const Driver &D, - const llvm::opt::ArgList &Args, - unsigned Kind); - - /// Produce an argument string from argument \p A, which shows how it provides - /// a value in \p Mask. For instance, the argument - /// "-fsanitize=address,alignment" with mask \c NeedsUbsanRt would produce - /// "-fsanitize=alignment". - static std::string describeSanitizeArg(const llvm::opt::ArgList &Args, - const llvm::opt::Arg *A, - unsigned Mask); - - static bool getDefaultBlacklistForKind(const Driver &D, unsigned Kind, - std::string &BLPath); -}; - -} // namespace driver -} // namespace clang - -#endif // CLANG_LIB_DRIVER_SANITIZERARGS_H_ diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 4fe35609767..ca74395955e 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -42,6 +42,10 @@ bool ToolChain::useIntegratedAs() const { IsIntegratedAssemblerDefault()); } +const SanitizerArgs& ToolChain::getSanitizerArgs() const { + return D.getOrParseSanitizerArgs(Args); +} + std::string ToolChain::getDefaultUniversalArchName() const { // In universal driver terms, the arch name accepted by -arch isn't exactly // the same as the ones that appear in the triple. Roughly speaking, this is diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index 7ca69ef2850..aabcad3c8b5 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -8,13 +8,13 @@ //===----------------------------------------------------------------------===// #include "ToolChains.h" -#include "SanitizerArgs.h" #include "clang/Basic/ObjCRuntime.h" #include "clang/Basic/Version.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" @@ -290,7 +290,7 @@ void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args, } } - SanitizerArgs Sanitize(getDriver(), Args); + const SanitizerArgs &Sanitize = getDriver().getOrParseSanitizerArgs(Args); // Add Ubsan runtime library, if required. if (Sanitize.needsUbsanRt()) { @@ -2356,8 +2356,6 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) } addPathIfExists(SysRoot + "/lib", Paths); addPathIfExists(SysRoot + "/usr/lib", Paths); - - IsPIEDefault = SanitizerArgs(getDriver(), Args).hasZeroBaseShadow(*this); } bool Linux::HasNativeLLVMSupport() const { @@ -2609,7 +2607,7 @@ void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, } bool Linux::isPIEDefault() const { - return IsPIEDefault; + return getSanitizerArgs().hasZeroBaseShadow(*this); } /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index d1116b62331..a37cf472ff7 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -569,7 +569,6 @@ public: std::string Linker; std::vector<std::string> ExtraOpts; - bool IsPIEDefault; protected: virtual Tool *buildAssembler() const; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 9768352ef97..ad004ba1133 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -9,7 +9,6 @@ #include "Tools.h" #include "InputInfo.h" -#include "SanitizerArgs.h" #include "ToolChains.h" #include "clang/Basic/ObjCRuntime.h" #include "clang/Basic/Version.h" @@ -19,6 +18,7 @@ #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/Job.h" #include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" #include "clang/Driver/ToolChain.h" #include "clang/Driver/Util.h" #include "llvm/ADT/SmallString.h" @@ -2822,7 +2822,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree); Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type); - SanitizerArgs Sanitize(D, Args); + const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args); Sanitize.addArgs(getToolChain(), Args, CmdArgs); if (!Args.hasFlag(options::OPT_fsanitize_recover, @@ -4795,7 +4795,8 @@ void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgs(CmdArgs, options::OPT_L); - SanitizerArgs Sanitize(getToolChain().getDriver(), Args); + const SanitizerArgs &Sanitize = + getToolChain().getDriver().getOrParseSanitizerArgs(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 @@ -6059,7 +6060,7 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA, const Driver &D = ToolChain.getDriver(); const bool isAndroid = ToolChain.getTriple().getEnvironment() == llvm::Triple::Android; - SanitizerArgs Sanitize(D, Args); + const SanitizerArgs &Sanitize = D.getOrParseSanitizerArgs(Args); const bool IsPIE = !Args.hasArg(options::OPT_shared) && (Args.hasArg(options::OPT_pie) || Sanitize.hasZeroBaseShadow(ToolChain)); |