LLVM 20.0.0git
DebugProgramInstruction.cpp
Go to the documentation of this file.
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
11#include "llvm/IR/DIBuilder.h"
13
14namespace llvm {
15
16template <typename T>
18 : Ref(const_cast<T *>(Param)) {}
19template <typename T>
21 : Ref(const_cast<MDNode *>(Param)) {}
22
23template <typename T> T *DbgRecordParamRef<T>::get() const {
24 return cast<T>(Ref);
25}
26
28template class DbgRecordParamRef<DILabel>;
30
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:
39 break;
40 case Intrinsic::dbg_declare:
42 break;
43 case Intrinsic::dbg_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:
54 "Trying to create a DbgVariableRecord with an invalid intrinsic type!");
55 }
56}
57
59 : DbgRecord(ValueKind, DVR.getDebugLoc()), DebugValueUser(DVR.DebugValues),
60 Type(DVR.getType()), Variable(DVR.getVariable()),
61 Expression(DVR.getExpression()),
62 AddressExpression(DVR.AddressExpression) {}
63
65 DIExpression *Expr, const DILocation *DI,
67 : DbgRecord(ValueKind, DI), DebugValueUser({Location, nullptr, nullptr}),
68 Type(Type), Variable(DV), Expression(Expr) {}
69
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
80 switch (RecordKind) {
81 case ValueKind:
82 delete cast<DbgVariableRecord>(this);
83 return;
85 delete cast<DbgLabelRecord>(this);
86 return;
87 }
88 llvm_unreachable("unsupported DbgRecord kind");
89}
90
91void 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
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
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
131 return getDebugLoc() == R.getDebugLoc() && isIdenticalToWhenDefined(R);
132}
133
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
145DbgLabelRecord::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}
151DbgLabelRecord::DbgLabelRecord(DILabel *Label, DebugLoc DL)
152 : DbgRecord(LabelKind, DL), Label(Label) {
153 assert(Label && "Unexpected nullptr");
154}
155
157 MDNode *DL) {
158 return new DbgLabelRecord(Label, DL);
159}
160
162 Metadata *Val, MDNode *Variable,
163 MDNode *Expression, MDNode *AssignID,
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
173 MDNode *AddressExpression, MDNode *DI) {
174 return new DbgVariableRecord(Type, Val, Variable, Expression, AssignID,
176}
177
180 DIExpression *Expr,
181 const DILocation *DI) {
182 return new DbgVariableRecord(ValueAsMetadata::get(Location), DV, Expr, DI,
184}
185
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
195 DILocalVariable *DV,
196 DIExpression *Expr,
197 const DILocation *DI) {
198 return new DbgVariableRecord(ValueAsMetadata::get(Address), DV, Expr, DI,
200}
201
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
213 DIAssignID *AssignID, Value *Address, DIExpression *AddressExpression,
214 const DILocation *DI) {
216 AssignID, ValueAsMetadata::get(Address),
218}
219
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,
229 LinkedInstr->getParent()->insertDbgRecordAfter(NewDVRAssign, LinkedInstr);
230 return NewDVRAssign;
231}
232
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
258 if (hasArgList())
259 return cast<DIArgList>(getRawLocation())->getArgs().size();
260 return 1;
261}
262
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
281 return isa<MetadataAsValue>(V) ? dyn_cast<ValueAsMetadata>(
282 cast<MetadataAsValue>(V)->getMetadata())
284}
285
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.
314 ValueAsMetadata *NewOperand = getAsMetadata(NewValue);
315 for (auto *VMD : Locations)
316 MDs.push_back(VMD == *OldIt ? NewOperand : getAsMetadata(VMD));
318}
319
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
332 ValueAsMetadata *NewOperand = getAsMetadata(NewValue);
333 for (unsigned Idx = 0; Idx < getNumVariableLocationOps(); ++Idx)
334 MDs.push_back(Idx == OpIdx ? NewOperand
336
338}
339
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");
349 for (auto *VMD : location_ops())
350 MDs.push_back(getAsMetadata(VMD));
351 for (auto *VMD : NewValues)
352 MDs.push_back(getAsMetadata(VMD));
354}
355
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());
365 }
366}
367
369 return (!hasArgList() && isa<MDNode>(getRawLocation())) ||
371 any_of(location_ops(), [](Value *V) { return isa<UndefValue>(V); });
372}
373
374std::optional<DbgVariableFragmentInfo> DbgVariableRecord::getFragment() const {
375 return getExpression()->getFragmentInfo();
376}
377
378std::optional<uint64_t> DbgVariableRecord::getFragmentSizeInBits() const {
379 if (auto Fragment = getExpression()->getFragmentInfo())
380 return Fragment->SizeInBits;
381 return getVariable()->getSizeInBits();
382}
383
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
395 return new DbgVariableRecord(*this);
396}
397
399 return new DbgLabelRecord(getLabel(), getDebugLoc());
400}
401
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()) {
416 IntrinsicFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_declare);
417 break;
419 IntrinsicFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_value);
420 break;
422 IntrinsicFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_assign);
423 break;
426 llvm_unreachable("Invalid LocationType");
427 }
428
429 // Create the intrinsic from this DbgVariableRecord's information, optionally
430 // insert into the target location.
433 "DbgVariableRecord's RawLocation should be non-null.");
434 if (isDbgAssign()) {
435 Value *AssignArgs[] = {
442 DVI = cast<DbgVariableIntrinsic>(CallInst::Create(
443 IntrinsicFn->getFunctionType(), IntrinsicFn, AssignArgs));
444 } else {
445 Value *Args[] = {MetadataAsValue::get(Context, getRawLocation()),
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
461 Instruction *InsertBefore) const {
462 auto *LabelFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_label);
463 Value *Args[] = {
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
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 || !cast<MDNode>(MD)->getNumOperands()) &&
481 "Expected an empty MDNode");
482 return nullptr;
483}
484
486 return cast<DIAssignID>(DebugValues[2]);
487}
488
490 resetDebugValue(2, New);
491}
492
496}
497
499 Value *Addr = getAddress();
500 return !Addr || isa<UndefValue>(Addr);
501}
502
504 return Marker->MarkedInstr;
505}
506
508 return Marker->MarkedInstr->getParent();
509}
510
512
514
515const BasicBlock *DbgRecord::getBlock() const { return Marker->getParent(); }
516
518
520 return getBlock()->getParent();
521}
522
524
526 return getFunction()->getParent();
527}
528
530
532 return getBlock()->getContext();
533}
534
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}
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}
552 assert(getMarker() &&
553 "Canot move a DbgRecord that does not currently have a DbgMarker!");
555 insertBefore(MoveBefore);
556}
558 assert(getMarker() &&
559 "Canot move a DbgRecord that does not currently have a DbgMarker!");
561 insertAfter(MoveAfter);
562}
563
564///////////////////////////////////////////////////////////////////////////////
565
566// An empty, global, DbgMarker for the purpose of describing empty ranges of
567// DbgRecords.
569
571 while (!StoredDbgRecords.empty()) {
572 auto It = StoredDbgRecords.begin();
573 DbgRecord *DR = &*It;
574 StoredDbgRecords.erase(It);
575 DR->deleteRecord();
576 }
577}
578
580 assert(DR->getMarker() == this);
581 StoredDbgRecords.erase(DR->getIterator());
582 DR->deleteRecord();
583}
584
586 return MarkedInstr->getParent();
587}
588
590
592 // Are there any DbgRecords in this DbgMarker? If not, nothing to preserve.
593 Instruction *Owner = MarkedInstr;
594 if (StoredDbgRecords.empty()) {
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);
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()) {
614 MarkedInstr = nullptr;
615 } else {
616 NextIt->DebugMarker = this;
617 MarkedInstr = &*NextIt;
618 }
619 }
620 Owner->DebugMarker = nullptr;
621}
622
624 MarkedInstr->DebugMarker = nullptr;
625 MarkedInstr = nullptr;
626}
627
629 if (MarkedInstr)
632 delete this;
633}
634
636 return make_range(StoredDbgRecords.begin(), StoredDbgRecords.end());
637}
640 return make_range(StoredDbgRecords.begin(), StoredDbgRecords.end());
641}
642
645 Marker = nullptr;
646}
647
650 deleteRecord();
651}
652
653void DbgMarker::insertDbgRecord(DbgRecord *New, bool InsertAtHead) {
654 auto It = InsertAtHead ? StoredDbgRecords.begin() : StoredDbgRecords.end();
655 StoredDbgRecords.insert(It, *New);
656 New->setMarker(this);
657}
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}
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
671void 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
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
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
@ Poison
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
BlockVerifier::State From
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
uint64_t Addr
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first found DebugLoc that has a DILocation, given a range of instructions.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:39
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:168
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
void setTrailingDbgRecords(DbgMarker *M)
Record that the collection of DbgRecords in M "trails" after the last instruction of this block.
const Function * getParent() const
Return the enclosing method, or null if none.
Definition: BasicBlock.h:219
InstListType::iterator iterator
Instruction iterators...
Definition: BasicBlock.h:177
LLVMContext & getContext() const
Get the context in which this basic block lives.
Definition: BasicBlock.cpp:168
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
void setTailCall(bool IsTc=true)
static DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
Assignment ID.
DWARF expression.
bool isComplex() const
Return whether the location is computed on the expression stack, meaning it cannot be a simple regist...
static std::optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
Debug location.
std::optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
This represents the llvm.dbg.assign instruction.
This is the common base class for debug info intrinsics.
This represents the llvm.dbg.label instruction.
Records a position in IR for a source label (DILabel).
DbgLabelRecord * clone() const
static DbgLabelRecord * createUnresolvedDbgLabelRecord(MDNode *Label, MDNode *DL)
For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved MDNodes.
DbgLabelInst * createDebugIntrinsic(Module *M, Instruction *InsertBefore) const
This class is used to track label information.
Definition: DwarfDebug.h:289
Per-instruction record of debug-info.
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
iterator_range< simple_ilist< DbgRecord >::iterator > cloneDebugInfoFrom(DbgMarker *From, std::optional< simple_ilist< DbgRecord >::iterator > FromHere, bool InsertAtHead=false)
Clone all DbgMarkers from From into this marker.
void insertDbgRecordAfter(DbgRecord *New, DbgRecord *InsertAfter)
Insert a DbgRecord after a DbgRecord contained within this marker.
void removeMarker()
Handle the removal of a marker: the position of debug-info has gone away, but the stored debug record...
void absorbDebugValues(DbgMarker &Src, bool InsertAtHead)
Transfer any DbgRecords from Src into this DbgMarker.
void dropDbgRecords()
Erase all DbgRecords in this DbgMarker.
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange()
Produce a range over all the DbgRecords in this Marker.
void dropOneDbgRecord(DbgRecord *DR)
Erase a single DbgRecord from this marker.
const BasicBlock * getParent() const
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
void insertDbgRecord(DbgRecord *New, bool InsertAtHead)
Insert a DbgRecord into this DbgMarker, at the end of the list.
static DbgMarker EmptyDbgMarker
We generally act like all llvm Instructions have a range of DbgRecords attached to them,...
A typed tracking MDNode reference that does not require a definition for its parameter type.
T * get() const
Get the underlying type.
Base class for non-instruction debug metadata records that have positions within IR.
void insertAfter(DbgRecord *InsertAfter)
void print(raw_ostream &O, bool IsForDebug=false) const
bool isEquivalentTo(const DbgRecord &R) const
Same as isIdenticalToWhenDefined but checks DebugLoc too.
DebugLoc getDebugLoc() const
DbgInfoIntrinsic * createDebugIntrinsic(Module *M, Instruction *InsertBefore) const
Convert this DbgRecord back into an appropriate llvm.dbg.
Kind RecordKind
Subclass discriminator.
void deleteRecord()
Methods that dispatch to subclass implementations.
void insertBefore(DbgRecord *InsertBefore)
void moveBefore(DbgRecord *MoveBefore)
const Instruction * getInstruction() const
void moveAfter(DbgRecord *MoveAfter)
bool isIdenticalToWhenDefined(const DbgRecord &R) const
DbgMarker * Marker
Marker that this DbgRecord is linked into.
void setMarker(DbgMarker *M)
DbgRecord * clone() const
const BasicBlock * getParent() const
This is the common base class for debug info intrinsics for variables.
Metadata * getRawLocation() const
Iterator for ValueAsMetadata that internally uses direct pointer iteration over either a ValueAsMetad...
Record of a variable value-assignment, aka a non instruction representation of the dbg....
DbgVariableRecord(const DbgVariableIntrinsic *DVI)
Create a new DbgVariableRecord representing the intrinsic DVI, for example the assignment represented...
bool isKillAddress() const
Check whether this kills the address component.
DbgRecordParamRef< DILocalVariable > Variable
std::optional< uint64_t > getFragmentSizeInBits() const
Get the size (in bits) of the variable, or fragment of the variable that is described.
DbgVariableRecord * clone() const
static DbgVariableRecord * createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable, MDNode *Expression, MDNode *AssignID, Metadata *Address, MDNode *AddressExpression, MDNode *DI)
Used to create DbgVariableRecords during parsing, where some metadata references may still be unresol...
void setRawLocation(Metadata *NewLocation)
Use of this should generally be avoided; instead, replaceVariableLocationOp and addVariableLocationOp...
static DbgVariableRecord * createDbgVariableRecord(Value *Location, DILocalVariable *DV, DIExpression *Expr, const DILocation *DI)
static DbgVariableRecord * createDVRDeclare(Value *Address, DILocalVariable *DV, DIExpression *Expr, const DILocation *DI)
void setExpression(DIExpression *NewExpr)
DIExpression * getExpression() const
Value * getVariableLocationOp(unsigned OpIdx) const
void setKillAddress()
Kill the address component.
DILocalVariable * getVariable() const
void addVariableLocationOps(ArrayRef< Value * > NewValues, DIExpression *NewExpr)
Adding a new location operand will always result in this intrinsic using an ArgList,...
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
void setAssignId(DIAssignID *New)
static DbgVariableRecord * createDVRAssign(Value *Val, DILocalVariable *Variable, DIExpression *Expression, DIAssignID *AssignID, Value *Address, DIExpression *AddressExpression, const DILocation *DI)
unsigned getNumVariableLocationOps() const
DbgVariableIntrinsic * createDebugIntrinsic(Module *M, Instruction *InsertBefore) const
Convert this DbgVariableRecord back into a dbg.value intrinsic.
void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
@ End
Marks the end of the concrete types.
@ Any
To indicate all LocationTypes in searches.
std::optional< DbgVariableFragmentInfo > getFragment() const
static DbgVariableRecord * createLinkedDVRAssign(Instruction *LinkedInstr, Value *Val, DILocalVariable *Variable, DIExpression *Expression, Value *Address, DIExpression *AddressExpression, const DILocation *DI)
DbgRecordParamRef< DIExpression > AddressExpression
DIExpression * getAddressExpression() const
iterator_range< location_op_iterator > location_ops() const
Get the locations corresponding to the variable referenced by the debug info intrinsic.
A debug info location.
Definition: DebugLoc.h:33
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
Definition: Metadata.h:212
std::array< Metadata *, 3 > DebugValues
Definition: Metadata.h:218
void resetDebugValue(size_t Idx, Metadata *DebugValue)
Definition: Metadata.h:273
Class representing an expression and its matching format.
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Definition: Function.h:216
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
DbgMarker * DebugMarker
Optional marker recording the position for debugging information that takes effect immediately before...
Definition: Instruction.h:84
void insertBefore(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified instruction.
Definition: Instruction.cpp:97
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
Definition: Instruction.h:386
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
Definition: Instruction.h:468
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
Metadata node.
Definition: Metadata.h:1069
LLVMContext & getContext() const
Definition: Metadata.h:1233
static MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition: Metadata.cpp:103
Root of the metadata hierarchy.
Definition: Metadata.h:62
Manage lifetime of a slot tracker for printing IR.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1878
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:384
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:519
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
Value wrapper in the Metadata hierarchy.
Definition: Metadata.h:450
static ValueAsMetadata * get(Value *V)
Definition: Metadata.cpp:501
LLVM Value Representation.
Definition: Value.h:74
const ParentTy * getParent() const
Definition: ilist_node.h:32
self_iterator getIterator()
Definition: ilist_node.h:132
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
typename ilist_select_iterator_type< OptionsT::has_iterator_bits, OptionsT, false, false >::type iterator
Definition: simple_ilist.h:97
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
Definition: Intrinsics.cpp:731
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1759
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1746
static ValueAsMetadata * getAsMetadata(Value *V)
@ Ref
The access may reference the value stored in memory.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1903