forked from OSchip/llvm-project
[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
This commit is contained in:
parent
44375e4226
commit
e03fae4f1c
|
@ -280,6 +280,11 @@ class GlobalsMetadata {
|
||||||
|
|
||||||
GlobalsMetadata() : inited_(false) {}
|
GlobalsMetadata() : inited_(false) {}
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
inited_ = false;
|
||||||
|
Entries.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void init(Module &M) {
|
void init(Module &M) {
|
||||||
assert(!inited_);
|
assert(!inited_);
|
||||||
inited_ = true;
|
inited_ = true;
|
||||||
|
@ -450,6 +455,7 @@ struct AddressSanitizer : public FunctionPass {
|
||||||
bool maybeInsertAsanInitAtFunctionEntry(Function &F);
|
bool maybeInsertAsanInitAtFunctionEntry(Function &F);
|
||||||
void markEscapedLocalAllocas(Function &F);
|
void markEscapedLocalAllocas(Function &F);
|
||||||
bool doInitialization(Module &M) override;
|
bool doInitialization(Module &M) override;
|
||||||
|
bool doFinalization(Module &M) override;
|
||||||
static char ID; // Pass identification, replacement for typeid
|
static char ID; // Pass identification, replacement for typeid
|
||||||
|
|
||||||
DominatorTree &getDominatorTree() const { return *DT; }
|
DominatorTree &getDominatorTree() const { return *DT; }
|
||||||
|
@ -1521,6 +1527,11 @@ bool AddressSanitizer::doInitialization(Module &M) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AddressSanitizer::doFinalization(Module &M) {
|
||||||
|
GlobalsMD.reset();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) {
|
bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) {
|
||||||
// For each NSObject descendant having a +load method, this method is invoked
|
// For each NSObject descendant having a +load method, this method is invoked
|
||||||
// by the ObjC runtime before any of the static constructors is called.
|
// by the ObjC runtime before any of the static constructors is called.
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue