Author: samsonov Date: Mon Aug 19 04:14:21 2013 New Revision: 188660 URL: http://llvm.org/viewvc/llvm-project?rev=188660&view=rev Log: 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 Added: cfe/trunk/include/clang/Driver/SanitizerArgs.h - copied, changed from r188066, cfe/trunk/lib/Driver/SanitizerArgs.h Removed: cfe/trunk/lib/Driver/SanitizerArgs.h Modified: cfe/trunk/include/clang/Driver/Driver.h cfe/trunk/include/clang/Driver/ToolChain.h cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/lib/Driver/SanitizerArgs.cpp cfe/trunk/lib/Driver/ToolChain.cpp cfe/trunk/lib/Driver/ToolChains.cpp cfe/trunk/lib/Driver/ToolChains.h cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/test/Driver/fsanitize.c cfe/trunk/test/Driver/integrated-as.s Modified: cfe/trunk/include/clang/Driver/Driver.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Driver.h (original) +++ cfe/trunk/include/clang/Driver/Driver.h Mon Aug 19 04:14:21 2013 @@ -15,6 +15,7 @@ #include "clang/Driver/Phases.h" #include "clang/Driver/Types.h" #include "clang/Driver/Util.h" +#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" @@ -42,6 +43,7 @@ namespace driver { class Compilation; class InputInfo; class JobAction; + class SanitizerArgs; class ToolChain; /// Driver - Encapsulate logic for constructing compilation processes @@ -177,6 +179,9 @@ private: /// stored in it, and will clean them up when torn down. mutable llvm::StringMap<ToolChain *> ToolChains; + /// Parsed arguments passed to sanitizer tools. + mutable llvm::OwningPtr<SanitizerArgs> SanitizerArguments; + private: /// TranslateInputArgs - Create a new derived argument list from the input /// arguments, after applying the standard argument translations. @@ -404,6 +409,10 @@ private: std::pair<unsigned, unsigned> getIncludeExcludeOptionFlagMasks() const; public: + /// \brief Returns parsed arguments to sanitizer tools. + const SanitizerArgs & + getOrParseSanitizerArgs(const llvm::opt::ArgList &Args) const; + /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and /// return the grouped values as integers. Numbers which are not /// provided are set to 0. Copied: cfe/trunk/include/clang/Driver/SanitizerArgs.h (from r188066, cfe/trunk/lib/Driver/SanitizerArgs.h) URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/SanitizerArgs.h?p2=cfe/trunk/include/clang/Driver/SanitizerArgs.h&p1=cfe/trunk/lib/Driver/SanitizerArgs.h&r1=188066&r2=188660&rev=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/SanitizerArgs.h (original) +++ cfe/trunk/include/clang/Driver/SanitizerArgs.h Mon Aug 19 04:14:21 2013 @@ -59,8 +59,6 @@ class 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; } Modified: cfe/trunk/include/clang/Driver/ToolChain.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/ToolChain.h (original) +++ cfe/trunk/include/clang/Driver/ToolChain.h Mon Aug 19 04:14:21 2013 @@ -34,6 +34,7 @@ namespace driver { class Compilation; class Driver; class JobAction; + class SanitizerArgs; class Tool; /// ToolChain - Access to tools for a single platform. @@ -124,6 +125,8 @@ public: path_list &getProgramPaths() { return ProgramPaths; } const path_list &getProgramPaths() const { return ProgramPaths; } + const SanitizerArgs& getSanitizerArgs() const; + // Tool access. /// TranslateArgs - Create a new derived argument list for any argument Modified: cfe/trunk/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Mon Aug 19 04:14:21 2013 @@ -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::ge 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(); +} Modified: cfe/trunk/lib/Driver/SanitizerArgs.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.cpp?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/SanitizerArgs.cpp (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.cpp Mon Aug 19 04:14:21 2013 @@ -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) { Removed: cfe/trunk/lib/Driver/SanitizerArgs.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/SanitizerArgs.h?rev=188659&view=auto ============================================================================== --- cfe/trunk/lib/Driver/SanitizerArgs.h (original) +++ cfe/trunk/lib/Driver/SanitizerArgs.h (removed) @@ -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_ Modified: cfe/trunk/lib/Driver/ToolChain.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChain.cpp?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChain.cpp (original) +++ cfe/trunk/lib/Driver/ToolChain.cpp Mon Aug 19 04:14:21 2013 @@ -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 Modified: cfe/trunk/lib/Driver/ToolChains.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains.cpp Mon Aug 19 04:14:21 2013 @@ -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( } } - 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 } 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 } bool Linux::isPIEDefault() const { - return IsPIEDefault; + return getSanitizerArgs().hasZeroBaseShadow(*this); } /// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly. Modified: cfe/trunk/lib/Driver/ToolChains.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains.h (original) +++ cfe/trunk/lib/Driver/ToolChains.h Mon Aug 19 04:14:21 2013 @@ -569,7 +569,6 @@ public: std::string Linker; std::vector<std::string> ExtraOpts; - bool IsPIEDefault; protected: virtual Tool *buildAssembler() const; Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Mon Aug 19 04:14:21 2013 @@ -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, 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(Compilat 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(Compil 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)); Modified: cfe/trunk/test/Driver/fsanitize.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fsanitize.c?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/test/Driver/fsanitize.c (original) +++ cfe/trunk/test/Driver/fsanitize.c Mon Aug 19 04:14:21 2013 @@ -145,3 +145,7 @@ // RUN: %clang -target x86_64-linux-gnu -fsanitize=memory %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MSAN // CHECK-MSAN: "-fno-assume-sane-operator-new" + +// RUN: %clang -target x86_64-linux-gnu -fsanitize=zzz %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DIAG1 +// CHECK-DIAG1: unsupported argument 'zzz' to option 'fsanitize=' +// CHECK-DIAG1-NOT: unsupported argument 'zzz' to option 'fsanitize=' Modified: cfe/trunk/test/Driver/integrated-as.s URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/integrated-as.s?rev=188660&r1=188659&r2=188660&view=diff ============================================================================== --- cfe/trunk/test/Driver/integrated-as.s (original) +++ cfe/trunk/test/Driver/integrated-as.s Mon Aug 19 04:14:21 2013 @@ -7,3 +7,6 @@ // RUN: not %clang -c -integrated-as -Wa,--compress-debug-sections %s 2>&1 | FileCheck --check-prefix=INVALID %s // INVALID: error: unsupported argument '--compress-debug-sections' to option 'Wa,' + +// RUN: %clang -### -c -integrated-as %s -fsanitize=address 2>&1 %s | FileCheck --check-prefix=SANITIZE %s +// SANITIZE: argument unused during compilation: '-fsanitize=address' _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
