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