forked from OSchip/llvm-project
Add SpecialCaseList::createOrDie() factory and use it in sanitizer passes
llvm-svn: 188169
This commit is contained in:
parent
8e20be2aea
commit
e4b5fb8851
|
@ -68,6 +68,9 @@ class SpecialCaseList {
|
||||||
/// Parses the special case list from a memory buffer. On failure, returns
|
/// Parses the special case list from a memory buffer. On failure, returns
|
||||||
/// 0 and writes an error message to string.
|
/// 0 and writes an error message to string.
|
||||||
static SpecialCaseList *create(const MemoryBuffer *MB, std::string &Error);
|
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();
|
~SpecialCaseList();
|
||||||
|
|
||||||
|
|
|
@ -883,7 +883,7 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
if (!TD)
|
if (!TD)
|
||||||
return false;
|
return false;
|
||||||
BL.reset(new SpecialCaseList(BlacklistFile));
|
BL.reset(SpecialCaseList::createOrDie(BlacklistFile));
|
||||||
if (BL->isIn(M)) return false;
|
if (BL->isIn(M)) return false;
|
||||||
C = &(M.getContext());
|
C = &(M.getContext());
|
||||||
int LongSize = TD->getPointerSizeInBits();
|
int LongSize = TD->getPointerSizeInBits();
|
||||||
|
@ -1076,7 +1076,7 @@ bool AddressSanitizer::doInitialization(Module &M) {
|
||||||
|
|
||||||
if (!TD)
|
if (!TD)
|
||||||
return false;
|
return false;
|
||||||
BL.reset(new SpecialCaseList(BlacklistFile));
|
BL.reset(SpecialCaseList::createOrDie(BlacklistFile));
|
||||||
DynamicallyInitializedGlobals.Init(M);
|
DynamicallyInitializedGlobals.Init(M);
|
||||||
|
|
||||||
C = &(M.getContext());
|
C = &(M.getContext());
|
||||||
|
|
|
@ -129,7 +129,7 @@ class DataFlowSanitizer : public ModulePass {
|
||||||
Constant *DFSanUnionFn;
|
Constant *DFSanUnionFn;
|
||||||
Constant *DFSanUnionLoadFn;
|
Constant *DFSanUnionLoadFn;
|
||||||
MDNode *ColdCallWeights;
|
MDNode *ColdCallWeights;
|
||||||
SpecialCaseList Greylist;
|
OwningPtr<SpecialCaseList> Greylist;
|
||||||
DenseMap<Value *, Function *> UnwrappedFnMap;
|
DenseMap<Value *, Function *> UnwrappedFnMap;
|
||||||
|
|
||||||
Value *getShadowAddress(Value *Addr, Instruction *Pos);
|
Value *getShadowAddress(Value *Addr, Instruction *Pos);
|
||||||
|
@ -211,7 +211,7 @@ ModulePass *llvm::createDataFlowSanitizerPass(void *(*getArgTLS)(),
|
||||||
DataFlowSanitizer::DataFlowSanitizer(void *(*getArgTLS)(),
|
DataFlowSanitizer::DataFlowSanitizer(void *(*getArgTLS)(),
|
||||||
void *(*getRetValTLS)())
|
void *(*getRetValTLS)())
|
||||||
: ModulePass(ID), GetArgTLSPtr(getArgTLS), GetRetvalTLSPtr(getRetValTLS),
|
: ModulePass(ID), GetArgTLSPtr(getArgTLS), GetRetvalTLSPtr(getRetValTLS),
|
||||||
Greylist(ClGreylistFile) {}
|
Greylist(SpecialCaseList::createOrDie(ClGreylistFile)) {}
|
||||||
|
|
||||||
FunctionType *DataFlowSanitizer::getInstrumentedFunctionType(FunctionType *T) {
|
FunctionType *DataFlowSanitizer::getInstrumentedFunctionType(FunctionType *T) {
|
||||||
llvm::SmallVector<Type *, 4> ArgTypes;
|
llvm::SmallVector<Type *, 4> ArgTypes;
|
||||||
|
@ -269,7 +269,7 @@ bool DataFlowSanitizer::doInitialization(Module &M) {
|
||||||
|
|
||||||
DataFlowSanitizer::InstrumentedABI
|
DataFlowSanitizer::InstrumentedABI
|
||||||
DataFlowSanitizer::getInstrumentedABI(Function *F) {
|
DataFlowSanitizer::getInstrumentedABI(Function *F) {
|
||||||
if (Greylist.isIn(*F))
|
if (Greylist->isIn(*F))
|
||||||
return IA_MemOnly;
|
return IA_MemOnly;
|
||||||
else
|
else
|
||||||
return getDefaultInstrumentedABI();
|
return getDefaultInstrumentedABI();
|
||||||
|
|
|
@ -338,7 +338,7 @@ bool MemorySanitizer::doInitialization(Module &M) {
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
if (!TD)
|
if (!TD)
|
||||||
return false;
|
return false;
|
||||||
BL.reset(new SpecialCaseList(BlacklistFile));
|
BL.reset(SpecialCaseList::createOrDie(BlacklistFile));
|
||||||
C = &(M.getContext());
|
C = &(M.getContext());
|
||||||
unsigned PtrSize = TD->getPointerSizeInBits(/* AddressSpace */0);
|
unsigned PtrSize = TD->getPointerSizeInBits(/* AddressSpace */0);
|
||||||
switch (PtrSize) {
|
switch (PtrSize) {
|
||||||
|
|
|
@ -227,7 +227,7 @@ bool ThreadSanitizer::doInitialization(Module &M) {
|
||||||
TD = getAnalysisIfAvailable<DataLayout>();
|
TD = getAnalysisIfAvailable<DataLayout>();
|
||||||
if (!TD)
|
if (!TD)
|
||||||
return false;
|
return false;
|
||||||
BL.reset(new SpecialCaseList(BlacklistFile));
|
BL.reset(SpecialCaseList::createOrDie(BlacklistFile));
|
||||||
|
|
||||||
// Always insert a call to __tsan_init into the module's CTORs.
|
// Always insert a call to __tsan_init into the module's CTORs.
|
||||||
IRBuilder<> IRB(M.getContext());
|
IRBuilder<> IRB(M.getContext());
|
||||||
|
|
|
@ -91,6 +91,13 @@ SpecialCaseList *SpecialCaseList::create(
|
||||||
return SCL.take();
|
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) {
|
bool SpecialCaseList::parse(const MemoryBuffer *MB, std::string &Error) {
|
||||||
// Iterate through each line in the blacklist file.
|
// Iterate through each line in the blacklist file.
|
||||||
SmallVector<StringRef, 16> Lines;
|
SmallVector<StringRef, 16> Lines;
|
||||||
|
|
Loading…
Reference in New Issue