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::getDeclaration(M, Intrinsic::dbg_declare);
417 break;
419 IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_value);
420 break;
422 IntrinsicFn = Intrinsic::getDeclaration(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::getDeclaration(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<ValueAsMetadata>(MD))
477 return V->getValue();
478
479 // When the value goes to null, it gets replaced by an empty MDNode.
480 assert(!cast<MDNode>(MD)->getNumOperands() && "Expected an empty MDNode");
481 return nullptr;
482}
483
485 return cast<DIAssignID>(DebugValues[2]);
486}
487
489 resetDebugValue(2, New);
490}
491
495}
496
498 Value *Addr = getAddress();
499 return !Addr || isa<UndefValue>(Addr);
500}
501
503 return Marker->MarkedInstr;
504}
505
507 return Marker->MarkedInstr->getParent();
508}
509
511
513
514const BasicBlock *DbgRecord::getBlock() const { return Marker->getParent(); }
515
517
519 return getBlock()->getParent();
520}
521
523
525 return getFunction()->getParent();
526}
527
529
531 return getBlock()->getContext();
532}
533
535 assert(!getMarker() &&
536 "Cannot insert a DbgRecord that is already has a DbgMarker!");
537 assert(InsertBefore->getMarker() &&
538 "Cannot insert a DbgRecord before a DbgRecord that does not have a "
539 "DbgMarker!");
540 InsertBefore->getMarker()->insertDbgRecord(this, InsertBefore);
541}
543 assert(!getMarker() &&
544 "Cannot insert a DbgRecord that is already has a DbgMarker!");
545 assert(InsertAfter->getMarker() &&
546 "Cannot insert a DbgRecord after a DbgRecord that does not have a "
547 "DbgMarker!");
548 InsertAfter->getMarker()->insertDbgRecordAfter(this, InsertAfter);
549}
551 assert(getMarker() &&
552 "Canot move a DbgRecord that does not currently have a DbgMarker!");
554 insertBefore(MoveBefore);
555}
557 assert(getMarker() &&
558 "Canot move a DbgRecord that does not currently have a DbgMarker!");
560 insertAfter(MoveAfter);
561}
562
563///////////////////////////////////////////////////////////////////////////////
564
565// An empty, global, DbgMarker for the purpose of describing empty ranges of
566// DbgRecords.
568
570 while (!StoredDbgRecords.empty()) {
571 auto It = StoredDbgRecords.begin();
572 DbgRecord *DR = &*It;
573 StoredDbgRecords.erase(It);
574 DR->deleteRecord();
575 }
576}
577
579 assert(DR->getMarker() == this);
580 StoredDbgRecords.erase(DR->getIterator());
581 DR->deleteRecord();
582}
583
585 return MarkedInstr->getParent();
586}
587
589
591 // Are there any DbgRecords in this DbgMarker? If not, nothing to preserve.
592 Instruction *Owner = MarkedInstr;
593 if (StoredDbgRecords.empty()) {
595 Owner->DebugMarker = nullptr;
596 return;
597 }
598
599 // The attached DbgRecords need to be preserved; attach them to the next
600 // instruction. If there isn't a next instruction, put them on the
601 // "trailing" list.
602 DbgMarker *NextMarker = Owner->getParent()->getNextMarker(Owner);
603 if (NextMarker) {
604 NextMarker->absorbDebugValues(*this, true);
606 } else {
607 // We can avoid a deallocation -- just store this marker onto the next
608 // instruction. Unless we're at the end of the block, in which case this
609 // marker becomes the trailing marker of a degenerate block.
610 BasicBlock::iterator NextIt = std::next(Owner->getIterator());
611 if (NextIt == getParent()->end()) {
613 MarkedInstr = nullptr;
614 } else {
615 NextIt->DebugMarker = this;
616 MarkedInstr = &*NextIt;
617 }
618 }
619 Owner->DebugMarker = nullptr;
620}
621
623 MarkedInstr->DebugMarker = nullptr;
624 MarkedInstr = nullptr;
625}
626
628 if (MarkedInstr)
631 delete this;
632}
633
635 return make_range(StoredDbgRecords.begin(), StoredDbgRecords.end());
636}
639 return make_range(StoredDbgRecords.begin(), StoredDbgRecords.end());
640}
641
644 Marker = nullptr;
645}
646
649 deleteRecord();
650}
651
652void DbgMarker::insertDbgRecord(DbgRecord *New, bool InsertAtHead) {
653 auto It = InsertAtHead ? StoredDbgRecords.begin() : StoredDbgRecords.end();
654 StoredDbgRecords.insert(It, *New);
655 New->setMarker(this);
656}
658 assert(InsertBefore->getMarker() == this &&
659 "DbgRecord 'InsertBefore' must be contained in this DbgMarker!");
660 StoredDbgRecords.insert(InsertBefore->getIterator(), *New);
661 New->setMarker(this);
662}
664 assert(InsertAfter->getMarker() == this &&
665 "DbgRecord 'InsertAfter' must be contained in this DbgMarker!");
666 StoredDbgRecords.insert(++(InsertAfter->getIterator()), *New);
667 New->setMarker(this);
668}
669
670void DbgMarker::absorbDebugValues(DbgMarker &Src, bool InsertAtHead) {
671 auto It = InsertAtHead ? StoredDbgRecords.begin() : StoredDbgRecords.end();
672 for (DbgRecord &DVR : Src.StoredDbgRecords)
673 DVR.setMarker(this);
674
675 StoredDbgRecords.splice(It, Src.StoredDbgRecords);
676}
677
680 bool InsertAtHead) {
681 for (DbgRecord &DR : Range)
682 DR.setMarker(this);
683
684 auto InsertPos =
685 (InsertAtHead) ? StoredDbgRecords.begin() : StoredDbgRecords.end();
686
687 StoredDbgRecords.splice(InsertPos, Src.StoredDbgRecords, Range.begin(),
688 Range.end());
689}
690
692 DbgMarker *From, std::optional<simple_ilist<DbgRecord>::iterator> from_here,
693 bool InsertAtHead) {
694 DbgRecord *First = nullptr;
695 // Work out what range of DbgRecords to clone: normally all the contents of
696 // the "From" marker, optionally we can start from the from_here position down
697 // to end().
698 auto Range =
699 make_range(From->StoredDbgRecords.begin(), From->StoredDbgRecords.end());
700 if (from_here.has_value())
701 Range = make_range(*from_here, From->StoredDbgRecords.end());
702
703 // Clone each DbgVariableRecord and insert into StoreDbgVariableRecords;
704 // optionally place them at the start or the end of the list.
705 auto Pos = (InsertAtHead) ? StoredDbgRecords.begin() : StoredDbgRecords.end();
706 for (DbgRecord &DR : Range) {
707 DbgRecord *New = DR.clone();
708 New->setMarker(this);
709 StoredDbgRecords.insert(Pos, *New);
710 if (!First)
711 First = New;
712 }
713
714 if (!First)
715 return {StoredDbgRecords.end(), StoredDbgRecords.end()};
716
717 if (InsertAtHead)
718 // If InsertAtHead is set, we cloned a range onto the front of of the
719 // StoredDbgRecords collection, return that range.
720 return {StoredDbgRecords.begin(), Pos};
721 else
722 // We inserted a block at the end, return that range.
723 return {First->getIterator(), StoredDbgRecords.end()};
724}
725
726} // 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:40
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:165
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:214
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:381
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
Definition: Instruction.h:463
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:1852
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:367
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:502
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
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 * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
Definition: Function.cpp:1539
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:1742
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:1729
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:1886