diff options
| author | Derek Bruening <bruening@google.com> | 2016-05-20 20:00:05 +0000 |
|---|---|---|
| committer | Derek Bruening <bruening@google.com> | 2016-05-20 20:00:05 +0000 |
| commit | bc0a68e688c133a0d7c65fde89c1d371735df5a7 (patch) | |
| tree | 929106b1a17cb81f5c9eab3c72b4927a4a682697 /llvm/lib | |
| parent | 0fcd82605e448f52d80de4c74bd0a19376b9052e (diff) | |
| download | bcm5719-llvm-bc0a68e688c133a0d7c65fde89c1d371735df5a7.tar.gz bcm5719-llvm-bc0a68e688c133a0d7c65fde89c1d371735df5a7.zip | |
[esan] Use ModulePass for EfficiencySanitizerPass.
Summary:
Uses ModulePass instead of FunctionPass for EfficiencySanitizerPass to
better support global variable creation for a forthcoming struct field
counter tool.
Patch by Qin Zhao.
Reviewers: aizatsky
Subscribers: llvm-commits, eugenis, vitalybuka, bruening, kcc
Differential Revision: http://reviews.llvm.org/D20458
llvm-svn: 270263
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/EfficiencySanitizer.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/EfficiencySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/EfficiencySanitizer.cpp index 7ab61e65c12..8feadd2827d 100644 --- a/llvm/lib/Transforms/Instrumentation/EfficiencySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/EfficiencySanitizer.cpp @@ -78,18 +78,19 @@ OverrideOptionsFromCL(EfficiencySanitizerOptions Options) { } /// EfficiencySanitizer: instrument each module to find performance issues. -class EfficiencySanitizer : public FunctionPass { +class EfficiencySanitizer : public ModulePass { public: EfficiencySanitizer( const EfficiencySanitizerOptions &Opts = EfficiencySanitizerOptions()) - : FunctionPass(ID), Options(OverrideOptionsFromCL(Opts)) {} + : ModulePass(ID), Options(OverrideOptionsFromCL(Opts)) {} const char *getPassName() const override; - bool runOnFunction(Function &F) override; - bool doInitialization(Module &M) override; + bool runOnModule(Module &M) override; static char ID; private: + bool initOnModule(Module &M); void initializeCallbacks(Module &M); + bool runOnFunction(Function &F, Module &M); bool instrumentLoadOrStore(Instruction *I, const DataLayout &DL); bool instrumentMemIntrinsic(MemIntrinsic *MI); bool shouldIgnoreMemoryAccess(Instruction *I); @@ -125,7 +126,7 @@ const char *EfficiencySanitizer::getPassName() const { return "EfficiencySanitizer"; } -FunctionPass * +ModulePass * llvm::createEfficiencySanitizerPass(const EfficiencySanitizerOptions &Options) { return new EfficiencySanitizer(Options); } @@ -172,7 +173,7 @@ void EfficiencySanitizer::initializeCallbacks(Module &M) { IRB.getInt32Ty(), IntptrTy, nullptr)); } -bool EfficiencySanitizer::doInitialization(Module &M) { +bool EfficiencySanitizer::initOnModule(Module &M) { Ctx = &M.getContext(); const DataLayout &DL = M.getDataLayout(); IRBuilder<> IRB(M.getContext()); @@ -198,13 +199,20 @@ bool EfficiencySanitizer::shouldIgnoreMemoryAccess(Instruction *I) { return false; } -bool EfficiencySanitizer::runOnFunction(Function &F) { +bool EfficiencySanitizer::runOnModule(Module &M) { + bool Res = initOnModule(M); + initializeCallbacks(M); + for (auto &F : M) { + Res |= runOnFunction(F, M); + } + return Res; +} + +bool EfficiencySanitizer::runOnFunction(Function &F, Module &M) { // This is required to prevent instrumenting the call to __esan_init from // within the module constructor. if (&F == EsanCtorFunction) return false; - // As a function pass, we must re-initialize every time. - initializeCallbacks(*F.getParent()); SmallVector<Instruction *, 8> LoadsAndStores; SmallVector<Instruction *, 8> MemIntrinCalls; bool Res = false; |

