mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 12:16:49 +00:00
Revert "[DebugInfo] Update DIBuilder insertion to take InsertPosition (#126059)"
This reverts commit 3ec9f7494b31f2fe51d5ed0e07adcf4b7199def6.
This commit is contained in:
parent
3ec9f7494b
commit
23209eb1d9
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
///
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user