mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-01 17:28:21 +00:00
[asan/tsan] initialize the asan/tsan callbacks in runOnFunction as opposed to doInitialization. This is required to allow the upcoming changes in PassManager behavior
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168864 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5085eb80ab
commit
8b390ffbfd
@ -211,6 +211,7 @@ struct AddressSanitizer : public FunctionPass {
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
|
||||
private:
|
||||
void initializeCallbacks(Module &M);
|
||||
uint64_t getAllocaSizeInBytes(AllocaInst *AI) {
|
||||
Type *Ty = AI->getAllocatedType();
|
||||
uint64_t SizeInBytes = TD->getTypeAllocSize(Ty);
|
||||
@ -738,32 +739,8 @@ bool AddressSanitizerModule::runOnModule(Module &M) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool AddressSanitizer::doInitialization(Module &M) {
|
||||
// Initialize the private fields. No one has accessed them before.
|
||||
TD = getAnalysisIfAvailable<DataLayout>();
|
||||
|
||||
if (!TD)
|
||||
return false;
|
||||
BL.reset(new BlackList(ClBlackListFile));
|
||||
DynamicallyInitializedGlobals.Init(M);
|
||||
|
||||
C = &(M.getContext());
|
||||
LongSize = TD->getPointerSizeInBits();
|
||||
IntptrTy = Type::getIntNTy(*C, LongSize);
|
||||
IntptrPtrTy = PointerType::get(IntptrTy, 0);
|
||||
|
||||
AsanCtorFunction = Function::Create(
|
||||
FunctionType::get(Type::getVoidTy(*C), false),
|
||||
GlobalValue::InternalLinkage, kAsanModuleCtorName, &M);
|
||||
BasicBlock *AsanCtorBB = BasicBlock::Create(*C, "", AsanCtorFunction);
|
||||
// call __asan_init in the module ctor.
|
||||
IRBuilder<> IRB(ReturnInst::Create(*C, AsanCtorBB));
|
||||
AsanInitFunction = checkInterfaceFunction(
|
||||
M.getOrInsertFunction(kAsanInitName, IRB.getVoidTy(), NULL));
|
||||
AsanInitFunction->setLinkage(Function::ExternalLinkage);
|
||||
IRB.CreateCall(AsanInitFunction);
|
||||
|
||||
void AddressSanitizer::initializeCallbacks(Module &M) {
|
||||
IRBuilder<> IRB(*C);
|
||||
// Create __asan_report* callbacks.
|
||||
for (size_t AccessIsWrite = 0; AccessIsWrite <= 1; AccessIsWrite++) {
|
||||
for (size_t AccessSizeIndex = 0; AccessSizeIndex < kNumberOfAccessSizes;
|
||||
@ -790,6 +767,33 @@ bool AddressSanitizer::doInitialization(Module &M) {
|
||||
EmptyAsm = InlineAsm::get(FunctionType::get(IRB.getVoidTy(), false),
|
||||
StringRef(""), StringRef(""),
|
||||
/*hasSideEffects=*/true);
|
||||
}
|
||||
|
||||
// virtual
|
||||
bool AddressSanitizer::doInitialization(Module &M) {
|
||||
// Initialize the private fields. No one has accessed them before.
|
||||
TD = getAnalysisIfAvailable<DataLayout>();
|
||||
|
||||
if (!TD)
|
||||
return false;
|
||||
BL.reset(new BlackList(ClBlackListFile));
|
||||
DynamicallyInitializedGlobals.Init(M);
|
||||
|
||||
C = &(M.getContext());
|
||||
LongSize = TD->getPointerSizeInBits();
|
||||
IntptrTy = Type::getIntNTy(*C, LongSize);
|
||||
IntptrPtrTy = PointerType::get(IntptrTy, 0);
|
||||
|
||||
AsanCtorFunction = Function::Create(
|
||||
FunctionType::get(Type::getVoidTy(*C), false),
|
||||
GlobalValue::InternalLinkage, kAsanModuleCtorName, &M);
|
||||
BasicBlock *AsanCtorBB = BasicBlock::Create(*C, "", AsanCtorFunction);
|
||||
// call __asan_init in the module ctor.
|
||||
IRBuilder<> IRB(ReturnInst::Create(*C, AsanCtorBB));
|
||||
AsanInitFunction = checkInterfaceFunction(
|
||||
M.getOrInsertFunction(kAsanInitName, IRB.getVoidTy(), NULL));
|
||||
AsanInitFunction->setLinkage(Function::ExternalLinkage);
|
||||
IRB.CreateCall(AsanInitFunction);
|
||||
|
||||
llvm::Triple targetTriple(M.getTargetTriple());
|
||||
bool isAndroid = targetTriple.getEnvironment() == llvm::Triple::Android;
|
||||
@ -857,6 +861,7 @@ bool AddressSanitizer::runOnFunction(Function &F) {
|
||||
if (BL->isIn(F)) return false;
|
||||
if (&F == AsanCtorFunction) return false;
|
||||
DEBUG(dbgs() << "ASAN instrumenting:\n" << F << "\n");
|
||||
initializeCallbacks(*F.getParent());
|
||||
|
||||
// If needed, insert __asan_init before checking for AddressSafety attr.
|
||||
maybeInsertAsanInitAtFunctionEntry(F);
|
||||
|
@ -78,6 +78,7 @@ struct ThreadSanitizer : public FunctionPass {
|
||||
static char ID; // Pass identification, replacement for typeid.
|
||||
|
||||
private:
|
||||
void initializeCallbacks(Module &M);
|
||||
bool instrumentLoadOrStore(Instruction *I);
|
||||
bool instrumentAtomic(Instruction *I);
|
||||
void chooseInstructionsToInstrument(SmallVectorImpl<Instruction*> &Local,
|
||||
@ -130,18 +131,8 @@ static Function *checkInterfaceFunction(Constant *FuncOrBitcast) {
|
||||
report_fatal_error("ThreadSanitizer interface function redefined");
|
||||
}
|
||||
|
||||
bool ThreadSanitizer::doInitialization(Module &M) {
|
||||
TD = getAnalysisIfAvailable<DataLayout>();
|
||||
if (!TD)
|
||||
return false;
|
||||
BL.reset(new BlackList(ClBlackListFile));
|
||||
|
||||
// Always insert a call to __tsan_init into the module's CTORs.
|
||||
void ThreadSanitizer::initializeCallbacks(Module &M) {
|
||||
IRBuilder<> IRB(M.getContext());
|
||||
Value *TsanInit = M.getOrInsertFunction("__tsan_init",
|
||||
IRB.getVoidTy(), NULL);
|
||||
appendToGlobalCtors(M, cast<Function>(TsanInit), 0);
|
||||
|
||||
// Initialize the callbacks.
|
||||
TsanFuncEntry = checkInterfaceFunction(M.getOrInsertFunction(
|
||||
"__tsan_func_entry", IRB.getVoidTy(), IRB.getInt8PtrTy(), NULL));
|
||||
@ -209,6 +200,20 @@ bool ThreadSanitizer::doInitialization(Module &M) {
|
||||
"__tsan_atomic_thread_fence", IRB.getVoidTy(), OrdTy, NULL));
|
||||
TsanAtomicSignalFence = checkInterfaceFunction(M.getOrInsertFunction(
|
||||
"__tsan_atomic_signal_fence", IRB.getVoidTy(), OrdTy, NULL));
|
||||
}
|
||||
|
||||
bool ThreadSanitizer::doInitialization(Module &M) {
|
||||
TD = getAnalysisIfAvailable<DataLayout>();
|
||||
if (!TD)
|
||||
return false;
|
||||
BL.reset(new BlackList(ClBlackListFile));
|
||||
|
||||
// Always insert a call to __tsan_init into the module's CTORs.
|
||||
IRBuilder<> IRB(M.getContext());
|
||||
Value *TsanInit = M.getOrInsertFunction("__tsan_init",
|
||||
IRB.getVoidTy(), NULL);
|
||||
appendToGlobalCtors(M, cast<Function>(TsanInit), 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -299,6 +304,7 @@ static bool isAtomic(Instruction *I) {
|
||||
bool ThreadSanitizer::runOnFunction(Function &F) {
|
||||
if (!TD) return false;
|
||||
if (BL->isIn(F)) return false;
|
||||
initializeCallbacks(*F.getParent());
|
||||
SmallVector<Instruction*, 8> RetVec;
|
||||
SmallVector<Instruction*, 8> AllLoadsAndStores;
|
||||
SmallVector<Instruction*, 8> LocalLoadsAndStores;
|
||||
|
Loading…
Reference in New Issue
Block a user