Revert "[DebugInfo] Update DIBuilder insertion to take InsertPosition (#126059)"

This reverts commit 3ec9f7494b31f2fe51d5ed0e07adcf4b7199def6.
This commit is contained in:
Harald van Dijk 2025-02-12 17:50:39 +00:00
parent 3ec9f7494b
commit 23209eb1d9
11 changed files with 200 additions and 99 deletions

View File

@ -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);
}
}

View File

@ -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 InsertPt Location for the new intrinsic.
/// \param InsertAtEnd Location for the new intrinsic.
DbgInstPtr insertDbgValueIntrinsic(llvm::Value *Val,
DILocalVariable *VarInfo,
DIExpression *Expr, const DILocation *DL,
InsertPosition InsertPt);
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 InsertBefore Location for the new intrinsic.
DbgInstPtr insertDbgValueIntrinsic(llvm::Value *Val,
DILocalVariable *VarInfo,
DIExpression *Expr, const DILocation *DL,
Instruction *InsertBefore);
/// Replace the vtable holder in the given type.
///

View File

@ -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);
}

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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);

View File

@ -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,

View File

@ -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.

View File

@ -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);

View File

@ -508,7 +508,7 @@ protected:
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 @@ protected:
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();