Index: llvm/include/llvm/IR/IRBuilder.h =================================================================== --- llvm/include/llvm/IR/IRBuilder.h +++ llvm/include/llvm/IR/IRBuilder.h @@ -984,6 +984,10 @@ SetInsertPoint(TheBB, IP); } + /// Avoid copying the full IRBuilder. Prefer using InsertPointGuard + /// or FastMathFlagGuard instead. + IRBuilder(const IRBuilder &) = delete; + /// Get the constant folder being used. const T &getFolder() { return Folder; } Index: llvm/lib/IR/DIBuilder.cpp =================================================================== --- llvm/lib/IR/DIBuilder.cpp +++ llvm/lib/IR/DIBuilder.cpp @@ -895,19 +895,20 @@ return insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr); } -/// Return an IRBuilder for inserting dbg.declare and dbg.value intrinsics. This +/// An IRBuilder for inserting dbg.declare and dbg.value intrinsics. This /// abstracts over the various ways to specify an insert position. -static IRBuilder<> getIRBForDbgInsertion(const DILocation *DL, - BasicBlock *InsertBB, - Instruction *InsertBefore) { - IRBuilder<> B(DL->getContext()); - if (InsertBefore) - B.SetInsertPoint(InsertBefore); - else if (InsertBB) - B.SetInsertPoint(InsertBB); - B.SetCurrentDebugLocation(DL); - return B; -} +class IRBuilderForDbg : public IRBuilder<> { +public: + IRBuilderForDbg(const DILocation *DL, BasicBlock *InsertBB, + Instruction *InsertBefore) + : IRBuilder(DL->getContext()) { + if (InsertBefore) + SetInsertPoint(InsertBefore); + else if (InsertBB) + SetInsertPoint(InsertBB); + SetCurrentDebugLocation(DL); + } +}; static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) { assert(V && "no value passed to dbg intrinsic"); @@ -936,7 +937,7 @@ MetadataAsValue::get(VMContext, VarInfo), MetadataAsValue::get(VMContext, Expr)}; - IRBuilder<> B = getIRBForDbgInsertion(DL, InsertBB, InsertBefore); + IRBuilderForDbg B(DL, InsertBB, InsertBefore); return B.CreateCall(DeclareFn, Args); } @@ -958,7 +959,7 @@ MetadataAsValue::get(VMContext, VarInfo), MetadataAsValue::get(VMContext, Expr)}; - IRBuilder<> B = getIRBForDbgInsertion(DL, InsertBB, InsertBefore); + IRBuilderForDbg B(DL, InsertBB, InsertBefore); return B.CreateCall(ValueFn, Args); } @@ -976,7 +977,7 @@ trackIfUnresolved(LabelInfo); Value *Args[] = {MetadataAsValue::get(VMContext, LabelInfo)}; - IRBuilder<> B = getIRBForDbgInsertion(DL, InsertBB, InsertBefore); + IRBuilderForDbg B(DL, InsertBB, InsertBefore); return B.CreateCall(LabelFn, Args); } Index: llvm/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86ISelLowering.cpp +++ llvm/lib/Target/X86/X86ISelLowering.cpp @@ -27721,7 +27721,7 @@ AI->use_empty()) return nullptr; - auto Builder = IRBuilder<>(AI); + IRBuilder<> Builder(AI); Module *M = Builder.GetInsertBlock()->getParent()->getParent(); auto SSID = AI->getSyncScopeID(); // We must restrict the ordering to avoid generating loads with Release or Index: llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -787,7 +787,7 @@ StringRef OriginalName); void SetComdatForGlobalMetadata(GlobalVariable *G, GlobalVariable *Metadata, StringRef InternalSuffix); - IRBuilder<> CreateAsanModuleDtor(Module &M); + Instruction *CreateAsanModuleDtor(Module &M); bool ShouldInstrumentGlobal(GlobalVariable *G); bool ShouldUseMachOGlobalsSection() const; @@ -2030,13 +2030,13 @@ return Metadata; } -IRBuilder<> ModuleAddressSanitizer::CreateAsanModuleDtor(Module &M) { +Instruction *ModuleAddressSanitizer::CreateAsanModuleDtor(Module &M) { AsanDtorFunction = Function::Create(FunctionType::get(Type::getVoidTy(*C), false), GlobalValue::InternalLinkage, kAsanModuleDtorName, &M); BasicBlock *AsanDtorBB = BasicBlock::Create(*C, "", AsanDtorFunction); - return IRBuilder<>(ReturnInst::Create(*C, AsanDtorBB)); + return ReturnInst::Create(*C, AsanDtorBB); } void ModuleAddressSanitizer::InstrumentGlobalsCOFF( @@ -2115,7 +2115,7 @@ // We also need to unregister globals at the end, e.g., when a shared library // gets closed. - IRBuilder<> IRB_Dtor = CreateAsanModuleDtor(M); + IRBuilder<> IRB_Dtor(CreateAsanModuleDtor(M)); IRB_Dtor.CreateCall(AsanUnregisterElfGlobals, {IRB.CreatePointerCast(RegisteredFlag, IntptrTy), IRB.CreatePointerCast(StartELFMetadata, IntptrTy), @@ -2174,7 +2174,7 @@ // We also need to unregister globals at the end, e.g., when a shared library // gets closed. - IRBuilder<> IRB_Dtor = CreateAsanModuleDtor(M); + IRBuilder<> IRB_Dtor(CreateAsanModuleDtor(M)); IRB_Dtor.CreateCall(AsanUnregisterImageGlobals, {IRB.CreatePointerCast(RegisteredFlag, IntptrTy)}); } @@ -2202,7 +2202,7 @@ // We also need to unregister globals at the end, e.g., when a shared library // gets closed. - IRBuilder<> IRB_Dtor = CreateAsanModuleDtor(M); + IRBuilder<> IRB_Dtor(CreateAsanModuleDtor(M)); IRB_Dtor.CreateCall(AsanUnregisterGlobals, {IRB.CreatePointerCast(AllGlobals, IntptrTy), ConstantInt::get(IntptrTy, N)});