From e39e1316f034e9932cb8da535541a3e35a0e490a Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Mon, 12 Aug 2013 11:46:09 +0000 Subject: [PATCH] Add SpecialCaseList::createOrDie() factory and use it in sanitizer passes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188169 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/Utils/SpecialCaseList.h | 3 +++ lib/Transforms/Instrumentation/AddressSanitizer.cpp | 4 ++-- lib/Transforms/Instrumentation/DataFlowSanitizer.cpp | 6 +++--- lib/Transforms/Instrumentation/MemorySanitizer.cpp | 2 +- lib/Transforms/Instrumentation/ThreadSanitizer.cpp | 2 +- lib/Transforms/Utils/SpecialCaseList.cpp | 7 +++++++ 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/include/llvm/Transforms/Utils/SpecialCaseList.h b/include/llvm/Transforms/Utils/SpecialCaseList.h index 36ee604a1a6..34396fd34b4 100644 --- a/include/llvm/Transforms/Utils/SpecialCaseList.h +++ b/include/llvm/Transforms/Utils/SpecialCaseList.h @@ -68,6 +68,9 @@ class SpecialCaseList { /// Parses the special case list from a memory buffer. On failure, returns /// 0 and writes an error message to string. static SpecialCaseList *create(const MemoryBuffer *MB, std::string &Error); + /// Parses the special case list from a file. On failure, reports a fatal + /// error. + static SpecialCaseList *createOrDie(const StringRef Path); ~SpecialCaseList(); diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 75565220177..2ee3e010373 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -883,7 +883,7 @@ bool AddressSanitizerModule::runOnModule(Module &M) { TD = getAnalysisIfAvailable(); if (!TD) return false; - BL.reset(new SpecialCaseList(BlacklistFile)); + BL.reset(SpecialCaseList::createOrDie(BlacklistFile)); if (BL->isIn(M)) return false; C = &(M.getContext()); int LongSize = TD->getPointerSizeInBits(); @@ -1076,7 +1076,7 @@ bool AddressSanitizer::doInitialization(Module &M) { if (!TD) return false; - BL.reset(new SpecialCaseList(BlacklistFile)); + BL.reset(SpecialCaseList::createOrDie(BlacklistFile)); DynamicallyInitializedGlobals.Init(M); C = &(M.getContext()); diff --git a/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp b/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp index 0bbbfefe9ae..f5531e00676 100644 --- a/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp +++ b/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp @@ -129,7 +129,7 @@ class DataFlowSanitizer : public ModulePass { Constant *DFSanUnionFn; Constant *DFSanUnionLoadFn; MDNode *ColdCallWeights; - SpecialCaseList Greylist; + OwningPtr Greylist; DenseMap UnwrappedFnMap; Value *getShadowAddress(Value *Addr, Instruction *Pos); @@ -211,7 +211,7 @@ ModulePass *llvm::createDataFlowSanitizerPass(void *(*getArgTLS)(), DataFlowSanitizer::DataFlowSanitizer(void *(*getArgTLS)(), void *(*getRetValTLS)()) : ModulePass(ID), GetArgTLSPtr(getArgTLS), GetRetvalTLSPtr(getRetValTLS), - Greylist(ClGreylistFile) {} + Greylist(SpecialCaseList::createOrDie(ClGreylistFile)) {} FunctionType *DataFlowSanitizer::getInstrumentedFunctionType(FunctionType *T) { llvm::SmallVector ArgTypes; @@ -269,7 +269,7 @@ bool DataFlowSanitizer::doInitialization(Module &M) { DataFlowSanitizer::InstrumentedABI DataFlowSanitizer::getInstrumentedABI(Function *F) { - if (Greylist.isIn(*F)) + if (Greylist->isIn(*F)) return IA_MemOnly; else return getDefaultInstrumentedABI(); diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 0251f16af4e..a78213de7b3 100644 --- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -338,7 +338,7 @@ bool MemorySanitizer::doInitialization(Module &M) { TD = getAnalysisIfAvailable(); if (!TD) return false; - BL.reset(new SpecialCaseList(BlacklistFile)); + BL.reset(SpecialCaseList::createOrDie(BlacklistFile)); C = &(M.getContext()); unsigned PtrSize = TD->getPointerSizeInBits(/* AddressSpace */0); switch (PtrSize) { diff --git a/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/lib/Transforms/Instrumentation/ThreadSanitizer.cpp index cc971a38b20..e19ceba4d16 100644 --- a/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -227,7 +227,7 @@ bool ThreadSanitizer::doInitialization(Module &M) { TD = getAnalysisIfAvailable(); if (!TD) return false; - BL.reset(new SpecialCaseList(BlacklistFile)); + BL.reset(SpecialCaseList::createOrDie(BlacklistFile)); // Always insert a call to __tsan_init into the module's CTORs. IRBuilder<> IRB(M.getContext()); diff --git a/lib/Transforms/Utils/SpecialCaseList.cpp b/lib/Transforms/Utils/SpecialCaseList.cpp index 5a3b192bf6a..5ddaabafc23 100644 --- a/lib/Transforms/Utils/SpecialCaseList.cpp +++ b/lib/Transforms/Utils/SpecialCaseList.cpp @@ -91,6 +91,13 @@ SpecialCaseList *SpecialCaseList::create( return SCL.take(); } +SpecialCaseList *SpecialCaseList::createOrDie(const StringRef Path) { + std::string Error; + if (SpecialCaseList *SCL = create(Path, Error)) + return SCL; + report_fatal_error(Error); +} + bool SpecialCaseList::parse(const MemoryBuffer *MB, std::string &Error) { // Iterate through each line in the blacklist file. SmallVector Lines;