diff options
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 99 |
1 files changed, 42 insertions, 57 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index f22918141f6e..906687663519 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -261,9 +261,7 @@ private: FunctionCallee SanCovTraceGepFunction; FunctionCallee SanCovTraceSwitchFunction; GlobalVariable *SanCovLowestStack; - Type *Int128PtrTy, *IntptrTy, *IntptrPtrTy, *Int64Ty, *Int64PtrTy, *Int32Ty, - *Int32PtrTy, *Int16PtrTy, *Int16Ty, *Int8Ty, *Int8PtrTy, *Int1Ty, - *Int1PtrTy; + Type *PtrTy, *IntptrTy, *Int64Ty, *Int32Ty, *Int16Ty, *Int8Ty, *Int1Ty; Module *CurModule; std::string CurModuleUniqueId; Triple TargetTriple; @@ -331,11 +329,10 @@ ModuleSanitizerCoverage::CreateSecStartEnd(Module &M, const char *Section, // Account for the fact that on windows-msvc __start_* symbols actually // point to a uint64_t before the start of the array. - auto SecStartI8Ptr = IRB.CreatePointerCast(SecStart, Int8PtrTy); + auto SecStartI8Ptr = IRB.CreatePointerCast(SecStart, PtrTy); auto GEP = IRB.CreateGEP(Int8Ty, SecStartI8Ptr, ConstantInt::get(IntptrTy, sizeof(uint64_t))); - return std::make_pair(IRB.CreatePointerCast(GEP, PointerType::getUnqual(Ty)), - SecEnd); + return std::make_pair(GEP, SecEnd); } Function *ModuleSanitizerCoverage::CreateInitCallsForSections( @@ -345,7 +342,6 @@ Function *ModuleSanitizerCoverage::CreateInitCallsForSections( auto SecStart = SecStartEnd.first; auto SecEnd = SecStartEnd.second; Function *CtorFunc; - Type *PtrTy = PointerType::getUnqual(Ty); std::tie(CtorFunc, std::ignore) = createSanitizerCtorAndInitFunctions( M, CtorName, InitFunctionName, {PtrTy, PtrTy}, {SecStart, SecEnd}); assert(CtorFunc->getName() == CtorName); @@ -391,15 +387,9 @@ bool ModuleSanitizerCoverage::instrumentModule( FunctionPCsArray = nullptr; FunctionCFsArray = nullptr; IntptrTy = Type::getIntNTy(*C, DL->getPointerSizeInBits()); - IntptrPtrTy = PointerType::getUnqual(IntptrTy); + PtrTy = PointerType::getUnqual(*C); Type *VoidTy = Type::getVoidTy(*C); IRBuilder<> IRB(*C); - Int128PtrTy = PointerType::getUnqual(IRB.getInt128Ty()); - Int64PtrTy = PointerType::getUnqual(IRB.getInt64Ty()); - Int16PtrTy = PointerType::getUnqual(IRB.getInt16Ty()); - Int32PtrTy = PointerType::getUnqual(IRB.getInt32Ty()); - Int8PtrTy = PointerType::getUnqual(IRB.getInt8Ty()); - Int1PtrTy = PointerType::getUnqual(IRB.getInt1Ty()); Int64Ty = IRB.getInt64Ty(); Int32Ty = IRB.getInt32Ty(); Int16Ty = IRB.getInt16Ty(); @@ -438,26 +428,26 @@ bool ModuleSanitizerCoverage::instrumentModule( M.getOrInsertFunction(SanCovTraceConstCmp8, VoidTy, Int64Ty, Int64Ty); // Loads. - SanCovLoadFunction[0] = M.getOrInsertFunction(SanCovLoad1, VoidTy, Int8PtrTy); + SanCovLoadFunction[0] = M.getOrInsertFunction(SanCovLoad1, VoidTy, PtrTy); SanCovLoadFunction[1] = - M.getOrInsertFunction(SanCovLoad2, VoidTy, Int16PtrTy); + M.getOrInsertFunction(SanCovLoad2, VoidTy, PtrTy); SanCovLoadFunction[2] = - M.getOrInsertFunction(SanCovLoad4, VoidTy, Int32PtrTy); + M.getOrInsertFunction(SanCovLoad4, VoidTy, PtrTy); SanCovLoadFunction[3] = - M.getOrInsertFunction(SanCovLoad8, VoidTy, Int64PtrTy); + M.getOrInsertFunction(SanCovLoad8, VoidTy, PtrTy); SanCovLoadFunction[4] = - M.getOrInsertFunction(SanCovLoad16, VoidTy, Int128PtrTy); + M.getOrInsertFunction(SanCovLoad16, VoidTy, PtrTy); // Stores. SanCovStoreFunction[0] = - M.getOrInsertFunction(SanCovStore1, VoidTy, Int8PtrTy); + M.getOrInsertFunction(SanCovStore1, VoidTy, PtrTy); SanCovStoreFunction[1] = - M.getOrInsertFunction(SanCovStore2, VoidTy, Int16PtrTy); + M.getOrInsertFunction(SanCovStore2, VoidTy, PtrTy); SanCovStoreFunction[2] = - M.getOrInsertFunction(SanCovStore4, VoidTy, Int32PtrTy); + M.getOrInsertFunction(SanCovStore4, VoidTy, PtrTy); SanCovStoreFunction[3] = - M.getOrInsertFunction(SanCovStore8, VoidTy, Int64PtrTy); + M.getOrInsertFunction(SanCovStore8, VoidTy, PtrTy); SanCovStoreFunction[4] = - M.getOrInsertFunction(SanCovStore16, VoidTy, Int128PtrTy); + M.getOrInsertFunction(SanCovStore16, VoidTy, PtrTy); { AttributeList AL; @@ -470,7 +460,7 @@ bool ModuleSanitizerCoverage::instrumentModule( SanCovTraceGepFunction = M.getOrInsertFunction(SanCovTraceGep, VoidTy, IntptrTy); SanCovTraceSwitchFunction = - M.getOrInsertFunction(SanCovTraceSwitchName, VoidTy, Int64Ty, Int64PtrTy); + M.getOrInsertFunction(SanCovTraceSwitchName, VoidTy, Int64Ty, PtrTy); Constant *SanCovLowestStackConstant = M.getOrInsertGlobal(SanCovLowestStackName, IntptrTy); @@ -487,7 +477,7 @@ bool ModuleSanitizerCoverage::instrumentModule( SanCovTracePC = M.getOrInsertFunction(SanCovTracePCName, VoidTy); SanCovTracePCGuard = - M.getOrInsertFunction(SanCovTracePCGuardName, VoidTy, Int32PtrTy); + M.getOrInsertFunction(SanCovTracePCGuardName, VoidTy, PtrTy); for (auto &F : M) instrumentFunction(F, DTCallback, PDTCallback); @@ -510,7 +500,7 @@ bool ModuleSanitizerCoverage::instrumentModule( if (Ctor && Options.PCTable) { auto SecStartEnd = CreateSecStartEnd(M, SanCovPCsSectionName, IntptrTy); FunctionCallee InitFunction = declareSanitizerInitFunction( - M, SanCovPCsInitName, {IntptrPtrTy, IntptrPtrTy}); + M, SanCovPCsInitName, {PtrTy, PtrTy}); IRBuilder<> IRBCtor(Ctor->getEntryBlock().getTerminator()); IRBCtor.CreateCall(InitFunction, {SecStartEnd.first, SecStartEnd.second}); } @@ -518,7 +508,7 @@ bool ModuleSanitizerCoverage::instrumentModule( if (Ctor && Options.CollectControlFlow) { auto SecStartEnd = CreateSecStartEnd(M, SanCovCFsSectionName, IntptrTy); FunctionCallee InitFunction = declareSanitizerInitFunction( - M, SanCovCFsInitName, {IntptrPtrTy, IntptrPtrTy}); + M, SanCovCFsInitName, {PtrTy, PtrTy}); IRBuilder<> IRBCtor(Ctor->getEntryBlock().getTerminator()); IRBCtor.CreateCall(InitFunction, {SecStartEnd.first, SecStartEnd.second}); } @@ -616,7 +606,7 @@ void ModuleSanitizerCoverage::instrumentFunction( return; if (F.getName().find(".module_ctor") != std::string::npos) return; // Should not instrument sanitizer init functions. - if (F.getName().startswith("__sanitizer_")) + if (F.getName().starts_with("__sanitizer_")) return; // Don't instrument __sanitizer_* callbacks. // Don't touch available_externally functions, their actual body is elewhere. if (F.getLinkage() == GlobalValue::AvailableExternallyLinkage) @@ -744,19 +734,19 @@ ModuleSanitizerCoverage::CreatePCArray(Function &F, IRBuilder<> IRB(&*F.getEntryBlock().getFirstInsertionPt()); for (size_t i = 0; i < N; i++) { if (&F.getEntryBlock() == AllBlocks[i]) { - PCs.push_back((Constant *)IRB.CreatePointerCast(&F, IntptrPtrTy)); + PCs.push_back((Constant *)IRB.CreatePointerCast(&F, PtrTy)); PCs.push_back((Constant *)IRB.CreateIntToPtr( - ConstantInt::get(IntptrTy, 1), IntptrPtrTy)); + ConstantInt::get(IntptrTy, 1), PtrTy)); } else { PCs.push_back((Constant *)IRB.CreatePointerCast( - BlockAddress::get(AllBlocks[i]), IntptrPtrTy)); - PCs.push_back(Constant::getNullValue(IntptrPtrTy)); + BlockAddress::get(AllBlocks[i]), PtrTy)); + PCs.push_back(Constant::getNullValue(PtrTy)); } } - auto *PCArray = CreateFunctionLocalArrayInSection(N * 2, F, IntptrPtrTy, + auto *PCArray = CreateFunctionLocalArrayInSection(N * 2, F, PtrTy, SanCovPCsSectionName); PCArray->setInitializer( - ConstantArray::get(ArrayType::get(IntptrPtrTy, N * 2), PCs)); + ConstantArray::get(ArrayType::get(PtrTy, N * 2), PCs)); PCArray->setConstant(true); return PCArray; @@ -833,10 +823,9 @@ void ModuleSanitizerCoverage::InjectTraceForSwitch( Int64Ty->getScalarSizeInBits()) Cond = IRB.CreateIntCast(Cond, Int64Ty, false); for (auto It : SI->cases()) { - Constant *C = It.getCaseValue(); - if (C->getType()->getScalarSizeInBits() < - Int64Ty->getScalarSizeInBits()) - C = ConstantExpr::getCast(CastInst::ZExt, It.getCaseValue(), Int64Ty); + ConstantInt *C = It.getCaseValue(); + if (C->getType()->getScalarSizeInBits() < 64) + C = ConstantInt::get(C->getContext(), C->getValue().zext(64)); Initializers.push_back(C); } llvm::sort(drop_begin(Initializers, 2), @@ -850,7 +839,7 @@ void ModuleSanitizerCoverage::InjectTraceForSwitch( ConstantArray::get(ArrayOfInt64Ty, Initializers), "__sancov_gen_cov_switch_values"); IRB.CreateCall(SanCovTraceSwitchFunction, - {Cond, IRB.CreatePointerCast(GV, Int64PtrTy)}); + {Cond, IRB.CreatePointerCast(GV, PtrTy)}); } } } @@ -895,16 +884,13 @@ void ModuleSanitizerCoverage::InjectTraceForLoadsAndStores( : TypeSize == 128 ? 4 : -1; }; - Type *PointerType[5] = {Int8PtrTy, Int16PtrTy, Int32PtrTy, Int64PtrTy, - Int128PtrTy}; for (auto *LI : Loads) { InstrumentationIRBuilder IRB(LI); auto Ptr = LI->getPointerOperand(); int Idx = CallbackIdx(LI->getType()); if (Idx < 0) continue; - IRB.CreateCall(SanCovLoadFunction[Idx], - IRB.CreatePointerCast(Ptr, PointerType[Idx])); + IRB.CreateCall(SanCovLoadFunction[Idx], Ptr); } for (auto *SI : Stores) { InstrumentationIRBuilder IRB(SI); @@ -912,8 +898,7 @@ void ModuleSanitizerCoverage::InjectTraceForLoadsAndStores( int Idx = CallbackIdx(SI->getValueOperand()->getType()); if (Idx < 0) continue; - IRB.CreateCall(SanCovStoreFunction[Idx], - IRB.CreatePointerCast(Ptr, PointerType[Idx])); + IRB.CreateCall(SanCovStoreFunction[Idx], Ptr); } } @@ -978,7 +963,7 @@ void ModuleSanitizerCoverage::InjectCoverageAtBlock(Function &F, BasicBlock &BB, auto GuardPtr = IRB.CreateIntToPtr( IRB.CreateAdd(IRB.CreatePointerCast(FunctionGuardArray, IntptrTy), ConstantInt::get(IntptrTy, Idx * 4)), - Int32PtrTy); + PtrTy); IRB.CreateCall(SanCovTracePCGuard, GuardPtr)->setCannotMerge(); } if (Options.Inline8bitCounters) { @@ -1008,7 +993,7 @@ void ModuleSanitizerCoverage::InjectCoverageAtBlock(Function &F, BasicBlock &BB, Module *M = F.getParent(); Function *GetFrameAddr = Intrinsic::getDeclaration( M, Intrinsic::frameaddress, - IRB.getInt8PtrTy(M->getDataLayout().getAllocaAddrSpace())); + IRB.getPtrTy(M->getDataLayout().getAllocaAddrSpace())); auto FrameAddrPtr = IRB.CreateCall(GetFrameAddr, {Constant::getNullValue(Int32Ty)}); auto FrameAddrInt = IRB.CreatePtrToInt(FrameAddrPtr, IntptrTy); @@ -1059,40 +1044,40 @@ void ModuleSanitizerCoverage::createFunctionControlFlow(Function &F) { for (auto &BB : F) { // blockaddress can not be used on function's entry block. if (&BB == &F.getEntryBlock()) - CFs.push_back((Constant *)IRB.CreatePointerCast(&F, IntptrPtrTy)); + CFs.push_back((Constant *)IRB.CreatePointerCast(&F, PtrTy)); else CFs.push_back((Constant *)IRB.CreatePointerCast(BlockAddress::get(&BB), - IntptrPtrTy)); + PtrTy)); for (auto SuccBB : successors(&BB)) { assert(SuccBB != &F.getEntryBlock()); CFs.push_back((Constant *)IRB.CreatePointerCast(BlockAddress::get(SuccBB), - IntptrPtrTy)); + PtrTy)); } - CFs.push_back((Constant *)Constant::getNullValue(IntptrPtrTy)); + CFs.push_back((Constant *)Constant::getNullValue(PtrTy)); for (auto &Inst : BB) { if (CallBase *CB = dyn_cast<CallBase>(&Inst)) { if (CB->isIndirectCall()) { // TODO(navidem): handle indirect calls, for now mark its existence. CFs.push_back((Constant *)IRB.CreateIntToPtr( - ConstantInt::get(IntptrTy, -1), IntptrPtrTy)); + ConstantInt::get(IntptrTy, -1), PtrTy)); } else { auto CalledF = CB->getCalledFunction(); if (CalledF && !CalledF->isIntrinsic()) CFs.push_back( - (Constant *)IRB.CreatePointerCast(CalledF, IntptrPtrTy)); + (Constant *)IRB.CreatePointerCast(CalledF, PtrTy)); } } } - CFs.push_back((Constant *)Constant::getNullValue(IntptrPtrTy)); + CFs.push_back((Constant *)Constant::getNullValue(PtrTy)); } FunctionCFsArray = CreateFunctionLocalArrayInSection( - CFs.size(), F, IntptrPtrTy, SanCovCFsSectionName); + CFs.size(), F, PtrTy, SanCovCFsSectionName); FunctionCFsArray->setInitializer( - ConstantArray::get(ArrayType::get(IntptrPtrTy, CFs.size()), CFs)); + ConstantArray::get(ArrayType::get(PtrTy, CFs.size()), CFs)); FunctionCFsArray->setConstant(true); } |
