From e03fae4f1c4d5c54dfcea4946a6a95f3cd27ad9d Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Sat, 5 Dec 2015 14:42:34 +0000 Subject: [PATCH] [ASAN] Add doFinalization to reset state Summary: If the same pass manager is used for multiple modules ASAN complains about GlobalsMD being initialized twice. Fix this by resetting GlobalsMD in a new doFinalization method to allow this use case. Reviewers: kcc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14962 llvm-svn: 254851 --- .../Transforms/Instrumentation/AddressSanitizer.cpp | 11 +++++++++++ llvm/test/Instrumentation/AddressSanitizer/twice.ll | 8 ++++++++ 2 files changed, 19 insertions(+) create mode 100644 llvm/test/Instrumentation/AddressSanitizer/twice.ll diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp index dea94a514fe8..a9df5e5898ae 100644 --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -280,6 +280,11 @@ class GlobalsMetadata { GlobalsMetadata() : inited_(false) {} + void reset() { + inited_ = false; + Entries.clear(); + } + void init(Module &M) { assert(!inited_); inited_ = true; @@ -450,6 +455,7 @@ struct AddressSanitizer : public FunctionPass { bool maybeInsertAsanInitAtFunctionEntry(Function &F); void markEscapedLocalAllocas(Function &F); bool doInitialization(Module &M) override; + bool doFinalization(Module &M) override; static char ID; // Pass identification, replacement for typeid DominatorTree &getDominatorTree() const { return *DT; } @@ -1521,6 +1527,11 @@ bool AddressSanitizer::doInitialization(Module &M) { return true; } +bool AddressSanitizer::doFinalization(Module &M) { + GlobalsMD.reset(); + return false; +} + bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) { // For each NSObject descendant having a +load method, this method is invoked // by the ObjC runtime before any of the static constructors is called. diff --git a/llvm/test/Instrumentation/AddressSanitizer/twice.ll b/llvm/test/Instrumentation/AddressSanitizer/twice.ll new file mode 100644 index 000000000000..9f7826f73952 --- /dev/null +++ b/llvm/test/Instrumentation/AddressSanitizer/twice.ll @@ -0,0 +1,8 @@ +; Check that the address sanitizer pass can be reused +; RUN: opt < %s -S -run-twice -asan + +define void @foo(i64* %b) nounwind uwtable sanitize_address { + entry: + store i64 0, i64* %b, align 1 + ret void +}