Home | History | Annotate | Download | only in Driver
      1 //===--- SanitizerArgs.h - Arguments for sanitizer tools  -------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef LLVM_CLANG_DRIVER_SANITIZERARGS_H
     10 #define LLVM_CLANG_DRIVER_SANITIZERARGS_H
     11 
     12 #include "clang/Basic/Sanitizers.h"
     13 #include "clang/Driver/Types.h"
     14 #include "llvm/Option/Arg.h"
     15 #include "llvm/Option/ArgList.h"
     16 #include <string>
     17 #include <vector>
     18 
     19 namespace clang {
     20 namespace driver {
     21 
     22 class ToolChain;
     23 
     24 class SanitizerArgs {
     25   SanitizerSet Sanitizers;
     26   SanitizerSet RecoverableSanitizers;
     27   SanitizerSet TrapSanitizers;
     28 
     29   std::vector<std::string> BlacklistFiles;
     30   std::vector<std::string> ExtraDeps;
     31   int CoverageFeatures = 0;
     32   int MsanTrackOrigins = 0;
     33   bool MsanUseAfterDtor = false;
     34   bool CfiCrossDso = false;
     35   int AsanFieldPadding = 0;
     36   bool SharedRuntime = false;
     37   bool AsanUseAfterScope = true;
     38   bool AsanGlobalsDeadStripping = false;
     39   bool LinkCXXRuntimes = false;
     40   bool NeedPIE = false;
     41   bool SafeStackRuntime = false;
     42   bool Stats = false;
     43   bool TsanMemoryAccess = true;
     44   bool TsanFuncEntryExit = true;
     45   bool TsanAtomics = true;
     46   bool MinimalRuntime = false;
     47   // True if cross-dso CFI support if provided by the system (i.e. Android).
     48   bool ImplicitCfiRuntime = false;
     49 
     50  public:
     51   /// Parses the sanitizer arguments from an argument list.
     52   SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args);
     53 
     54   bool needsSharedRt() const { return SharedRuntime; }
     55 
     56   bool needsAsanRt() const { return Sanitizers.has(SanitizerKind::Address); }
     57   bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); }
     58   bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); }
     59   bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); }
     60   bool needsLsanRt() const {
     61     return Sanitizers.has(SanitizerKind::Leak) &&
     62            !Sanitizers.has(SanitizerKind::Address);
     63   }
     64   bool needsUbsanRt() const;
     65   bool requiresMinimalRuntime() const { return MinimalRuntime; }
     66   bool needsDfsanRt() const { return Sanitizers.has(SanitizerKind::DataFlow); }
     67   bool needsSafeStackRt() const { return SafeStackRuntime; }
     68   bool needsCfiRt() const;
     69   bool needsCfiDiagRt() const;
     70   bool needsStatsRt() const { return Stats; }
     71   bool needsEsanRt() const {
     72     return Sanitizers.hasOneOf(SanitizerKind::Efficiency);
     73   }
     74 
     75   bool requiresPIE() const;
     76   bool needsUnwindTables() const;
     77   bool linkCXXRuntimes() const { return LinkCXXRuntimes; }
     78   bool hasCrossDsoCfi() const { return CfiCrossDso; }
     79   void addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
     80                llvm::opt::ArgStringList &CmdArgs, types::ID InputType) const;
     81 };
     82 
     83 }  // namespace driver
     84 }  // namespace clang
     85 
     86 #endif
     87