-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[RemoveDIs] Update DIBuilder to conditionally insert DbgRecords #84739
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 33 commits
b25c546
b503e84
3964cc5
36c7aa0
a706ca6
c3cec69
f443a18
88f6e21
c6bbfe4
035630f
1f95a01
eb428e6
42f4e74
063f9cd
60f9a2f
3a15cfa
7754eb9
0a96251
44008e2
2e69a99
8b03c20
63511e0
197ab57
ef7ce1a
333bc9e
5cc4a3e
4e0bfff
905a794
a7bbba3
edecd14
25c66b1
04a4e29
e12c7dc
bf1c8c1
8ea9e72
ba210ae
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -752,8 +752,6 @@ void BasicBlock::spliceDebugInfoEmptyBlock(BasicBlock::iterator Dest, | |
// occur when a block is optimised away and the terminator has been moved | ||
// somewhere else. | ||
if (Src->empty()) { | ||
assert(Dest != end() && | ||
"Transferring trailing DPValues to another trailing position"); | ||
DPMarker *SrcTrailingDPValues = Src->getTrailingDPValues(); | ||
if (!SrcTrailingDPValues) | ||
return; | ||
|
@@ -1038,15 +1036,10 @@ void BasicBlock::insertDPValueAfter(DbgRecord *DPV, Instruction *I) { | |
|
||
void BasicBlock::insertDPValueBefore(DbgRecord *DPV, | ||
InstListType::iterator Where) { | ||
// We should never directly insert at the end of the block, new DPValues | ||
// shouldn't be generated at times when there's no terminator. | ||
assert(Where != end()); | ||
assert(Where->getParent() == this); | ||
if (!Where->DbgMarker) | ||
createMarker(Where); | ||
assert(Where == end() || Where->getParent() == this); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is the first condition in this assert meant to be inverted? I would have thought that if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, so this is changing the condition here to account for insertions at |
||
bool InsertAtHead = Where.getHeadBit(); | ||
createMarker(&*Where); | ||
Where->DbgMarker->insertDPValue(DPV, InsertAtHead); | ||
DPMarker *M = createMarker(Where); | ||
M->insertDPValue(DPV, InsertAtHead); | ||
} | ||
|
||
DPMarker *BasicBlock::getNextMarker(Instruction *I) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -925,35 +925,47 @@ DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File, | |
File, Line, Col); | ||
} | ||
|
||
Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, | ||
DIExpression *Expr, const DILocation *DL, | ||
Instruction *InsertBefore) { | ||
DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, | ||
DIExpression *Expr, const DILocation *DL, | ||
Instruction *InsertBefore) { | ||
return insertDeclare(Storage, VarInfo, Expr, DL, InsertBefore->getParent(), | ||
InsertBefore); | ||
} | ||
|
||
Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, | ||
DIExpression *Expr, const DILocation *DL, | ||
BasicBlock *InsertAtEnd) { | ||
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); | ||
} | ||
|
||
DbgAssignIntrinsic * | ||
DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, | ||
DILocalVariable *SrcVar, DIExpression *ValExpr, | ||
Value *Addr, DIExpression *AddrExpr, | ||
const DILocation *DL) { | ||
DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, | ||
DILocalVariable *SrcVar, | ||
DIExpression *ValExpr, Value *Addr, | ||
DIExpression *AddrExpr, | ||
const DILocation *DL) { | ||
auto *Link = cast_or_null<DIAssignID>( | ||
LinkedInstr->getMetadata(LLVMContext::MD_DIAssignID)); | ||
assert(Link && "Linked instruction must have DIAssign metadata attached"); | ||
|
||
if (M.IsNewDbgInfoFormat) { | ||
DPValue *DPV = DPValue::createDPVAssign(Val, SrcVar, ValExpr, Link, Addr, | ||
AddrExpr, DL); | ||
BasicBlock *InsertBB = LinkedInstr->getParent(); | ||
// Insert after LinkedInstr. | ||
BasicBlock::iterator NextIt = std::next(LinkedInstr->getIterator()); | ||
Instruction *InsertBefore = NextIt == InsertBB->end() ? nullptr : &*NextIt; | ||
insertDPValue(DPV, InsertBB, InsertBefore, true); | ||
return DPV; | ||
} | ||
|
||
LLVMContext &Ctx = LinkedInstr->getContext(); | ||
Module *M = LinkedInstr->getModule(); | ||
if (!AssignFn) | ||
AssignFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_assign); | ||
|
||
auto *Link = LinkedInstr->getMetadata(LLVMContext::MD_DIAssignID); | ||
assert(Link && "Linked instruction must have DIAssign metadata attached"); | ||
|
||
std::array<Value *, 6> Args = { | ||
MetadataAsValue::get(Ctx, ValueAsMetadata::get(Val)), | ||
MetadataAsValue::get(Ctx, SrcVar), | ||
|
@@ -971,35 +983,36 @@ DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, | |
return DVI; | ||
} | ||
|
||
Instruction *DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, | ||
Instruction *InsertBefore) { | ||
DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, | ||
Instruction *InsertBefore) { | ||
return insertLabel(LabelInfo, DL, | ||
InsertBefore ? InsertBefore->getParent() : nullptr, | ||
InsertBefore); | ||
} | ||
|
||
Instruction *DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, | ||
BasicBlock *InsertAtEnd) { | ||
DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, | ||
BasicBlock *InsertAtEnd) { | ||
return insertLabel(LabelInfo, DL, InsertAtEnd, nullptr); | ||
} | ||
|
||
Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, | ||
DILocalVariable *VarInfo, | ||
DIExpression *Expr, | ||
const DILocation *DL, | ||
Instruction *InsertBefore) { | ||
Instruction *DVI = insertDbgValueIntrinsic( | ||
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); | ||
cast<CallInst>(DVI)->setTailCall(); | ||
if (DVI.is<Instruction *>()) | ||
cast<CallInst>(DVI.get<Instruction *>())->setTailCall(); | ||
return DVI; | ||
} | ||
|
||
Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V, | ||
DILocalVariable *VarInfo, | ||
DIExpression *Expr, | ||
const DILocation *DL, | ||
BasicBlock *InsertAtEnd) { | ||
DbgInstPtr DIBuilder::insertDbgValueIntrinsic(Value *V, | ||
DILocalVariable *VarInfo, | ||
DIExpression *Expr, | ||
const DILocation *DL, | ||
BasicBlock *InsertAtEnd) { | ||
return insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr); | ||
} | ||
|
||
|
@@ -1023,24 +1036,37 @@ static Function *getDeclareIntrin(Module &M) { | |
return Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); | ||
} | ||
|
||
Instruction *DIBuilder::insertDbgValueIntrinsic( | ||
DbgInstPtr DIBuilder::insertDbgValueIntrinsic( | ||
llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr, | ||
const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) { | ||
if (M.IsNewDbgInfoFormat) { | ||
DPValue *DPV = DPValue::createDPValue(Val, VarInfo, Expr, DL); | ||
insertDPValue(DPV, InsertBB, InsertBefore); | ||
return DPV; | ||
} | ||
|
||
if (!ValueFn) | ||
ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); | ||
return insertDbgIntrinsic(ValueFn, Val, VarInfo, Expr, DL, InsertBB, | ||
InsertBefore); | ||
} | ||
|
||
Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, | ||
DIExpression *Expr, const DILocation *DL, | ||
BasicBlock *InsertBB, | ||
Instruction *InsertBefore) { | ||
DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, | ||
DIExpression *Expr, const DILocation *DL, | ||
BasicBlock *InsertBB, | ||
Instruction *InsertBefore) { | ||
assert(VarInfo && "empty or invalid DILocalVariable* passed to dbg.declare"); | ||
assert(DL && "Expected debug loc"); | ||
assert(DL->getScope()->getSubprogram() == | ||
VarInfo->getScope()->getSubprogram() && | ||
"Expected matching subprograms"); | ||
|
||
if (M.IsNewDbgInfoFormat) { | ||
DPValue *DPV = DPValue::createDPVDeclare(Storage, VarInfo, Expr, DL); | ||
insertDPValue(DPV, InsertBB, InsertBefore); | ||
return DPV; | ||
} | ||
|
||
if (!DeclareFn) | ||
DeclareFn = getDeclareIntrin(M); | ||
|
||
|
@@ -1055,6 +1081,23 @@ Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo, | |
return B.CreateCall(DeclareFn, Args); | ||
} | ||
|
||
void DIBuilder::insertDPValue(DPValue *DPV, BasicBlock *InsertBB, | ||
Instruction *InsertBefore, bool InsertAtHead) { | ||
assert(InsertBefore || InsertBB); | ||
trackIfUnresolved(DPV->getVariable()); | ||
trackIfUnresolved(DPV->getExpression()); | ||
if (DPV->isDbgAssign()) | ||
trackIfUnresolved(DPV->getAddressExpression()); | ||
|
||
BasicBlock::iterator InsertPt; | ||
if (InsertBB && InsertBefore) | ||
InsertPt = InsertBefore->getIterator(); | ||
else if (InsertBB) | ||
InsertPt = InsertBB->end(); | ||
InsertPt.setHeadBit(InsertAtHead); | ||
InsertBB->insertDPValueBefore(DPV, InsertPt); | ||
} | ||
|
||
Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn, | ||
Value *V, DILocalVariable *VarInfo, | ||
DIExpression *Expr, | ||
|
@@ -1081,18 +1124,29 @@ Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn, | |
return B.CreateCall(IntrinsicFn, Args); | ||
} | ||
|
||
Instruction *DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, | ||
BasicBlock *InsertBB, | ||
Instruction *InsertBefore) { | ||
DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, | ||
BasicBlock *InsertBB, | ||
Instruction *InsertBefore) { | ||
assert(LabelInfo && "empty or invalid DILabel* passed to dbg.label"); | ||
assert(DL && "Expected debug loc"); | ||
assert(DL->getScope()->getSubprogram() == | ||
LabelInfo->getScope()->getSubprogram() && | ||
"Expected matching subprograms"); | ||
|
||
trackIfUnresolved(LabelInfo); | ||
if (M.IsNewDbgInfoFormat) { | ||
DPLabel *DPL = new DPLabel(LabelInfo, DL); | ||
if (InsertBB && InsertBefore) | ||
InsertBB->insertDPValueBefore(DPL, InsertBefore->getIterator()); | ||
else if (InsertBB) | ||
InsertBB->insertDPValueBefore(DPL, InsertBB->end()); | ||
// FIXME: Use smart pointers for DbgRecord ownership management. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What would we need smart pointers for here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah that was a leftover comment to myself. Not needed here, was just musing on whether introducing smart pointers to type-ify DbgRecod ownership might be beneficial in the future. Deleted the comment! |
||
return DPL; | ||
} | ||
|
||
if (!LabelFn) | ||
LabelFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_label); | ||
|
||
trackIfUnresolved(LabelInfo); | ||
Value *Args[] = {MetadataAsValue::get(VMContext, LabelInfo)}; | ||
|
||
IRBuilder<> B(DL->getContext()); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this something that we see happen when building BBs in clang?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is hit by test
OpenMP/cancel_codegen.cpp