diff options
| author | Philip Pfaffe <philip.pfaffe@gmail.com> | 2019-02-04 21:02:49 +0000 | 
|---|---|---|
| committer | Philip Pfaffe <philip.pfaffe@gmail.com> | 2019-02-04 21:02:49 +0000 | 
| commit | 0ee6a933cec492b334f357b97402e97b612dd1ff (patch) | |
| tree | 3449a2dfd88e4b4f77913cbf499375e3ae775cae /llvm/lib | |
| parent | 90d856cd5f4c4bfe415105f6bfc66f05457a334d (diff) | |
| download | bcm5719-llvm-0ee6a933cec492b334f357b97402e97b612dd1ff.tar.gz bcm5719-llvm-0ee6a933cec492b334f357b97402e97b612dd1ff.zip | |
[NewPM][MSan] Add Options Handling
Summary: This patch enables passing options to msan via the passes pipeline, e.e., -passes=msan<recover;kernel;track-origins=4>.
Reviewers: chandlerc, fedor.sergeev, leonardchan
Subscribers: hiraditya, bollu, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D57640
llvm-svn: 353090
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Passes/PassBuilder.cpp | 28 | ||||
| -rw-r--r-- | llvm/lib/Passes/PassRegistry.def | 13 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 30 | 
3 files changed, 50 insertions, 21 deletions
| diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index de9e67ba5d7..c61eeb7a5cb 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -1335,6 +1335,34 @@ Expected<LoopUnrollOptions> parseLoopUnrollOptions(StringRef Params) {    return UnrollOpts;  } +Expected<MemorySanitizerOptions> parseMSanPassOptions(StringRef Params) { +  MemorySanitizerOptions Result; +  while (!Params.empty()) { +    StringRef ParamName; +    std::tie(ParamName, Params) = Params.split(';'); + +    if (ParamName == "recover") { +      Result.Recover = true; +    } else if (ParamName == "kernel") { +      Result.Kernel = true; +    } else if (ParamName.consume_front("track-origins=")) { +      if (ParamName.getAsInteger(0, Result.TrackOrigins)) +        return make_error<StringError>( +            formatv("invalid argument to MemorySanitizer pass track-origins " +                    "parameter: '{0}' ", +                    ParamName) +                .str(), +            inconvertibleErrorCode()); +    } else { +      return make_error<StringError>( +          formatv("invalid MemorySanitizer pass parameter '{0}' ", ParamName) +              .str(), +          inconvertibleErrorCode()); +    } +  } +  return Result; +} +  } // namespace  /// Tests whether a pass name starts with a valid prefix for a default pipeline diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 3a4d6bd9f38..ac193f5cae1 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -231,7 +231,7 @@ FUNCTION_PASS("verify<regions>", RegionInfoVerifierPass())  FUNCTION_PASS("view-cfg", CFGViewerPass())  FUNCTION_PASS("view-cfg-only", CFGOnlyViewerPass())  FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass()) -FUNCTION_PASS("msan", MemorySanitizerPass()) +FUNCTION_PASS("msan", MemorySanitizerPass({}))  FUNCTION_PASS("tsan", ThreadSanitizerPass())  #undef FUNCTION_PASS @@ -239,8 +239,15 @@ FUNCTION_PASS("tsan", ThreadSanitizerPass())  #define FUNCTION_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)  #endif  FUNCTION_PASS_WITH_PARAMS("unroll", -			  [](LoopUnrollOptions Opts) { return LoopUnrollPass(Opts); }, -			  parseLoopUnrollOptions) +                           [](LoopUnrollOptions Opts) { +                             return LoopUnrollPass(Opts); +                           }, +                           parseLoopUnrollOptions) +FUNCTION_PASS_WITH_PARAMS("msan", +                           [](MemorySanitizerOptions Opts) { +                             return MemorySanitizerPass(Opts); +                           }, +                           parseMSanPassOptions)  #undef FUNCTION_PASS_WITH_PARAMS  #ifndef LOOP_ANALYSIS diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 71ce65774ae..4b217e947f1 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -454,17 +454,16 @@ namespace {  /// the module.  class MemorySanitizer {  public: -  MemorySanitizer(Module &M, int TrackOrigins = 0, bool Recover = false, -                  bool EnableKmsan = false) { +  MemorySanitizer(Module &M, MemorySanitizerOptions Options) {      this->CompileKernel = -        ClEnableKmsan.getNumOccurrences() > 0 ? ClEnableKmsan : EnableKmsan; +        ClEnableKmsan.getNumOccurrences() > 0 ? ClEnableKmsan : Options.Kernel;      if (ClTrackOrigins.getNumOccurrences() > 0)        this->TrackOrigins = ClTrackOrigins;      else -      this->TrackOrigins = this->CompileKernel ? 2 : TrackOrigins; +      this->TrackOrigins = this->CompileKernel ? 2 : Options.TrackOrigins;      this->Recover = ClKeepGoing.getNumOccurrences() > 0                          ? ClKeepGoing -                        : (this->CompileKernel | Recover); +                        : (this->CompileKernel | Options.Recover);      initializeModule(M);    } @@ -598,10 +597,8 @@ struct MemorySanitizerLegacyPass : public FunctionPass {    // Pass identification, replacement for typeid.    static char ID; -  MemorySanitizerLegacyPass(int TrackOrigins = 0, bool Recover = false, -                            bool EnableKmsan = false) -      : FunctionPass(ID), TrackOrigins(TrackOrigins), Recover(Recover), -        EnableKmsan(EnableKmsan) {} +  MemorySanitizerLegacyPass(MemorySanitizerOptions Options = {}) +      : FunctionPass(ID), Options(Options) {}    StringRef getPassName() const override { return "MemorySanitizerLegacyPass"; }    void getAnalysisUsage(AnalysisUsage &AU) const override { @@ -615,16 +612,14 @@ struct MemorySanitizerLegacyPass : public FunctionPass {    bool doInitialization(Module &M) override;    Optional<MemorySanitizer> MSan; -  int TrackOrigins; -  bool Recover; -  bool EnableKmsan; +  MemorySanitizerOptions Options;  };  } // end anonymous namespace  PreservedAnalyses MemorySanitizerPass::run(Function &F,                                             FunctionAnalysisManager &FAM) { -  MemorySanitizer Msan(*F.getParent(), TrackOrigins, Recover, EnableKmsan); +  MemorySanitizer Msan(*F.getParent(), Options);    if (Msan.sanitizeFunction(F, FAM.getResult<TargetLibraryAnalysis>(F)))      return PreservedAnalyses::none();    return PreservedAnalyses::all(); @@ -640,10 +635,9 @@ INITIALIZE_PASS_END(MemorySanitizerLegacyPass, "msan",                      "MemorySanitizer: detects uninitialized reads.", false,                      false) -FunctionPass *llvm::createMemorySanitizerLegacyPassPass(int TrackOrigins, -                                                        bool Recover, -                                                        bool CompileKernel) { -  return new MemorySanitizerLegacyPass(TrackOrigins, Recover, CompileKernel); +FunctionPass * +llvm::createMemorySanitizerLegacyPassPass(MemorySanitizerOptions Options) { +  return new MemorySanitizerLegacyPass(Options);  }  /// Create a non-const global initialized with the given string. @@ -950,7 +944,7 @@ void MemorySanitizer::initializeModule(Module &M) {  }  bool MemorySanitizerLegacyPass::doInitialization(Module &M) { -  MSan.emplace(M, TrackOrigins, Recover, EnableKmsan); +  MSan.emplace(M, Options);    return true;  } | 

