[llvm] 23209eb - Revert "[DebugInfo] Update DIBuilder insertion to take InsertPosition (#126059)"
Harald van Dijk via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 12 09:51:05 PST 2025
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();
More information about the llvm-commits
mailing list