summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDerek Bruening <bruening@google.com>2016-05-20 20:00:05 +0000
committerDerek Bruening <bruening@google.com>2016-05-20 20:00:05 +0000
commitbc0a68e688c133a0d7c65fde89c1d371735df5a7 (patch)
tree929106b1a17cb81f5c9eab3c72b4927a4a682697 /llvm/lib
parent0fcd82605e448f52d80de4c74bd0a19376b9052e (diff)
downloadbcm5719-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.cpp26
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;
OpenPOWER on IntegriCloud