Author: Harald van Dijk Date: 2025-02-12T17:50:39Z New Revision: 23209eb1d9df57ca3419f5abc6b2edcdc0d1dead
URL: https://github.com/llvm/llvm-project/commit/23209eb1d9df57ca3419f5abc6b2edcdc0d1dead DIFF: https://github.com/llvm/llvm-project/commit/23209eb1d9df57ca3419f5abc6b2edcdc0d1dead.diff LOG: Revert "[DebugInfo] Update DIBuilder insertion to take InsertPosition (#126059)" This reverts commit 3ec9f7494b31f2fe51d5ed0e07adcf4b7199def6. Added: Modified: clang/lib/CodeGen/CGDebugInfo.cpp llvm/include/llvm/IR/DIBuilder.h llvm/lib/IR/DIBuilder.cpp llvm/lib/IR/DebugInfo.cpp llvm/lib/Transforms/Coroutines/CoroFrame.cpp llvm/lib/Transforms/Scalar/SROA.cpp llvm/lib/Transforms/Utils/Debugify.cpp llvm/lib/Transforms/Utils/Local.cpp llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp llvm/unittests/IR/IRBuilderTest.cpp llvm/unittests/Transforms/Utils/CloningTest.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index b679cdddc975b..d5b584ec0f2e9 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -4901,7 +4901,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD, llvm::DILocation::get(CGM.getLLVMContext(), Line, Column, Scope, CurInlinedAt), - Builder.GetInsertBlock()->end()); + Builder.GetInsertBlock()); } } } @@ -4969,7 +4969,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const VarDecl *VD, DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), llvm::DILocation::get(CGM.getLLVMContext(), Line, Column, Scope, CurInlinedAt), - Builder.GetInsertBlock()->end()); + Builder.GetInsertBlock()); return D; } @@ -5075,7 +5075,7 @@ llvm::DILocalVariable *CGDebugInfo::EmitDeclare(const BindingDecl *BD, DBuilder.insertDeclare(Storage, D, DBuilder.createExpression(Expr), llvm::DILocation::get(CGM.getLLVMContext(), Line, Column, Scope, CurInlinedAt), - Builder.GetInsertBlock()->end()); + Builder.GetInsertBlock()); return D; } @@ -5122,7 +5122,7 @@ void CGDebugInfo::EmitLabel(const LabelDecl *D, CGBuilderTy &Builder) { DBuilder.insertLabel(L, llvm::DILocation::get(CGM.getLLVMContext(), Line, Column, Scope, CurInlinedAt), - Builder.GetInsertBlock()->end()); + Builder.GetInsertBlock()); } llvm::DIType *CGDebugInfo::CreateSelfType(const QualType &QualTy, @@ -5200,10 +5200,9 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable( LexicalBlockStack.back(), CurInlinedAt); auto *Expr = DBuilder.createExpression(addr); if (InsertPoint) - DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint->getIterator()); + DBuilder.insertDeclare(Storage, D, Expr, DL, InsertPoint); else - DBuilder.insertDeclare(Storage, D, Expr, DL, - Builder.GetInsertBlock()->end()); + DBuilder.insertDeclare(Storage, D, Expr, DL, Builder.GetInsertBlock()); } llvm::DILocalVariable * @@ -5386,7 +5385,7 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block, DBuilder.insertDeclare(Alloca, debugVar, DBuilder.createExpression(), llvm::DILocation::get(CGM.getLLVMContext(), line, column, scope, CurInlinedAt), - Builder.GetInsertBlock()->end()); + Builder.GetInsertBlock()); } llvm::DIDerivedType * @@ -5866,7 +5865,7 @@ void CGDebugInfo::EmitPseudoVariable(CGBuilderTy &Builder, if (auto InsertPoint = Value->getInsertionPointAfterDef()) { DBuilder.insertDbgValueIntrinsic(Value, D, DBuilder.createExpression(), DIL, - *InsertPoint); + &**InsertPoint); } } diff --git a/llvm/include/llvm/IR/DIBuilder.h b/llvm/include/llvm/IR/DIBuilder.h index 9b729eccda8ee..8bee9f4703dd9 100644 --- a/llvm/include/llvm/IR/DIBuilder.h +++ b/llvm/include/llvm/IR/DIBuilder.h @@ -92,15 +92,33 @@ namespace llvm { /// Create an \a temporary node and track it in \a UnresolvedNodes. void trackIfUnresolved(MDNode *N); + /// Internal helper for insertDeclare. + DbgInstPtr insertDeclare(llvm::Value *Storage, DILocalVariable *VarInfo, + DIExpression *Expr, const DILocation *DL, + BasicBlock *InsertBB, Instruction *InsertBefore); + + /// Internal helper for insertLabel. + DbgInstPtr insertLabel(DILabel *LabelInfo, const DILocation *DL, + BasicBlock *InsertBB, Instruction *InsertBefore); + /// Internal helper. Track metadata if untracked and insert \p DVR. - void insertDbgVariableRecord(DbgVariableRecord *DVR, - InsertPosition InsertPt); + void insertDbgVariableRecord(DbgVariableRecord *DVR, BasicBlock *InsertBB, + Instruction *InsertBefore, + bool InsertAtHead = false); /// Internal helper with common code used by insertDbg{Value,Addr}Intrinsic. Instruction *insertDbgIntrinsic(llvm::Function *Intrinsic, llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, - InsertPosition InsertPt); + BasicBlock *InsertBB, + Instruction *InsertBefore); + + /// Internal helper for insertDbgValueIntrinsic. + DbgInstPtr insertDbgValueIntrinsic(llvm::Value *Val, + DILocalVariable *VarInfo, + DIExpression *Expr, const DILocation *DL, + BasicBlock *InsertBB, + Instruction *InsertBefore); public: /// Construct a builder for a module. @@ -943,6 +961,16 @@ namespace llvm { StringRef Name = "", DINodeArray Elements = nullptr); + /// Insert a new llvm.dbg.declare intrinsic call. + /// \param Storage llvm::Value of the variable + /// \param VarInfo Variable's debug info descriptor. + /// \param Expr A complex location expression. + /// \param DL Debug info location. + /// \param InsertAtEnd Location for the new intrinsic. + DbgInstPtr insertDeclare(llvm::Value *Storage, DILocalVariable *VarInfo, + DIExpression *Expr, const DILocation *DL, + BasicBlock *InsertAtEnd); + /// Insert a new llvm.dbg.assign intrinsic call. /// \param LinkedInstr Instruction with a DIAssignID to link with the new /// intrinsic. The intrinsic will be inserted after @@ -967,28 +995,46 @@ namespace llvm { /// \param VarInfo Variable's debug info descriptor. /// \param Expr A complex location expression. /// \param DL Debug info location. - /// \param InsertPt Location for the new intrinsic. + /// \param InsertBefore Location for the new intrinsic. DbgInstPtr insertDeclare(llvm::Value *Storage, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, - InsertPosition InsertPt); + Instruction *InsertBefore); /// Insert a new llvm.dbg.label intrinsic call. /// \param LabelInfo Label's debug info descriptor. /// \param DL Debug info location. /// \param InsertBefore Location for the new intrinsic. DbgInstPtr insertLabel(DILabel *LabelInfo, const DILocation *DL, - InsertPosition InsertPt); + Instruction *InsertBefore); + + /// Insert a new llvm.dbg.label intrinsic call. + /// \param LabelInfo Label's debug info descriptor. + /// \param DL Debug info location. + /// \param InsertAtEnd Location for the new intrinsic. + DbgInstPtr insertLabel(DILabel *LabelInfo, const DILocation *DL, + BasicBlock *InsertAtEnd); + + /// Insert a new llvm.dbg.value intrinsic call. + /// \param Val llvm::Value of the variable + /// \param VarInfo Variable's debug info descriptor. + /// \param Expr A complex location expression. + /// \param DL Debug info location. + /// \param InsertAtEnd Location for the new intrinsic. + DbgInstPtr insertDbgValueIntrinsic(llvm::Value *Val, + DILocalVariable *VarInfo, + DIExpression *Expr, const DILocation *DL, + BasicBlock *InsertAtEnd); /// Insert a new llvm.dbg.value intrinsic call. /// \param Val llvm::Value of the variable /// \param VarInfo Variable's debug info descriptor. /// \param Expr A complex location expression. /// \param DL Debug info location. - /// \param InsertPt Location for the new intrinsic. + /// \param InsertBefore Location for the new intrinsic. DbgInstPtr insertDbgValueIntrinsic(llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, - InsertPosition InsertPt); + Instruction *InsertBefore); /// Replace the vtable holder in the given type. /// diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index 76896b95ed755..b49b4e4f3fd2d 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -960,6 +960,22 @@ DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File, File, Line, Col); } +DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, + DIExpression *Expr, const DILocation *DL, + Instruction *InsertBefore) { + return insertDeclare(Storage, VarInfo, Expr, DL, InsertBefore->getParent(), + InsertBefore); +} + +DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, + DIExpression *Expr, const DILocation *DL, + BasicBlock *InsertAtEnd) { + // If this block already has a terminator then insert this intrinsic before + // the terminator. Otherwise, put it at the end of the block. + Instruction *InsertBefore = InsertAtEnd->getTerminator(); + return insertDeclare(Storage, VarInfo, Expr, DL, InsertAtEnd, InsertBefore); +} + DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *SrcVar, DIExpression *ValExpr, Value *Addr, @@ -972,10 +988,11 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, if (M.IsNewDbgInfoFormat) { DbgVariableRecord *DVR = DbgVariableRecord::createDVRAssign( Val, SrcVar, ValExpr, Link, Addr, AddrExpr, DL); + BasicBlock *InsertBB = LinkedInstr->getParent(); // Insert after LinkedInstr. BasicBlock::iterator NextIt = std::next(LinkedInstr->getIterator()); - NextIt.setHeadBit(true); - insertDbgVariableRecord(DVR, NextIt); + Instruction *InsertBefore = NextIt == InsertBB->end() ? nullptr : &*NextIt; + insertDbgVariableRecord(DVR, InsertBB, InsertBefore, true); return DVR; } @@ -1001,11 +1018,47 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, return DVI; } +DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, + Instruction *InsertBefore) { + return insertLabel(LabelInfo, DL, + InsertBefore ? InsertBefore->getParent() : nullptr, + InsertBefore); +} + +DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, + BasicBlock *InsertAtEnd) { + return insertLabel(LabelInfo, DL, InsertAtEnd, nullptr); +} + +DbgInstPtr DIBuilder::insertDbgValueIntrinsic(Value *V, + DILocalVariable *VarInfo, + DIExpression *Expr, + const DILocation *DL, + Instruction *InsertBefore) { + DbgInstPtr DVI = insertDbgValueIntrinsic( + V, VarInfo, Expr, DL, InsertBefore ? InsertBefore->getParent() : nullptr, + InsertBefore); + if (auto *Inst = dyn_cast<Instruction *>(DVI)) + cast<CallInst>(Inst)->setTailCall(); + return DVI; +} + +DbgInstPtr DIBuilder::insertDbgValueIntrinsic(Value *V, + DILocalVariable *VarInfo, + DIExpression *Expr, + const DILocation *DL, + BasicBlock *InsertAtEnd) { + return insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr); +} + /// Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics. /// This abstracts over the various ways to specify an insert position. static void initIRBuilder(IRBuilder<> &Builder, const DILocation *DL, - InsertPosition InsertPt) { - Builder.SetInsertPoint(InsertPt.getBasicBlock(), InsertPt); + BasicBlock *InsertBB, Instruction *InsertBefore) { + if (InsertBefore) + Builder.SetInsertPoint(InsertBefore); + else if (InsertBB) + Builder.SetInsertPoint(InsertBB); Builder.SetCurrentDebugLocation(DL); } @@ -1018,28 +1071,26 @@ static Function *getDeclareIntrin(Module &M) { return Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_declare); } -DbgInstPtr DIBuilder::insertDbgValueIntrinsic(llvm::Value *Val, - DILocalVariable *VarInfo, - DIExpression *Expr, - const DILocation *DL, - InsertPosition InsertPt) { +DbgInstPtr DIBuilder::insertDbgValueIntrinsic( + llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, + const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) { if (M.IsNewDbgInfoFormat) { DbgVariableRecord *DVR = DbgVariableRecord::createDbgVariableRecord(Val, VarInfo, Expr, DL); - insertDbgVariableRecord(DVR, InsertPt); + insertDbgVariableRecord(DVR, InsertBB, InsertBefore); return DVR; } if (!ValueFn) ValueFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_value); - auto *DVI = insertDbgIntrinsic(ValueFn, Val, VarInfo, Expr, DL, InsertPt); - cast<CallInst>(DVI)->setTailCall(); - return DVI; + return insertDbgIntrinsic(ValueFn, Val, VarInfo, Expr, DL, InsertBB, + InsertBefore); } DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, - InsertPosition InsertPt) { + BasicBlock *InsertBB, + Instruction *InsertBefore) { assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare"); assert(DL && "Expected debug loc"); assert(DL->getScope()->getSubprogram() == @@ -1049,7 +1100,7 @@ DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, if (M.IsNewDbgInfoFormat) { DbgVariableRecord *DVR = DbgVariableRecord::createDVRDeclare(Storage, VarInfo, Expr, DL); - insertDbgVariableRecord(DVR, InsertPt); + insertDbgVariableRecord(DVR, InsertBB, InsertBefore); return DVR; } @@ -1063,27 +1114,35 @@ DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, MetadataAsValue::get(VMContext, Expr)}; IRBuilder<> B(DL->getContext()); - initIRBuilder(B, DL, InsertPt); + initIRBuilder(B, DL, InsertBB, InsertBefore); return B.CreateCall(DeclareFn, Args); } void DIBuilder::insertDbgVariableRecord(DbgVariableRecord *DVR, - InsertPosition InsertPt) { - assert(InsertPt.isValid()); + BasicBlock *InsertBB, + Instruction *InsertBefore, + bool InsertAtHead) { + assert(InsertBefore || InsertBB); trackIfUnresolved(DVR->getVariable()); trackIfUnresolved(DVR->getExpression()); if (DVR->isDbgAssign()) trackIfUnresolved(DVR->getAddressExpression()); - auto *BB = InsertPt.getBasicBlock(); - BB->insertDbgRecordBefore(DVR, InsertPt); + BasicBlock::iterator InsertPt; + if (InsertBB && InsertBefore) + InsertPt = InsertBefore->getIterator(); + else if (InsertBB) + InsertPt = InsertBB->end(); + InsertPt.setHeadBit(InsertAtHead); + InsertBB->insertDbgRecordBefore(DVR, InsertPt); } Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn, Value *V, DILocalVariable *VarInfo, DIExpression *Expr, const DILocation *DL, - InsertPosition InsertPt) { + BasicBlock *InsertBB, + Instruction *InsertBefore) { assert(IntrinsicFn && "must pass a non-null intrinsic function"); assert(V && "must pass a value to a dbg intrinsic"); assert(VarInfo && @@ -1100,12 +1159,13 @@ Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn, MetadataAsValue::get(VMContext, Expr)}; IRBuilder<> B(DL->getContext()); - initIRBuilder(B, DL, InsertPt); + initIRBuilder(B, DL, InsertBB, InsertBefore); return B.CreateCall(IntrinsicFn, Args); } DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, - InsertPosition InsertPt) { + BasicBlock *InsertBB, + Instruction *InsertBefore) { assert(LabelInfo && "empty or invalid DILabel* passed to dbg.label"); assert(DL && "Expected debug loc"); assert(DL->getScope()->getSubprogram() == @@ -1115,10 +1175,10 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, trackIfUnresolved(LabelInfo); if (M.IsNewDbgInfoFormat) { DbgLabelRecord *DLR = new DbgLabelRecord(LabelInfo, DL); - if (InsertPt.isValid()) { - auto *BB = InsertPt.getBasicBlock(); - BB->insertDbgRecordBefore(DLR, InsertPt); - } + if (InsertBB && InsertBefore) + InsertBB->insertDbgRecordBefore(DLR, InsertBefore->getIterator()); + else if (InsertBB) + InsertBB->insertDbgRecordBefore(DLR, InsertBB->end()); return DLR; } @@ -1128,7 +1188,7 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, Value *Args[] = {MetadataAsValue::get(VMContext, LabelInfo)}; IRBuilder<> B(DL->getContext()); - initIRBuilder(B, DL, InsertPt); + initIRBuilder(B, DL, InsertBB, InsertBefore); return B.CreateCall(LabelFn, Args); } diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 67c43c1750ed9..ea1d79d436041 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -1690,8 +1690,7 @@ LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordBefore( DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare( unwrap(Storage), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr), unwrap<DILocation>(DL), - Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator()) - : nullptr); + unwrap<Instruction>(Instr)); // This assert will fail if the module is in the old debug info format. // This function should only be called if the module is in the new // debug info format. @@ -1707,8 +1706,7 @@ LLVMDbgRecordRef LLVMDIBuilderInsertDeclareRecordAtEnd( LLVMMetadataRef Expr, LLVMMetadataRef DL, LLVMBasicBlockRef Block) { DbgInstPtr DbgInst = unwrap(Builder)->insertDeclare( unwrap(Storage), unwrap<DILocalVariable>(VarInfo), - unwrap<DIExpression>(Expr), unwrap<DILocation>(DL), - Block ? InsertPosition(unwrap(Block)->end()) : nullptr); + unwrap<DIExpression>(Expr), unwrap<DILocation>(DL), unwrap(Block)); // This assert will fail if the module is in the old debug info format. // This function should only be called if the module is in the new // debug info format. @@ -1724,9 +1722,7 @@ LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordBefore( LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr) { DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic( unwrap(Val), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr), - unwrap<DILocation>(DebugLoc), - Instr ? InsertPosition(unwrap<Instruction>(Instr)->getIterator()) - : nullptr); + unwrap<DILocation>(DebugLoc), unwrap<Instruction>(Instr)); // This assert will fail if the module is in the old debug info format. // This function should only be called if the module is in the new // debug info format. @@ -1742,8 +1738,7 @@ LLVMDbgRecordRef LLVMDIBuilderInsertDbgValueRecordAtEnd( LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block) { DbgInstPtr DbgInst = unwrap(Builder)->insertDbgValueIntrinsic( unwrap(Val), unwrap<DILocalVariable>(VarInfo), unwrap<DIExpression>(Expr), - unwrap<DILocation>(DebugLoc), - Block ? InsertPosition(unwrap(Block)->end()) : nullptr); + unwrap<DILocation>(DebugLoc), unwrap(Block)); // This assert will fail if the module is in the old debug info format. // This function should only be called if the module is in the new // debug info format. @@ -1814,19 +1809,16 @@ LLVMMetadataRef LLVMDIBuilderCreateLabel( LLVMMetadataRef Context, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMBool AlwaysPreserve) { return wrap(unwrap(Builder)->createLabel( - unwrapDI<DIScope>(Context), StringRef(Name, NameLen), - unwrapDI<DIFile>(File), LineNo, AlwaysPreserve)); + unwrapDI<DIScope>(Context), StringRef(Name, NameLen), + unwrapDI<DIFile>(File), LineNo, AlwaysPreserve)); } -LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder, - LLVMMetadataRef LabelInfo, - LLVMMetadataRef Location, - LLVMValueRef InsertBefore) { +LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore( + LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, + LLVMMetadataRef Location, LLVMValueRef InsertBefore) { DbgInstPtr DbgInst = unwrap(Builder)->insertLabel( - unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location), - InsertBefore - ? InsertPosition(unwrap<Instruction>(InsertBefore)->getIterator()) - : nullptr); + unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location), + unwrap<Instruction>(InsertBefore)); // This assert will fail if the module is in the old debug info format. // This function should only be called if the module is in the new // debug info format. @@ -1837,13 +1829,12 @@ LLVMDbgRecordRef LLVMDIBuilderInsertLabelBefore(LLVMDIBuilderRef Builder, return wrap(cast<DbgRecord *>(DbgInst)); } -LLVMDbgRecordRef LLVMDIBuilderInsertLabelAtEnd(LLVMDIBuilderRef Builder, - LLVMMetadataRef LabelInfo, - LLVMMetadataRef Location, - LLVMBasicBlockRef InsertAtEnd) { +LLVMDbgRecordRef LLVMDIBuilderInsertLabelAtEnd( + LLVMDIBuilderRef Builder, LLVMMetadataRef LabelInfo, + LLVMMetadataRef Location, LLVMBasicBlockRef InsertAtEnd) { DbgInstPtr DbgInst = unwrap(Builder)->insertLabel( - unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location), - InsertAtEnd ? InsertPosition(unwrap(InsertAtEnd)->end()) : nullptr); + unwrapDI<DILabel>(LabelInfo), unwrapDI<DILocation>(Location), + unwrap(InsertAtEnd)); // This assert will fail if the module is in the old debug info format. // This function should only be called if the module is in the new // debug info format. diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index 62fa3af502e29..4104e4e533e9d 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -851,7 +851,7 @@ static void buildFrameDebugInfo(Function &F, coro::Shape &Shape, } else { DBuilder.insertDeclare(Shape.FramePtr, FrameDIVar, DBuilder.createExpression(), DILoc, - Shape.getInsertPtAfterFramePtr()); + &*Shape.getInsertPtAfterFramePtr()); } } @@ -1146,7 +1146,7 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) { DIBuilder(*CurrentBlock->getParent()->getParent(), AllowUnresolved) .insertDeclare(CurrentReload, DDI->getVariable(), DDI->getExpression(), DDI->getDebugLoc(), - Builder.GetInsertPoint()); + &*Builder.GetInsertPoint()); } // This dbg.declare is for the main function entry point. It // will be deleted in all coro-split functions. diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index e88c130cccf20..29240aaaa21be 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -5154,7 +5154,7 @@ insertNewDbgInst(DIBuilder &DIB, DbgDeclareInst *Orig, AllocaInst *NewAddr, return; DIB.insertDeclare(NewAddr, Orig->getVariable(), NewAddrExpr, - Orig->getDebugLoc(), BeforeInst->getIterator()); + Orig->getDebugLoc(), BeforeInst); } /// Insert a new dbg.assign. diff --git a/llvm/lib/Transforms/Utils/Debugify.cpp b/llvm/lib/Transforms/Utils/Debugify.cpp index e47a6ce6e9205..e5e2aa6556930 100644 --- a/llvm/lib/Transforms/Utils/Debugify.cpp +++ b/llvm/lib/Transforms/Utils/Debugify.cpp @@ -127,7 +127,7 @@ bool llvm::applyDebugifyMetadata( // Helper that inserts a dbg.value before \p InsertBefore, copying the // location (and possibly the type, if it's non-void) from \p TemplateInst. auto insertDbgVal = [&](Instruction &TemplateInst, - BasicBlock::iterator InsertPt) { + Instruction *InsertBefore) { std::string Name = utostr(NextVar++); Value *V = &TemplateInst; if (TemplateInst.getType()->isVoidTy()) @@ -137,7 +137,7 @@ bool llvm::applyDebugifyMetadata( getCachedDIType(V->getType()), /*AlwaysPreserve=*/true); DIB.insertDbgValueIntrinsic(V, LocalVar, DIB.createExpression(), Loc, - InsertPt); + InsertBefore); }; for (BasicBlock &BB : F) { @@ -161,9 +161,7 @@ bool llvm::applyDebugifyMetadata( // are made. BasicBlock::iterator InsertPt = BB.getFirstInsertionPt(); assert(InsertPt != BB.end() && "Expected to find an insertion point"); - - // Insert after existing debug values to preserve order. - InsertPt.setHeadBit(false); + Instruction *InsertBefore = &*InsertPt; // Attach debug values. for (Instruction *I = &*BB.begin(); I != LastInst; I = I->getNextNode()) { @@ -174,9 +172,9 @@ bool llvm::applyDebugifyMetadata( // Phis and EH pads must be grouped at the beginning of the block. // Only advance the insertion point when we finish visiting these. if (!isa<PHINode>(I) && !I->isEHPad()) - InsertPt = std::next(I->getIterator()); + InsertBefore = I->getNextNode(); - insertDbgVal(*I, InsertPt); + insertDbgVal(*I, InsertBefore); InsertedDbgVal = true; } } @@ -187,7 +185,7 @@ bool llvm::applyDebugifyMetadata( // those tests, and this helps with that.) if (DebugifyLevel == Level::LocationsAndVariables && !InsertedDbgVal) { auto *Term = findTerminatingInstruction(F.getEntryBlock()); - insertDbgVal(*Term, Term->getIterator()); + insertDbgVal(*Term, Term); } if (ApplyToMF) ApplyToMF(DIB, F); diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 6d7c710020c3e..2c6328300738f 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1693,7 +1693,9 @@ static void insertDbgValueOrDbgVariableRecord(DIBuilder &Builder, Value *DV, const DebugLoc &NewLoc, BasicBlock::iterator Instr) { if (!UseNewDbgInfoFormat) { - Builder.insertDbgValueIntrinsic(DV, DIVar, DIExpr, NewLoc, Instr); + auto DbgVal = Builder.insertDbgValueIntrinsic(DV, DIVar, DIExpr, NewLoc, + (Instruction *)nullptr); + cast<Instruction *>(DbgVal)->insertBefore(Instr); } else { // RemoveDIs: if we're using the new debug-info format, allocate a // DbgVariableRecord directly instead of a dbg.value intrinsic. @@ -1706,10 +1708,19 @@ static void insertDbgValueOrDbgVariableRecord(DIBuilder &Builder, Value *DV, static void insertDbgValueOrDbgVariableRecordAfter( DIBuilder &Builder, Value *DV, DILocalVariable *DIVar, DIExpression *DIExpr, - const DebugLoc &NewLoc, Instruction *Instr) { - BasicBlock::iterator NextIt = std::next(Instr->getIterator()); - NextIt.setHeadBit(true); - insertDbgValueOrDbgVariableRecord(Builder, DV, DIVar, DIExpr, NewLoc, NextIt); + const DebugLoc &NewLoc, BasicBlock::iterator Instr) { + if (!UseNewDbgInfoFormat) { + auto DbgVal = Builder.insertDbgValueIntrinsic(DV, DIVar, DIExpr, NewLoc, + (Instruction *)nullptr); + cast<Instruction *>(DbgVal)->insertAfter(Instr); + } else { + // RemoveDIs: if we're using the new debug-info format, allocate a + // DbgVariableRecord directly instead of a dbg.value intrinsic. + ValueAsMetadata *DVAM = ValueAsMetadata::get(DV); + DbgVariableRecord *DV = + new DbgVariableRecord(DVAM, DIVar, DIExpr, NewLoc.get()); + Instr->getParent()->insertDbgRecordAfter(DV, &*Instr); + } } /// Inserts a llvm.dbg.value intrinsic before a store to an alloca'd value @@ -1801,7 +1812,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII, // preferable to keep tracking both the loaded value and the original // address in case the alloca can not be elided. insertDbgValueOrDbgVariableRecordAfter(Builder, LI, DIVar, DIExpr, NewLoc, - LI); + LI->getIterator()); } void llvm::ConvertDebugDeclareToDebugValue(DbgVariableRecord *DVR, diff --git a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index 05fd989271c32..016186cb6b09d 100644 --- a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -119,8 +119,7 @@ static void createDebugValue(DIBuilder &DIB, Value *NewValue, DILocalVariable *Variable, DIExpression *Expression, const DILocation *DI, Instruction *InsertBefore) { - DIB.insertDbgValueIntrinsic(NewValue, Variable, Expression, DI, - InsertBefore->getIterator()); + DIB.insertDbgValueIntrinsic(NewValue, Variable, Expression, DI, InsertBefore); } /// Helper for updating assignment tracking debug info when promoting allocas. diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp index a49c6b8a0b474..2fd52860e71b9 100644 --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -923,13 +923,12 @@ TEST_F(IRBuilderTest, DIBuilder) { { /* dbg.label | DbgLabelRecord */ // Insert before I and check order. - ExpectOrder(DIB.insertLabel(Label, LabelLoc, I->getIterator()), - I->getIterator()); + ExpectOrder(DIB.insertLabel(Label, LabelLoc, I), I->getIterator()); // We should be able to insert at the end of the block, even if there's // no terminator yet. Note that in RemoveDIs mode this record won't get // inserted into the block untill another instruction is added. - DbgInstPtr LabelRecord = DIB.insertLabel(Label, LabelLoc, BB->end()); + DbgInstPtr LabelRecord = DIB.insertLabel(Label, LabelLoc, BB); // Specifically do not insert a terminator, to check this works. `I` // should have absorbed the DbgLabelRecord in the new debug info mode. I = Builder.CreateAlloca(Builder.getInt32Ty()); @@ -946,7 +945,7 @@ TEST_F(IRBuilderTest, DIBuilder) { DIB.createAutoVariable(BarSP, "Y", File, 2, IntType, true); { /* dbg.value | DbgVariableRecord::Value */ ExpectOrder(DIB.insertDbgValueIntrinsic(I, VarX, DIB.createExpression(), - VarLoc, I->getIterator()), + VarLoc, I), I->getIterator()); // Check inserting at end of the block works as with labels. DbgInstPtr VarXValue = DIB.insertDbgValueIntrinsic( @@ -956,12 +955,11 @@ TEST_F(IRBuilderTest, DIBuilder) { EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); } { /* dbg.declare | DbgVariableRecord::Declare */ - ExpectOrder(DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, - I->getIterator()), + ExpectOrder(DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, I), I->getIterator()); // Check inserting at end of the block works as with labels. DbgInstPtr VarYDeclare = - DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, BB->end()); + DIB.insertDeclare(I, VarY, DIB.createExpression(), VarLoc, BB); I = Builder.CreateAlloca(Builder.getInt32Ty()); ExpectOrder(VarYDeclare, I->getIterator()); EXPECT_EQ(BB->getTrailingDbgRecords(), nullptr); diff --git a/llvm/unittests/Transforms/Utils/CloningTest.cpp b/llvm/unittests/Transforms/Utils/CloningTest.cpp index 03769ff59e372..f2b73c282b764 100644 --- a/llvm/unittests/Transforms/Utils/CloningTest.cpp +++ b/llvm/unittests/Transforms/Utils/CloningTest.cpp @@ -508,7 +508,7 @@ class CloneFunc : public ::testing::Test { auto *Variable = DBuilder.createAutoVariable(Subprogram, "x", File, 5, IntType, true); auto *DL = DILocation::get(Subprogram->getContext(), 5, 0, Subprogram); - DBuilder.insertDeclare(Alloca, Variable, E, DL, Store->getIterator()); + DBuilder.insertDeclare(Alloca, Variable, E, DL, Store); DBuilder.insertDbgValueIntrinsic(AllocaContent, Variable, E, DL, Entry); // Also create an inlined variable. // Create a distinct struct type that we should not duplicate during @@ -528,8 +528,7 @@ class CloneFunc : public ::testing::Test { Subprogram->getContext(), 9, 4, Scope, DILocation::get(Subprogram->getContext(), 5, 2, Subprogram)); IBuilder.SetCurrentDebugLocation(InlinedDL); - DBuilder.insertDeclare(Alloca, InlinedVar, E, InlinedDL, - Store->getIterator()); + DBuilder.insertDeclare(Alloca, InlinedVar, E, InlinedDL, Store); IBuilder.CreateStore(IBuilder.getInt32(2), Alloca); // Finalize the debug info. DBuilder.finalize(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits