1 //=====-- DebugProgramInstruction.cpp - Implement DbgRecords/DbgMarkers --====//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/IR/DebugInfoMetadata.h"
10 #include "llvm/IR/DebugProgramInstruction.h"
11 #include "llvm/IR/DIBuilder.h"
12 #include "llvm/IR/IntrinsicInst.h"
13
14 namespace llvm {
15
16 template <typename T>
DbgRecordParamRef(const T * Param)17 DbgRecordParamRef<T>::DbgRecordParamRef(const T *Param)
18 : Ref(const_cast<T *>(Param)) {}
19 template <typename T>
DbgRecordParamRef(const MDNode * Param)20 DbgRecordParamRef<T>::DbgRecordParamRef(const MDNode *Param)
21 : Ref(const_cast<MDNode *>(Param)) {}
22
get() const23 template <typename T> T *DbgRecordParamRef<T>::get() const {
24 return cast<T>(Ref);
25 }
26
27 template class DbgRecordParamRef<DIExpression>;
28 template class DbgRecordParamRef<DILabel>;
29 template class DbgRecordParamRef<DILocalVariable>;
30
DbgVariableRecord(const DbgVariableIntrinsic * DVI)31 DbgVariableRecord::DbgVariableRecord(const DbgVariableIntrinsic *DVI)
32 : DbgRecord(ValueKind, DVI->getDebugLoc()),
33 DebugValueUser({DVI->getRawLocation(), nullptr, nullptr}),
34 Variable(DVI->getVariable()), Expression(DVI->getExpression()),
35 AddressExpression() {
36 switch (DVI->getIntrinsicID()) {
37 case Intrinsic::dbg_value:
38 Type = LocationType::Value;
39 break;
40 case Intrinsic::dbg_declare:
41 Type = LocationType::Declare;
42 break;
43 case Intrinsic::dbg_assign: {
44 Type = LocationType::Assign;
45 const DbgAssignIntrinsic *Assign =
46 static_cast<const DbgAssignIntrinsic *>(DVI);
47 resetDebugValue(1, Assign->getRawAddress());
48 AddressExpression = Assign->getAddressExpression();
49 setAssignId(Assign->getAssignID());
50 break;
51 }
52 default:
53 llvm_unreachable(
54 "Trying to create a DbgVariableRecord with an invalid intrinsic type!");
55 }
56 }
57
DbgVariableRecord(const DbgVariableRecord & DVR)58 DbgVariableRecord::DbgVariableRecord(const DbgVariableRecord &DVR)
59 : DbgRecord(ValueKind, DVR.getDebugLoc()), DebugValueUser(DVR.DebugValues),
60 Type(DVR.getType()), Variable(DVR.getVariable()),
61 Expression(DVR.getExpression()),
62 AddressExpression(DVR.AddressExpression) {}
63
DbgVariableRecord(Metadata * Location,DILocalVariable * DV,DIExpression * Expr,const DILocation * DI,LocationType Type)64 DbgVariableRecord::DbgVariableRecord(Metadata *Location, DILocalVariable *DV,
65 DIExpression *Expr, const DILocation *DI,
66 LocationType Type)
67 : DbgRecord(ValueKind, DI), DebugValueUser({Location, nullptr, nullptr}),
68 Type(Type), Variable(DV), Expression(Expr) {}
69
DbgVariableRecord(Metadata * Value,DILocalVariable * Variable,DIExpression * Expression,DIAssignID * AssignID,Metadata * Address,DIExpression * AddressExpression,const DILocation * DI)70 DbgVariableRecord::DbgVariableRecord(Metadata *Value, DILocalVariable *Variable,
71 DIExpression *Expression,
72 DIAssignID *AssignID, Metadata *Address,
73 DIExpression *AddressExpression,
74 const DILocation *DI)
75 : DbgRecord(ValueKind, DI), DebugValueUser({Value, Address, AssignID}),
76 Type(LocationType::Assign), Variable(Variable), Expression(Expression),
77 AddressExpression(AddressExpression) {}
78
deleteRecord()79 void DbgRecord::deleteRecord() {
80 switch (RecordKind) {
81 case ValueKind:
82 delete cast<DbgVariableRecord>(this);
83 return;
84 case LabelKind:
85 delete cast<DbgLabelRecord>(this);
86 return;
87 }
88 llvm_unreachable("unsupported DbgRecord kind");
89 }
90
print(raw_ostream & O,bool IsForDebug) const91 void DbgRecord::print(raw_ostream &O, bool IsForDebug) const {
92 switch (RecordKind) {
93 case ValueKind:
94 cast<DbgVariableRecord>(this)->print(O, IsForDebug);
95 return;
96 case LabelKind:
97 cast<DbgLabelRecord>(this)->print(O, IsForDebug);
98 return;
99 };
100 llvm_unreachable("unsupported DbgRecord kind");
101 }
102
print(raw_ostream & O,ModuleSlotTracker & MST,bool IsForDebug) const103 void DbgRecord::print(raw_ostream &O, ModuleSlotTracker &MST,
104 bool IsForDebug) const {
105 switch (RecordKind) {
106 case ValueKind:
107 cast<DbgVariableRecord>(this)->print(O, MST, IsForDebug);
108 return;
109 case LabelKind:
110 cast<DbgLabelRecord>(this)->print(O, MST, IsForDebug);
111 return;
112 };
113 llvm_unreachable("unsupported DbgRecord kind");
114 }
115
isIdenticalToWhenDefined(const DbgRecord & R) const116 bool DbgRecord::isIdenticalToWhenDefined(const DbgRecord &R) const {
117 if (RecordKind != R.RecordKind)
118 return false;
119 switch (RecordKind) {
120 case ValueKind:
121 return cast<DbgVariableRecord>(this)->isIdenticalToWhenDefined(
122 *cast<DbgVariableRecord>(&R));
123 case LabelKind:
124 return cast<DbgLabelRecord>(this)->getLabel() ==
125 cast<DbgLabelRecord>(R).getLabel();
126 };
127 llvm_unreachable("unsupported DbgRecord kind");
128 }
129
isEquivalentTo(const DbgRecord & R) const130 bool DbgRecord::isEquivalentTo(const DbgRecord &R) const {
131 return getDebugLoc() == R.getDebugLoc() && isIdenticalToWhenDefined(R);
132 }
133
134 DbgInfoIntrinsic *
createDebugIntrinsic(Module * M,Instruction * InsertBefore) const135 DbgRecord::createDebugIntrinsic(Module *M, Instruction *InsertBefore) const {
136 switch (RecordKind) {
137 case ValueKind:
138 return cast<DbgVariableRecord>(this)->createDebugIntrinsic(M, InsertBefore);
139 case LabelKind:
140 return cast<DbgLabelRecord>(this)->createDebugIntrinsic(M, InsertBefore);
141 };
142 llvm_unreachable("unsupported DbgRecord kind");
143 }
144
DbgLabelRecord(MDNode * Label,MDNode * DL)145 DbgLabelRecord::DbgLabelRecord(MDNode *Label, MDNode *DL)
146 : DbgRecord(LabelKind, DebugLoc(DL)), Label(Label) {
147 assert(Label && "Unexpected nullptr");
148 assert((isa<DILabel>(Label) || Label->isTemporary()) &&
149 "Label type must be or resolve to a DILabel");
150 }
DbgLabelRecord(DILabel * Label,DebugLoc DL)151 DbgLabelRecord::DbgLabelRecord(DILabel *Label, DebugLoc DL)
152 : DbgRecord(LabelKind, DL), Label(Label) {
153 assert(Label && "Unexpected nullptr");
154 }
155
createUnresolvedDbgLabelRecord(MDNode * Label,MDNode * DL)156 DbgLabelRecord *DbgLabelRecord::createUnresolvedDbgLabelRecord(MDNode *Label,
157 MDNode *DL) {
158 return new DbgLabelRecord(Label, DL);
159 }
160
DbgVariableRecord(DbgVariableRecord::LocationType Type,Metadata * Val,MDNode * Variable,MDNode * Expression,MDNode * AssignID,Metadata * Address,MDNode * AddressExpression,MDNode * DI)161 DbgVariableRecord::DbgVariableRecord(DbgVariableRecord::LocationType Type,
162 Metadata *Val, MDNode *Variable,
163 MDNode *Expression, MDNode *AssignID,
164 Metadata *Address,
165 MDNode *AddressExpression, MDNode *DI)
166 : DbgRecord(ValueKind, DebugLoc(DI)),
167 DebugValueUser({Val, Address, AssignID}), Type(Type), Variable(Variable),
168 Expression(Expression), AddressExpression(AddressExpression) {}
169
createUnresolvedDbgVariableRecord(DbgVariableRecord::LocationType Type,Metadata * Val,MDNode * Variable,MDNode * Expression,MDNode * AssignID,Metadata * Address,MDNode * AddressExpression,MDNode * DI)170 DbgVariableRecord *DbgVariableRecord::createUnresolvedDbgVariableRecord(
171 DbgVariableRecord::LocationType Type, Metadata *Val, MDNode *Variable,
172 MDNode *Expression, MDNode *AssignID, Metadata *Address,
173 MDNode *AddressExpression, MDNode *DI) {
174 return new DbgVariableRecord(Type, Val, Variable, Expression, AssignID,
175 Address, AddressExpression, DI);
176 }
177
178 DbgVariableRecord *
createDbgVariableRecord(Value * Location,DILocalVariable * DV,DIExpression * Expr,const DILocation * DI)179 DbgVariableRecord::createDbgVariableRecord(Value *Location, DILocalVariable *DV,
180 DIExpression *Expr,
181 const DILocation *DI) {
182 return new DbgVariableRecord(ValueAsMetadata::get(Location), DV, Expr, DI,
183 LocationType::Value);
184 }
185
createDbgVariableRecord(Value * Location,DILocalVariable * DV,DIExpression * Expr,const DILocation * DI,DbgVariableRecord & InsertBefore)186 DbgVariableRecord *DbgVariableRecord::createDbgVariableRecord(
187 Value *Location, DILocalVariable *DV, DIExpression *Expr,
188 const DILocation *DI, DbgVariableRecord &InsertBefore) {
189 auto *NewDbgVariableRecord = createDbgVariableRecord(Location, DV, Expr, DI);
190 NewDbgVariableRecord->insertBefore(&InsertBefore);
191 return NewDbgVariableRecord;
192 }
193
createDVRDeclare(Value * Address,DILocalVariable * DV,DIExpression * Expr,const DILocation * DI)194 DbgVariableRecord *DbgVariableRecord::createDVRDeclare(Value *Address,
195 DILocalVariable *DV,
196 DIExpression *Expr,
197 const DILocation *DI) {
198 return new DbgVariableRecord(ValueAsMetadata::get(Address), DV, Expr, DI,
199 LocationType::Declare);
200 }
201
202 DbgVariableRecord *
createDVRDeclare(Value * Address,DILocalVariable * DV,DIExpression * Expr,const DILocation * DI,DbgVariableRecord & InsertBefore)203 DbgVariableRecord::createDVRDeclare(Value *Address, DILocalVariable *DV,
204 DIExpression *Expr, const DILocation *DI,
205 DbgVariableRecord &InsertBefore) {
206 auto *NewDVRDeclare = createDVRDeclare(Address, DV, Expr, DI);
207 NewDVRDeclare->insertBefore(&InsertBefore);
208 return NewDVRDeclare;
209 }
210
createDVRAssign(Value * Val,DILocalVariable * Variable,DIExpression * Expression,DIAssignID * AssignID,Value * Address,DIExpression * AddressExpression,const DILocation * DI)211 DbgVariableRecord *DbgVariableRecord::createDVRAssign(
212 Value *Val, DILocalVariable *Variable, DIExpression *Expression,
213 DIAssignID *AssignID, Value *Address, DIExpression *AddressExpression,
214 const DILocation *DI) {
215 return new DbgVariableRecord(ValueAsMetadata::get(Val), Variable, Expression,
216 AssignID, ValueAsMetadata::get(Address),
217 AddressExpression, DI);
218 }
219
createLinkedDVRAssign(Instruction * LinkedInstr,Value * Val,DILocalVariable * Variable,DIExpression * Expression,Value * Address,DIExpression * AddressExpression,const DILocation * DI)220 DbgVariableRecord *DbgVariableRecord::createLinkedDVRAssign(
221 Instruction *LinkedInstr, Value *Val, DILocalVariable *Variable,
222 DIExpression *Expression, Value *Address, DIExpression *AddressExpression,
223 const DILocation *DI) {
224 auto *Link = LinkedInstr->getMetadata(LLVMContext::MD_DIAssignID);
225 assert(Link && "Linked instruction must have DIAssign metadata attached");
226 auto *NewDVRAssign = DbgVariableRecord::createDVRAssign(
227 Val, Variable, Expression, cast<DIAssignID>(Link), Address,
228 AddressExpression, DI);
229 LinkedInstr->getParent()->insertDbgRecordAfter(NewDVRAssign, LinkedInstr);
230 return NewDVRAssign;
231 }
232
233 iterator_range<DbgVariableRecord::location_op_iterator>
location_ops() const234 DbgVariableRecord::location_ops() const {
235 auto *MD = getRawLocation();
236 // If a Value has been deleted, the "location" for this DbgVariableRecord will
237 // be replaced by nullptr. Return an empty range.
238 if (!MD)
239 return {location_op_iterator(static_cast<ValueAsMetadata *>(nullptr)),
240 location_op_iterator(static_cast<ValueAsMetadata *>(nullptr))};
241
242 // If operand is ValueAsMetadata, return a range over just that operand.
243 if (auto *VAM = dyn_cast<ValueAsMetadata>(MD))
244 return {location_op_iterator(VAM), location_op_iterator(VAM + 1)};
245
246 // If operand is DIArgList, return a range over its args.
247 if (auto *AL = dyn_cast<DIArgList>(MD))
248 return {location_op_iterator(AL->args_begin()),
249 location_op_iterator(AL->args_end())};
250
251 // Operand is an empty metadata tuple, so return empty iterator.
252 assert(cast<MDNode>(MD)->getNumOperands() == 0);
253 return {location_op_iterator(static_cast<ValueAsMetadata *>(nullptr)),
254 location_op_iterator(static_cast<ValueAsMetadata *>(nullptr))};
255 }
256
getNumVariableLocationOps() const257 unsigned DbgVariableRecord::getNumVariableLocationOps() const {
258 if (hasArgList())
259 return cast<DIArgList>(getRawLocation())->getArgs().size();
260 return 1;
261 }
262
getVariableLocationOp(unsigned OpIdx) const263 Value *DbgVariableRecord::getVariableLocationOp(unsigned OpIdx) const {
264 auto *MD = getRawLocation();
265 if (!MD)
266 return nullptr;
267
268 if (auto *AL = dyn_cast<DIArgList>(MD))
269 return AL->getArgs()[OpIdx]->getValue();
270 if (isa<MDNode>(MD))
271 return nullptr;
272 assert(isa<ValueAsMetadata>(MD) &&
273 "Attempted to get location operand from DbgVariableRecord with none.");
274 auto *V = cast<ValueAsMetadata>(MD);
275 assert(OpIdx == 0 && "Operand Index must be 0 for a debug intrinsic with a "
276 "single location operand.");
277 return V->getValue();
278 }
279
getAsMetadata(Value * V)280 static ValueAsMetadata *getAsMetadata(Value *V) {
281 return isa<MetadataAsValue>(V) ? dyn_cast<ValueAsMetadata>(
282 cast<MetadataAsValue>(V)->getMetadata())
283 : ValueAsMetadata::get(V);
284 }
285
replaceVariableLocationOp(Value * OldValue,Value * NewValue,bool AllowEmpty)286 void DbgVariableRecord::replaceVariableLocationOp(Value *OldValue,
287 Value *NewValue,
288 bool AllowEmpty) {
289 assert(NewValue && "Values must be non-null");
290
291 bool DbgAssignAddrReplaced = isDbgAssign() && OldValue == getAddress();
292 if (DbgAssignAddrReplaced)
293 setAddress(NewValue);
294
295 auto Locations = location_ops();
296 auto OldIt = find(Locations, OldValue);
297 if (OldIt == Locations.end()) {
298 if (AllowEmpty || DbgAssignAddrReplaced)
299 return;
300 llvm_unreachable("OldValue must be a current location");
301 }
302
303 if (!hasArgList()) {
304 // Set our location to be the MAV wrapping the new Value.
305 setRawLocation(isa<MetadataAsValue>(NewValue)
306 ? cast<MetadataAsValue>(NewValue)->getMetadata()
307 : ValueAsMetadata::get(NewValue));
308 return;
309 }
310
311 // We must be referring to a DIArgList, produce a new operands vector with the
312 // old value replaced, generate a new DIArgList and set it as our location.
313 SmallVector<ValueAsMetadata *, 4> MDs;
314 ValueAsMetadata *NewOperand = getAsMetadata(NewValue);
315 for (auto *VMD : Locations)
316 MDs.push_back(VMD == *OldIt ? NewOperand : getAsMetadata(VMD));
317 setRawLocation(DIArgList::get(getVariableLocationOp(0)->getContext(), MDs));
318 }
319
replaceVariableLocationOp(unsigned OpIdx,Value * NewValue)320 void DbgVariableRecord::replaceVariableLocationOp(unsigned OpIdx,
321 Value *NewValue) {
322 assert(OpIdx < getNumVariableLocationOps() && "Invalid Operand Index");
323
324 if (!hasArgList()) {
325 setRawLocation(isa<MetadataAsValue>(NewValue)
326 ? cast<MetadataAsValue>(NewValue)->getMetadata()
327 : ValueAsMetadata::get(NewValue));
328 return;
329 }
330
331 SmallVector<ValueAsMetadata *, 4> MDs;
332 ValueAsMetadata *NewOperand = getAsMetadata(NewValue);
333 for (unsigned Idx = 0; Idx < getNumVariableLocationOps(); ++Idx)
334 MDs.push_back(Idx == OpIdx ? NewOperand
335 : getAsMetadata(getVariableLocationOp(Idx)));
336
337 setRawLocation(DIArgList::get(getVariableLocationOp(0)->getContext(), MDs));
338 }
339
addVariableLocationOps(ArrayRef<Value * > NewValues,DIExpression * NewExpr)340 void DbgVariableRecord::addVariableLocationOps(ArrayRef<Value *> NewValues,
341 DIExpression *NewExpr) {
342 assert(NewExpr->hasAllLocationOps(getNumVariableLocationOps() +
343 NewValues.size()) &&
344 "NewExpr for debug variable intrinsic does not reference every "
345 "location operand.");
346 assert(!is_contained(NewValues, nullptr) && "New values must be non-null");
347 setExpression(NewExpr);
348 SmallVector<ValueAsMetadata *, 4> MDs;
349 for (auto *VMD : location_ops())
350 MDs.push_back(getAsMetadata(VMD));
351 for (auto *VMD : NewValues)
352 MDs.push_back(getAsMetadata(VMD));
353 setRawLocation(DIArgList::get(getVariableLocationOp(0)->getContext(), MDs));
354 }
355
setKillLocation()356 void DbgVariableRecord::setKillLocation() {
357 // TODO: When/if we remove duplicate values from DIArgLists, we don't need
358 // this set anymore.
359 SmallPtrSet<Value *, 4> RemovedValues;
360 for (Value *OldValue : location_ops()) {
361 if (!RemovedValues.insert(OldValue).second)
362 continue;
363 Value *Poison = PoisonValue::get(OldValue->getType());
364 replaceVariableLocationOp(OldValue, Poison);
365 }
366 }
367
isKillLocation() const368 bool DbgVariableRecord::isKillLocation() const {
369 return (!hasArgList() && isa<MDNode>(getRawLocation())) ||
370 (getNumVariableLocationOps() == 0 && !getExpression()->isComplex()) ||
371 any_of(location_ops(), [](Value *V) { return isa<UndefValue>(V); });
372 }
373
getFragment() const374 std::optional<DbgVariableFragmentInfo> DbgVariableRecord::getFragment() const {
375 return getExpression()->getFragmentInfo();
376 }
377
getFragmentSizeInBits() const378 std::optional<uint64_t> DbgVariableRecord::getFragmentSizeInBits() const {
379 if (auto Fragment = getExpression()->getFragmentInfo())
380 return Fragment->SizeInBits;
381 return getVariable()->getSizeInBits();
382 }
383
clone() const384 DbgRecord *DbgRecord::clone() const {
385 switch (RecordKind) {
386 case ValueKind:
387 return cast<DbgVariableRecord>(this)->clone();
388 case LabelKind:
389 return cast<DbgLabelRecord>(this)->clone();
390 };
391 llvm_unreachable("unsupported DbgRecord kind");
392 }
393
clone() const394 DbgVariableRecord *DbgVariableRecord::clone() const {
395 return new DbgVariableRecord(*this);
396 }
397
clone() const398 DbgLabelRecord *DbgLabelRecord::clone() const {
399 return new DbgLabelRecord(getLabel(), getDebugLoc());
400 }
401
402 DbgVariableIntrinsic *
createDebugIntrinsic(Module * M,Instruction * InsertBefore) const403 DbgVariableRecord::createDebugIntrinsic(Module *M,
404 Instruction *InsertBefore) const {
405 [[maybe_unused]] DICompileUnit *Unit =
406 getDebugLoc()->getScope()->getSubprogram()->getUnit();
407 assert(M && Unit &&
408 "Cannot clone from BasicBlock that is not part of a Module or "
409 "DICompileUnit!");
410 LLVMContext &Context = getDebugLoc()->getContext();
411 Function *IntrinsicFn;
412
413 // Work out what sort of intrinsic we're going to produce.
414 switch (getType()) {
415 case DbgVariableRecord::LocationType::Declare:
416 IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_declare);
417 break;
418 case DbgVariableRecord::LocationType::Value:
419 IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_value);
420 break;
421 case DbgVariableRecord::LocationType::Assign:
422 IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_assign);
423 break;
424 case DbgVariableRecord::LocationType::End:
425 case DbgVariableRecord::LocationType::Any:
426 llvm_unreachable("Invalid LocationType");
427 }
428
429 // Create the intrinsic from this DbgVariableRecord's information, optionally
430 // insert into the target location.
431 DbgVariableIntrinsic *DVI;
432 assert(getRawLocation() &&
433 "DbgVariableRecord's RawLocation should be non-null.");
434 if (isDbgAssign()) {
435 Value *AssignArgs[] = {
436 MetadataAsValue::get(Context, getRawLocation()),
437 MetadataAsValue::get(Context, getVariable()),
438 MetadataAsValue::get(Context, getExpression()),
439 MetadataAsValue::get(Context, getAssignID()),
440 MetadataAsValue::get(Context, getRawAddress()),
441 MetadataAsValue::get(Context, getAddressExpression())};
442 DVI = cast<DbgVariableIntrinsic>(CallInst::Create(
443 IntrinsicFn->getFunctionType(), IntrinsicFn, AssignArgs));
444 } else {
445 Value *Args[] = {MetadataAsValue::get(Context, getRawLocation()),
446 MetadataAsValue::get(Context, getVariable()),
447 MetadataAsValue::get(Context, getExpression())};
448 DVI = cast<DbgVariableIntrinsic>(
449 CallInst::Create(IntrinsicFn->getFunctionType(), IntrinsicFn, Args));
450 }
451 DVI->setTailCall();
452 DVI->setDebugLoc(getDebugLoc());
453 if (InsertBefore)
454 DVI->insertBefore(InsertBefore);
455
456 return DVI;
457 }
458
459 DbgLabelInst *
createDebugIntrinsic(Module * M,Instruction * InsertBefore) const460 DbgLabelRecord::createDebugIntrinsic(Module *M,
461 Instruction *InsertBefore) const {
462 auto *LabelFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_label);
463 Value *Args[] = {
464 MetadataAsValue::get(getDebugLoc()->getContext(), getLabel())};
465 DbgLabelInst *DbgLabel = cast<DbgLabelInst>(
466 CallInst::Create(LabelFn->getFunctionType(), LabelFn, Args));
467 DbgLabel->setTailCall();
468 DbgLabel->setDebugLoc(getDebugLoc());
469 if (InsertBefore)
470 DbgLabel->insertBefore(InsertBefore);
471 return DbgLabel;
472 }
473
getAddress() const474 Value *DbgVariableRecord::getAddress() const {
475 auto *MD = getRawAddress();
476 if (auto *V = dyn_cast_or_null<ValueAsMetadata>(MD))
477 return V->getValue();
478
479 // When the value goes to null, it gets replaced by an empty MDNode.
480 assert(!MD ||
481 !cast<MDNode>(MD)->getNumOperands() && "Expected an empty MDNode");
482 return nullptr;
483 }
484
getAssignID() const485 DIAssignID *DbgVariableRecord::getAssignID() const {
486 return cast<DIAssignID>(DebugValues[2]);
487 }
488
setAssignId(DIAssignID * New)489 void DbgVariableRecord::setAssignId(DIAssignID *New) {
490 resetDebugValue(2, New);
491 }
492
setKillAddress()493 void DbgVariableRecord::setKillAddress() {
494 resetDebugValue(
495 1, ValueAsMetadata::get(UndefValue::get(getAddress()->getType())));
496 }
497
isKillAddress() const498 bool DbgVariableRecord::isKillAddress() const {
499 Value *Addr = getAddress();
500 return !Addr || isa<UndefValue>(Addr);
501 }
502
getInstruction() const503 const Instruction *DbgRecord::getInstruction() const {
504 return Marker->MarkedInstr;
505 }
506
getParent() const507 const BasicBlock *DbgRecord::getParent() const {
508 return Marker->MarkedInstr->getParent();
509 }
510
getParent()511 BasicBlock *DbgRecord::getParent() { return Marker->MarkedInstr->getParent(); }
512
getBlock()513 BasicBlock *DbgRecord::getBlock() { return Marker->getParent(); }
514
getBlock() const515 const BasicBlock *DbgRecord::getBlock() const { return Marker->getParent(); }
516
getFunction()517 Function *DbgRecord::getFunction() { return getBlock()->getParent(); }
518
getFunction() const519 const Function *DbgRecord::getFunction() const {
520 return getBlock()->getParent();
521 }
522
getModule()523 Module *DbgRecord::getModule() { return getFunction()->getParent(); }
524
getModule() const525 const Module *DbgRecord::getModule() const {
526 return getFunction()->getParent();
527 }
528
getContext()529 LLVMContext &DbgRecord::getContext() { return getBlock()->getContext(); }
530
getContext() const531 const LLVMContext &DbgRecord::getContext() const {
532 return getBlock()->getContext();
533 }
534
insertBefore(DbgRecord * InsertBefore)535 void DbgRecord::insertBefore(DbgRecord *InsertBefore) {
536 assert(!getMarker() &&
537 "Cannot insert a DbgRecord that is already has a DbgMarker!");
538 assert(InsertBefore->getMarker() &&
539 "Cannot insert a DbgRecord before a DbgRecord that does not have a "
540 "DbgMarker!");
541 InsertBefore->getMarker()->insertDbgRecord(this, InsertBefore);
542 }
insertAfter(DbgRecord * InsertAfter)543 void DbgRecord::insertAfter(DbgRecord *InsertAfter) {
544 assert(!getMarker() &&
545 "Cannot insert a DbgRecord that is already has a DbgMarker!");
546 assert(InsertAfter->getMarker() &&
547 "Cannot insert a DbgRecord after a DbgRecord that does not have a "
548 "DbgMarker!");
549 InsertAfter->getMarker()->insertDbgRecordAfter(this, InsertAfter);
550 }
moveBefore(DbgRecord * MoveBefore)551 void DbgRecord::moveBefore(DbgRecord *MoveBefore) {
552 assert(getMarker() &&
553 "Canot move a DbgRecord that does not currently have a DbgMarker!");
554 removeFromParent();
555 insertBefore(MoveBefore);
556 }
moveAfter(DbgRecord * MoveAfter)557 void DbgRecord::moveAfter(DbgRecord *MoveAfter) {
558 assert(getMarker() &&
559 "Canot move a DbgRecord that does not currently have a DbgMarker!");
560 removeFromParent();
561 insertAfter(MoveAfter);
562 }
563
564 ///////////////////////////////////////////////////////////////////////////////
565
566 // An empty, global, DbgMarker for the purpose of describing empty ranges of
567 // DbgRecords.
568 DbgMarker DbgMarker::EmptyDbgMarker;
569
dropDbgRecords()570 void DbgMarker::dropDbgRecords() {
571 while (!StoredDbgRecords.empty()) {
572 auto It = StoredDbgRecords.begin();
573 DbgRecord *DR = &*It;
574 StoredDbgRecords.erase(It);
575 DR->deleteRecord();
576 }
577 }
578
dropOneDbgRecord(DbgRecord * DR)579 void DbgMarker::dropOneDbgRecord(DbgRecord *DR) {
580 assert(DR->getMarker() == this);
581 StoredDbgRecords.erase(DR->getIterator());
582 DR->deleteRecord();
583 }
584
getParent() const585 const BasicBlock *DbgMarker::getParent() const {
586 return MarkedInstr->getParent();
587 }
588
getParent()589 BasicBlock *DbgMarker::getParent() { return MarkedInstr->getParent(); }
590
removeMarker()591 void DbgMarker::removeMarker() {
592 // Are there any DbgRecords in this DbgMarker? If not, nothing to preserve.
593 Instruction *Owner = MarkedInstr;
594 if (StoredDbgRecords.empty()) {
595 eraseFromParent();
596 Owner->DebugMarker = nullptr;
597 return;
598 }
599
600 // The attached DbgRecords need to be preserved; attach them to the next
601 // instruction. If there isn't a next instruction, put them on the
602 // "trailing" list.
603 DbgMarker *NextMarker = Owner->getParent()->getNextMarker(Owner);
604 if (NextMarker) {
605 NextMarker->absorbDebugValues(*this, true);
606 eraseFromParent();
607 } else {
608 // We can avoid a deallocation -- just store this marker onto the next
609 // instruction. Unless we're at the end of the block, in which case this
610 // marker becomes the trailing marker of a degenerate block.
611 BasicBlock::iterator NextIt = std::next(Owner->getIterator());
612 if (NextIt == getParent()->end()) {
613 getParent()->setTrailingDbgRecords(this);
614 MarkedInstr = nullptr;
615 } else {
616 NextIt->DebugMarker = this;
617 MarkedInstr = &*NextIt;
618 }
619 }
620 Owner->DebugMarker = nullptr;
621 }
622
removeFromParent()623 void DbgMarker::removeFromParent() {
624 MarkedInstr->DebugMarker = nullptr;
625 MarkedInstr = nullptr;
626 }
627
eraseFromParent()628 void DbgMarker::eraseFromParent() {
629 if (MarkedInstr)
630 removeFromParent();
631 dropDbgRecords();
632 delete this;
633 }
634
getDbgRecordRange()635 iterator_range<DbgRecord::self_iterator> DbgMarker::getDbgRecordRange() {
636 return make_range(StoredDbgRecords.begin(), StoredDbgRecords.end());
637 }
638 iterator_range<DbgRecord::const_self_iterator>
getDbgRecordRange() const639 DbgMarker::getDbgRecordRange() const {
640 return make_range(StoredDbgRecords.begin(), StoredDbgRecords.end());
641 }
642
removeFromParent()643 void DbgRecord::removeFromParent() {
644 getMarker()->StoredDbgRecords.erase(getIterator());
645 Marker = nullptr;
646 }
647
eraseFromParent()648 void DbgRecord::eraseFromParent() {
649 removeFromParent();
650 deleteRecord();
651 }
652
insertDbgRecord(DbgRecord * New,bool InsertAtHead)653 void DbgMarker::insertDbgRecord(DbgRecord *New, bool InsertAtHead) {
654 auto It = InsertAtHead ? StoredDbgRecords.begin() : StoredDbgRecords.end();
655 StoredDbgRecords.insert(It, *New);
656 New->setMarker(this);
657 }
insertDbgRecord(DbgRecord * New,DbgRecord * InsertBefore)658 void DbgMarker::insertDbgRecord(DbgRecord *New, DbgRecord *InsertBefore) {
659 assert(InsertBefore->getMarker() == this &&
660 "DbgRecord 'InsertBefore' must be contained in this DbgMarker!");
661 StoredDbgRecords.insert(InsertBefore->getIterator(), *New);
662 New->setMarker(this);
663 }
insertDbgRecordAfter(DbgRecord * New,DbgRecord * InsertAfter)664 void DbgMarker::insertDbgRecordAfter(DbgRecord *New, DbgRecord *InsertAfter) {
665 assert(InsertAfter->getMarker() == this &&
666 "DbgRecord 'InsertAfter' must be contained in this DbgMarker!");
667 StoredDbgRecords.insert(++(InsertAfter->getIterator()), *New);
668 New->setMarker(this);
669 }
670
absorbDebugValues(DbgMarker & Src,bool InsertAtHead)671 void DbgMarker::absorbDebugValues(DbgMarker &Src, bool InsertAtHead) {
672 auto It = InsertAtHead ? StoredDbgRecords.begin() : StoredDbgRecords.end();
673 for (DbgRecord &DVR : Src.StoredDbgRecords)
674 DVR.setMarker(this);
675
676 StoredDbgRecords.splice(It, Src.StoredDbgRecords);
677 }
678
absorbDebugValues(iterator_range<DbgRecord::self_iterator> Range,DbgMarker & Src,bool InsertAtHead)679 void DbgMarker::absorbDebugValues(
680 iterator_range<DbgRecord::self_iterator> Range, DbgMarker &Src,
681 bool InsertAtHead) {
682 for (DbgRecord &DR : Range)
683 DR.setMarker(this);
684
685 auto InsertPos =
686 (InsertAtHead) ? StoredDbgRecords.begin() : StoredDbgRecords.end();
687
688 StoredDbgRecords.splice(InsertPos, Src.StoredDbgRecords, Range.begin(),
689 Range.end());
690 }
691
cloneDebugInfoFrom(DbgMarker * From,std::optional<simple_ilist<DbgRecord>::iterator> from_here,bool InsertAtHead)692 iterator_range<simple_ilist<DbgRecord>::iterator> DbgMarker::cloneDebugInfoFrom(
693 DbgMarker *From, std::optional<simple_ilist<DbgRecord>::iterator> from_here,
694 bool InsertAtHead) {
695 DbgRecord *First = nullptr;
696 // Work out what range of DbgRecords to clone: normally all the contents of
697 // the "From" marker, optionally we can start from the from_here position down
698 // to end().
699 auto Range =
700 make_range(From->StoredDbgRecords.begin(), From->StoredDbgRecords.end());
701 if (from_here.has_value())
702 Range = make_range(*from_here, From->StoredDbgRecords.end());
703
704 // Clone each DbgVariableRecord and insert into StoreDbgVariableRecords;
705 // optionally place them at the start or the end of the list.
706 auto Pos = (InsertAtHead) ? StoredDbgRecords.begin() : StoredDbgRecords.end();
707 for (DbgRecord &DR : Range) {
708 DbgRecord *New = DR.clone();
709 New->setMarker(this);
710 StoredDbgRecords.insert(Pos, *New);
711 if (!First)
712 First = New;
713 }
714
715 if (!First)
716 return {StoredDbgRecords.end(), StoredDbgRecords.end()};
717
718 if (InsertAtHead)
719 // If InsertAtHead is set, we cloned a range onto the front of of the
720 // StoredDbgRecords collection, return that range.
721 return {StoredDbgRecords.begin(), Pos};
722 else
723 // We inserted a block at the end, return that range.
724 return {First->getIterator(), StoredDbgRecords.end()};
725 }
726
727 } // end namespace llvm
728