LLVM: lib/CodeGen/AsmPrinter/DIE.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
17#include "llvm/Config/llvm-config.h"
26using namespace llvm;
27
28#define DEBUG_TYPE "dwarfdebug"
29
30
31
32
33
34
35
37
38
40 ID.AddInteger(unsigned(Form));
41 if (Form == dwarf::DW_FORM_implicit_const)
43}
44
45
46
47
48
49
50
52 ID.AddInteger(unsigned(Tag));
53 ID.AddInteger(unsigned(Children));
54
55
58}
59
60
61
63
65
66
68
69
71
74
75
76#ifndef NDEBUG
77
78
83 << "\n");
85 }
86#endif
89
90
91 if (AttrData.getForm() == dwarf::DW_FORM_implicit_const)
93 }
94
95
98}
99
102 O << "Abbreviation @"
103 << format("0x%lx", (long)(intptr_t)this)
104 << " "
106 << " "
108 << '\n';
109
113
114 if (D.getForm() == dwarf::DW_FORM_implicit_const)
115 O << " " << D.getValue();
116
117 O << '\n';
118 }
119}
120
121#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
124}
125#endif
126
127
128
129
130
132 for (DIEAbbrev *Abbrev : Abbreviations)
133 Abbrev->~DIEAbbrev();
134}
135
137
141
142 void *InsertPos;
144 AbbreviationsSet.FindNodeOrInsertPos(ID, InsertPos)) {
146 return *Existing;
147 }
148
149
151 Abbreviations.push_back(New);
152 New->setNumber(Abbreviations.size());
154
155
156 AbbreviationsSet.InsertNode(New, InsertPos);
157 return *New;
158}
159
161 if (!Abbreviations.empty()) {
162
165 }
166}
167
168
169
170
171
173
177 if (V.getForm() == dwarf::DW_FORM_implicit_const)
179 V.getDIEInteger().getValue());
180 else
181 Abbrev.AddAttribute(V.getAttribute(), V.getForm());
182 return Abbrev;
183}
184
187 assert(Unit && "DIE must be owned by a DIEUnit to get its absolute offset");
188 return Unit->getDebugSectionOffset() + getOffset();
189}
190
192 const DIE *p = this;
193 while (p) {
194 if (p->getTag() == dwarf::DW_TAG_compile_unit ||
195 p->getTag() == dwarf::DW_TAG_skeleton_unit ||
196 p->getTag() == dwarf::DW_TAG_type_unit)
197 return p;
198 p = p->getParent();
199 }
200 return nullptr;
201}
202
205 if (UnitDie)
206 return dyn_cast_if_present<DIEUnit *>(UnitDie->Owner);
207 return nullptr;
208}
209
211
212
213 for (const auto &V : values())
214 if (V.getAttribute() == Attribute)
215 return V;
217}
218
222 O << Type << ": Size: " << Size << "\n";
223
224 unsigned I = 0;
225 const std::string Indent(IndentCount, ' ');
226 for (const auto &V : Values.values()) {
227 O << Indent;
228 O << "Blk[" << I++ << "]";
230 V.print(O);
231 O << "\n";
232 }
233}
234
237 const std::string Indent(IndentCount, ' ');
238 O << Indent << "Die: " << format("0x%lx", (long)(intptr_t) this)
239 << ", Offset: " << Offset << ", Size: " << Size << "\n";
240
243
244 IndentCount += 2;
245 for (const auto &V : values()) {
246 O << Indent;
249 V.print(O);
250 O << "\n";
251 }
252 IndentCount -= 2;
253
254 for (const auto &Child : children())
255 Child.print(O, IndentCount + 4);
256
257 O << "\n";
258}
259
260#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
263}
264#endif
265
268 unsigned CUOffset) {
269
270
272
273
275
276
278
279
280 for (const auto &V : values())
281 CUOffset += V.sizeOf(FormParams);
282
283
285 (void)Abbrev;
287
288 for (auto &Child : children())
289 CUOffset =
290 Child.computeOffsetsAndAbbrevs(FormParams, AbbrevSet, CUOffset);
291
292
293 CUOffset += sizeof(int8_t);
294 }
295
296
297
298
300 return CUOffset;
301}
302
303
304
305
307 Die.Owner = this;
308 assert((UnitTag == dwarf::DW_TAG_compile_unit ||
309 UnitTag == dwarf::DW_TAG_skeleton_unit ||
310 UnitTag == dwarf::DW_TAG_type_unit ||
311 UnitTag == dwarf::DW_TAG_partial_unit) &&
312 "expected a unit TAG");
313}
314
316 switch (Ty) {
319#define HANDLE_DIEVALUE(T) \
320 case is##T: \
321 getDIE##T().emitValue(AP, Form); \
322 break;
323#include "llvm/CodeGen/DIEValue.def"
324 }
325}
326
328 switch (Ty) {
331#define HANDLE_DIEVALUE(T) \
332 case is##T: \
333 return getDIE##T().sizeOf(FormParams, Form);
334#include "llvm/CodeGen/DIEValue.def"
335 }
337}
338
341 switch (Ty) {
344#define HANDLE_DIEVALUE(T) \
345 case is##T: \
346 getDIE##T().print(O); \
347 break;
348#include "llvm/CodeGen/DIEValue.def"
349 }
350}
351
352#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
355}
356#endif
357
358
359
360
361
362
363
365 switch (Form) {
366 case dwarf::DW_FORM_implicit_const:
367 case dwarf::DW_FORM_flag_present:
368
369
370 Asm->OutStreamer->addBlankLine();
371 return;
372 case dwarf::DW_FORM_flag:
373 case dwarf::DW_FORM_ref1:
374 case dwarf::DW_FORM_data1:
375 case dwarf::DW_FORM_strx1:
376 case dwarf::DW_FORM_addrx1:
377 case dwarf::DW_FORM_ref2:
378 case dwarf::DW_FORM_data2:
379 case dwarf::DW_FORM_strx2:
380 case dwarf::DW_FORM_addrx2:
381 case dwarf::DW_FORM_strx3:
382 case dwarf::DW_FORM_addrx3:
383 case dwarf::DW_FORM_strp:
384 case dwarf::DW_FORM_ref4:
385 case dwarf::DW_FORM_data4:
386 case dwarf::DW_FORM_ref_sup4:
387 case dwarf::DW_FORM_strx4:
388 case dwarf::DW_FORM_addrx4:
389 case dwarf::DW_FORM_ref8:
390 case dwarf::DW_FORM_ref_sig8:
391 case dwarf::DW_FORM_data8:
392 case dwarf::DW_FORM_ref_sup8:
393 case dwarf::DW_FORM_GNU_ref_alt:
394 case dwarf::DW_FORM_GNU_strp_alt:
395 case dwarf::DW_FORM_line_strp:
396 case dwarf::DW_FORM_sec_offset:
397 case dwarf::DW_FORM_strp_sup:
398 case dwarf::DW_FORM_addr:
399 case dwarf::DW_FORM_ref_addr:
400 Asm->OutStreamer->emitIntValue(Integer,
401 sizeOf(Asm->getDwarfFormParams(), Form));
402 return;
403 case dwarf::DW_FORM_GNU_str_index:
404 case dwarf::DW_FORM_GNU_addr_index:
405 case dwarf::DW_FORM_ref_udata:
406 case dwarf::DW_FORM_strx:
407 case dwarf::DW_FORM_addrx:
408 case dwarf::DW_FORM_rnglistx:
409 case dwarf::DW_FORM_udata:
410 Asm->emitULEB128(Integer);
411 return;
412 case dwarf::DW_FORM_sdata:
413 Asm->emitSLEB128(Integer);
414 return;
415 default: llvm_unreachable("DIE Value form not supported yet");
416 }
417}
418
419
420
423 if (std::optional<uint8_t> FixedSize =
425 return *FixedSize;
426
427 switch (Form) {
428 case dwarf::DW_FORM_GNU_str_index:
429 case dwarf::DW_FORM_GNU_addr_index:
430 case dwarf::DW_FORM_ref_udata:
431 case dwarf::DW_FORM_strx:
432 case dwarf::DW_FORM_addrx:
433 case dwarf::DW_FORM_rnglistx:
434 case dwarf::DW_FORM_udata:
436 case dwarf::DW_FORM_sdata:
438 default: llvm_unreachable("DIE Value form not supported yet");
439 }
440}
441
444 O << "Int: " << (int64_t)Integer << " 0x";
445 O.write_hex(Integer);
446}
447
448
449
450
451
452
453
456}
457
458
459
462 switch (Form) {
463 case dwarf::DW_FORM_data4:
464 return 4;
465 case dwarf::DW_FORM_data8:
466 return 8;
467 case dwarf::DW_FORM_sec_offset:
469 default:
471 }
472}
473
476
477
478
479
480
481
482
484 bool IsSectionRelative = Form != dwarf::DW_FORM_addr;
486 IsSectionRelative);
487}
488
489
490
493 switch (Form) {
494 case dwarf::DW_FORM_data4:
495 return 4;
496 case dwarf::DW_FORM_data8:
497 return 8;
498 case dwarf::DW_FORM_sec_offset:
499 case dwarf::DW_FORM_strp:
501 case dwarf::DW_FORM_addr:
503 default:
505 }
506}
507
510
511
512
513
514
516 uint64_t Offset = CU->ExprRefedBaseTypes[Index].Die->getOffset();
517 assert(Offset < (1ULL << (ULEB128PadSize * 7)) && "Offset wont fit");
519}
520
522 return ULEB128PadSize;
523}
524
527
528
529
530
531
532
533
537}
538
539
540
543 switch (Form) {
544 case dwarf::DW_FORM_data4:
545 return 4;
546 case dwarf::DW_FORM_data8:
547 return 8;
548 case dwarf::DW_FORM_sec_offset:
550 default:
552 }
553}
554
557 O << "Del: " << LabelHi->getName() << "-" << LabelLo->getName();
558}
559
560
561
562
563
564
565
567
568 switch (Form) {
569 case dwarf::DW_FORM_GNU_str_index:
570 case dwarf::DW_FORM_strx:
571 case dwarf::DW_FORM_strx1:
572 case dwarf::DW_FORM_strx2:
573 case dwarf::DW_FORM_strx3:
574 case dwarf::DW_FORM_strx4:
576 return;
577 case dwarf::DW_FORM_strp:
580 else
582 return;
583 default:
585 }
586}
587
588
589
592
593 switch (Form) {
594 case dwarf::DW_FORM_GNU_str_index:
595 case dwarf::DW_FORM_strx:
596 case dwarf::DW_FORM_strx1:
597 case dwarf::DW_FORM_strx2:
598 case dwarf::DW_FORM_strx3:
599 case dwarf::DW_FORM_strx4:
601 case dwarf::DW_FORM_strp:
605 default:
607 }
608}
609
612 O << "String: " << S.getString();
613}
614
615
616
617
619 if (Form == dwarf::DW_FORM_string) {
622 return;
623 }
625}
626
628
629 return S.size() + 1;
630}
631
634 O << "InlineString: " << S;
635}
636
637
638
639
640
641
642
644
645 switch (Form) {
646 case dwarf::DW_FORM_ref1:
647 case dwarf::DW_FORM_ref2:
648 case dwarf::DW_FORM_ref4:
649 case dwarf::DW_FORM_ref8:
652 return;
653
654 case dwarf::DW_FORM_ref_udata:
656 return;
657
658 case dwarf::DW_FORM_ref_addr: {
659
661 if (const MCSymbol *SectionSym =
665 return;
666 }
667
669 return;
670 }
671 default:
673 }
674}
675
678 switch (Form) {
679 case dwarf::DW_FORM_ref1:
680 return 1;
681 case dwarf::DW_FORM_ref2:
682 return 2;
683 case dwarf::DW_FORM_ref4:
684 return 4;
685 case dwarf::DW_FORM_ref8:
686 return 8;
687 case dwarf::DW_FORM_ref_udata:
689 case dwarf::DW_FORM_ref_addr:
691
692 default:
694 }
695}
696
699 O << format("Die: 0x%lx", (long)(intptr_t)&Entry);
700}
701
702
703
704
705
707 if (!Size) {
708 for (const auto &V : values())
709 Size += V.sizeOf(FormParams);
710 }
711
712 return Size;
713}
714
715
716
718 switch (Form) {
720 case dwarf::DW_FORM_block1: Asm->emitInt8(Size); break;
721 case dwarf::DW_FORM_block2: Asm->emitInt16(Size); break;
722 case dwarf::DW_FORM_block4: Asm->emitInt32(Size); break;
723 case dwarf::DW_FORM_block:
724 case dwarf::DW_FORM_exprloc:
725 Asm->emitULEB128(Size);
726 break;
727 }
728
729 for (const auto &V : values())
730 V.emitValue(Asm);
731}
732
733
734
736 switch (Form) {
737 case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
738 case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
739 case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
740 case dwarf::DW_FORM_block:
741 case dwarf::DW_FORM_exprloc:
744 }
745}
746
749 printValues(O, *this, "ExprLoc", Size, 5);
750}
751
752
753
754
755
757 if (!Size) {
758 for (const auto &V : values())
759 Size += V.sizeOf(FormParams);
760 }
761
762 return Size;
763}
764
765
766
768 switch (Form) {
770 case dwarf::DW_FORM_block1: Asm->emitInt8(Size); break;
771 case dwarf::DW_FORM_block2: Asm->emitInt16(Size); break;
772 case dwarf::DW_FORM_block4: Asm->emitInt32(Size); break;
773 case dwarf::DW_FORM_exprloc:
774 case dwarf::DW_FORM_block:
775 Asm->emitULEB128(Size);
776 break;
777 case dwarf::DW_FORM_string: break;
778 case dwarf::DW_FORM_data16: break;
779 }
780
781 for (const auto &V : values())
782 V.emitValue(Asm);
783}
784
785
786
788 switch (Form) {
789 case dwarf::DW_FORM_block1: return Size + sizeof(int8_t);
790 case dwarf::DW_FORM_block2: return Size + sizeof(int16_t);
791 case dwarf::DW_FORM_block4: return Size + sizeof(int32_t);
792 case dwarf::DW_FORM_exprloc:
793 case dwarf::DW_FORM_block: return Size + getULEB128Size(Size);
794 case dwarf::DW_FORM_data16: return 16;
796 }
797}
798
802}
803
804
805
806
807
810 switch (Form) {
811 case dwarf::DW_FORM_loclistx:
813 case dwarf::DW_FORM_data4:
815 "DW_FORM_data4 is not suitable to emit a pointer to a location list "
816 "in the 64-bit DWARF format");
817 return 4;
818 case dwarf::DW_FORM_data8:
820 "DW_FORM_data8 is not suitable to emit a pointer to a location list "
821 "in the 32-bit DWARF format");
822 return 8;
823 case dwarf::DW_FORM_sec_offset:
825 default:
827 }
828}
829
830
831
833 if (Form == dwarf::DW_FORM_loclistx) {
835 return;
836 }
840}
841
844
845
846
847
848
851 return Addr.sizeOf(FormParams, dwarf::DW_FORM_addrx) +
852 Offset.sizeOf(FormParams, dwarf::DW_FORM_data4);
853}
854
855
856
858 Addr.emitValue(AP, dwarf::DW_FORM_addrx);
859 Offset.emitValue(AP, dwarf::DW_FORM_data4);
860}
861
864 O << "AddrOffset: ";
866 O << " + ";
868}
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static LLVM_DUMP_METHOD void printValues(raw_ostream &O, const DIEValueList &Values, StringRef Type, unsigned Size, unsigned IndentCount)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This class is intended to be used as a driving class for all asm writers.
void emitULEB128(uint64_t Value, const char *Desc=nullptr, unsigned PadTo=0) const
Emit the specified unsigned leb128 value.
void emitDwarfSymbolReference(const MCSymbol *Label, bool ForceOffset=false) const
Emit a reference to a symbol for use in dwarf.
virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const
Emit the directive and value for debug thread local expression.
DwarfDebug * getDwarfDebug()
void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label+Offset" where the size in bytes of the directive is specified by Siz...
void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) const
Emit something like ".long Hi-Lo" where the size in bytes of the directive is specified by Size and H...
void emitInt8(int Value) const
Emit a byte directive and value.
void emitDwarfAbbrevs(const T &Abbrevs) const
Emit Dwarf abbreviation table.
void emitSLEB128(int64_t Value, const char *Desc=nullptr) const
Emit the specified signed leb128 value.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
void emitLabelReference(const MCSymbol *Label, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label" where the size in bytes of the directive is specified by Size and L...
uint16_t getDwarfVersion() const
dwarf::FormParams getDwarfFormParams() const
Returns information about the byte size of DW_FORM values.
bool doesDwarfUseRelocationsAcrossSections() const
Dwarf abbreviation data, describes one attribute of a Dwarf abbreviation.
void Profile(FoldingSetNodeID &ID) const
Used to gather unique data for the abbreviation folding set.
Helps unique DIEAbbrev objects and assigns abbreviation numbers.
void Emit(const AsmPrinter *AP, MCSection *Section) const
Print all abbreviations using the specified asm printer.
DIEAbbrev & uniqueAbbreviation(DIE &Die)
Generate the abbreviation declaration for a DIE and return a pointer to the generated abbreviation.
Dwarf abbreviation, describes the organization of a debug information object.
void print(raw_ostream &O) const
void AddImplicitConstAttribute(dwarf::Attribute Attribute, int64_t Value)
Adds attribute with DW_FORM_implicit_const value.
void Emit(const AsmPrinter *AP) const
Print the abbreviation using the specified asm printer.
void AddAttribute(dwarf::Attribute Attribute, dwarf::Form Form)
Adds another set of attribute information to the abbreviation.
void Profile(FoldingSetNodeID &ID) const
Used to gather unique data for the abbreviation folding set.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit label value.
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit base type reference.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &, dwarf::Form) const
sizeOf - Determine size of the base type reference in bytes.
unsigned sizeOf(const dwarf::FormParams &, dwarf::Form Form) const
sizeOf - Determine size of block data in bytes.
void print(raw_ostream &O) const
void emitValue(const AsmPrinter *Asm, dwarf::Form Form) const
EmitValue - Emit block data.
unsigned computeSize(const dwarf::FormParams &FormParams) const
Calculate the size of the location expression.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
SizeOf - Determine size of delta value in bytes.
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit delta value.
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit debug information entry offset.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
void print(raw_ostream &O) const
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit expression value.
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
SizeOf - Determine size of expression value in bytes.
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &, dwarf::Form) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
sizeOf - Determine size of integer value in bytes.
void print(raw_ostream &O) const
void emitValue(const AsmPrinter *Asm, dwarf::Form Form) const
EmitValue - Emit integer of appropriate size.
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit label value.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
sizeOf - Determine size of label value in bytes.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit label value.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &, dwarf::Form Form) const
sizeOf - Determine size of location data in bytes.
void emitValue(const AsmPrinter *Asm, dwarf::Form Form) const
EmitValue - Emit location data.
unsigned computeSize(const dwarf::FormParams &FormParams) const
Calculate the size of the location expression.
void emitValue(const AsmPrinter *AP, dwarf::Form Form) const
EmitValue - Emit string value.
void print(raw_ostream &O) const
unsigned sizeOf(const dwarf::FormParams &FormParams, dwarf::Form Form) const
sizeOf - Determine size of delta value in bytes.
Represents a compile or type unit.
virtual const MCSymbol * getCrossSectionRelativeBaseAddress() const
DIEUnit(dwarf::Tag UnitTag)
void print(raw_ostream &O) const
void emitValue(const AsmPrinter *AP) const
Emit value via the Dwarf writer.
unsigned sizeOf(const dwarf::FormParams &FormParams) const
Return the size of a value in bytes.
A structured debug information entry.
DIEValue findAttribute(dwarf::Attribute Attribute) const
Find a value in the DIE with the attribute given.
void print(raw_ostream &O, unsigned IndentCount=0) const
unsigned getAbbrevNumber() const
DIEAbbrev generateAbbrev() const
Generate the abbreviation for this DIE.
unsigned computeOffsetsAndAbbrevs(const dwarf::FormParams &FormParams, DIEAbbrevSet &AbbrevSet, unsigned CUOffset)
Compute the offset of this DIE and all its children.
DIEUnit * getUnit() const
Climb up the parent chain to get the compile unit or type unit that this DIE belongs to.
const DIE * getUnitDie() const
Climb up the parent chain to get the compile unit or type unit DIE that this DIE belongs to.
void setAbbrevNumber(unsigned I)
Set the abbreviation number for this DIE.
unsigned getOffset() const
Get the compile/type unit relative offset of this DIE.
void setOffset(unsigned O)
uint64_t getDebugSectionOffset() const
Get the absolute offset within the .debug_info or .debug_types section for this DIE.
dwarf::Tag getTag() const
const List & getList(size_t LI) const
Collects and handles dwarf debug information.
const DebugLocStream & getDebugLocs() const
Returns the entries for the .debug_loc section.
bool useSplitDwarf() const
Returns whether or not to change the current debug info for the split dwarf proposal support.
unsigned getIndex() const
StringRef getString() const
uint64_t getOffset() const
MCSymbol * getSymbol() const
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
StringRef getName() const
getName - Get the symbol name.
StringRef - Represent a constant reference to a string, i.e.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
StringRef AttributeString(unsigned Attribute)
StringRef FormEncodingString(unsigned Encoding)
StringRef ChildrenString(unsigned Children)
StringRef TagString(unsigned Tag)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
bool isValidFormForVersion(Form F, unsigned Version, bool ExtensionsOk=true)
Tells whether the specified form is defined in the specified version, or is an extension if extension...
std::optional< uint8_t > getFixedFormByteSize(dwarf::Form Form, FormParams Params)
Get the fixed byte size for a given form.
This is an optimization pass for GlobalISel generic memory operations.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
unsigned getULEB128Size(uint64_t Value)
Utility function to get the size of the ULEB128-encoded value.
unsigned getSLEB128Size(int64_t Value)
Utility function to get the size of the SLEB128-encoded value.
A helper struct providing information about the byte size of DW_FORM values that vary in size dependi...
bool DwarfUsesRelocationsAcrossSections
True if DWARF v2 output generally uses relocations for references to other .debug_* sections.
uint8_t getDwarfOffsetByteSize() const
The size of a reference is determined by the DWARF 32/64-bit format.
uint8_t getRefAddrByteSize() const
The definition of the size of form DW_FORM_ref_addr depends on the version.