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