Skip to content

Commit a78d13d

Browse files
authored
[LLVM][DWARF] Change .debug_names abbrev to be an index (#81200)
Based on the discussion in #80229 changed implementation to align with how .debug_abbrev is handled. So that .debug_names abbrev tag is a monotonically increasing index. This allows for tools like LLDB to access it in constant time using array like data structure. clang-19 debug build before change
 [41] .debug_names PROGBITS 0000000000000000 8f9e0350 137fdbe0 00 0 0 4 after change [41] .debug_names PROGBITS 0000000000000000 8f9e0350 125bfdec 00 0 0 4 Reduction ~19.1MB
1 parent 5992b32 commit a78d13d

File tree

5 files changed

+120
-119
lines changed

5 files changed

+120
-119
lines changed

llvm/include/llvm/CodeGen/AccelTable.h

+40-9
Original file line numberDiff line numberDiff line change
@@ -275,11 +275,6 @@ struct DenseMapInfo<OffsetAndUnitID> : DenseMapInfo<OffsetAndUnitID::Base> {};
275275
/// emitDWARF5AccelTable function.
276276
class DWARF5AccelTableData : public AccelTableData {
277277
public:
278-
struct AttributeEncoding {
279-
dwarf::Index Index;
280-
dwarf::Form Form;
281-
};
282-
283278
static uint32_t hash(StringRef Name) { return caseFoldingDjbHash(Name); }
284279

285280
DWARF5AccelTableData(const DIE &Die, const uint32_t UnitID,
@@ -289,7 +284,7 @@ class DWARF5AccelTableData : public AccelTableData {
289284
const unsigned DieTag, const unsigned UnitID,
290285
const bool IsTU = false)
291286
: OffsetVal(DieOffset), ParentOffset(DefiningParentOffset),
292-
DieTag(DieTag), UnitID(UnitID), IsTU(IsTU) {}
287+
DieTag(DieTag), AbbrevNumber(0), IsTU(IsTU), UnitID(UnitID) {}
293288

294289
#ifndef NDEBUG
295290
void print(raw_ostream &OS) const override;
@@ -330,6 +325,12 @@ class DWARF5AccelTableData : public AccelTableData {
330325
return OffsetAndUnitID(*ParentOffset, getUnitID());
331326
}
332327

328+
/// Sets AbbrevIndex for an Entry.
329+
void setAbbrevNumber(uint16_t AbbrevNum) { AbbrevNumber = AbbrevNum; }
330+
331+
/// Returns AbbrevIndex for an Entry.
332+
uint16_t getAbbrevNumber() const { return AbbrevNumber; }
333+
333334
/// If `Die` has a non-null parent and the parent is not a declaration,
334335
/// return its offset.
335336
static std::optional<uint64_t> getDefiningParentDieOffset(const DIE &Die);
@@ -338,12 +339,42 @@ class DWARF5AccelTableData : public AccelTableData {
338339
std::variant<const DIE *, uint64_t> OffsetVal;
339340
std::optional<uint64_t> ParentOffset;
340341
uint32_t DieTag : 16;
341-
uint32_t UnitID : 15;
342+
uint32_t AbbrevNumber : 15;
342343
uint32_t IsTU : 1;
343-
344+
uint32_t UnitID;
344345
uint64_t order() const override { return getDieOffset(); }
345346
};
346347

348+
class DebugNamesAbbrev : public FoldingSetNode {
349+
public:
350+
uint32_t DieTag;
351+
uint32_t Number;
352+
struct AttributeEncoding {
353+
dwarf::Index Index;
354+
dwarf::Form Form;
355+
};
356+
DebugNamesAbbrev(uint32_t DieTag) : DieTag(DieTag) {}
357+
/// Add attribute encoding to an abbreviation.
358+
void addAttribute(const DebugNamesAbbrev::AttributeEncoding &Attr) {
359+
AttrVect.push_back(Attr);
360+
}
361+
/// Set abbreviation tag index.
362+
void setNumber(uint32_t AbbrevNumber) { Number = AbbrevNumber; }
363+
/// Get abbreviation tag index.
364+
uint32_t getNumber() const { return Number; }
365+
/// Get DIE Tag.
366+
uint32_t getDieTag() const { return DieTag; }
367+
/// Used to gather unique data for the abbreviation folding set.
368+
void Profile(FoldingSetNodeID &ID) const;
369+
/// Returns attributes for an abbreviation.
370+
const SmallVector<AttributeEncoding, 1> &getAttributes() const {
371+
return AttrVect;
372+
}
373+
374+
private:
375+
SmallVector<AttributeEncoding, 1> AttrVect;
376+
};
377+
347378
struct TypeUnitMetaInfo {
348379
// Symbol for start of the TU section or signature if this is SplitDwarf.
349380
std::variant<MCSymbol *, uint64_t> LabelOrSignature;
@@ -358,7 +389,7 @@ class DWARF5AccelTable : public AccelTable<DWARF5AccelTableData> {
358389
public:
359390
struct UnitIndexAndEncoding {
360391
unsigned Index;
361-
DWARF5AccelTableData::AttributeEncoding Encoding;
392+
DebugNamesAbbrev::AttributeEncoding Encoding;
362393
};
363394
/// Returns type units that were constructed.
364395
const TUVectorTy &getTypeUnitsSymbols() { return TUSymbolsOrHashes; }

llvm/lib/CodeGen/AsmPrinter/AccelTable.cpp

+50-80
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,13 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
208208
};
209209

210210
Header Header;
211-
DenseMap<uint32_t, SmallVector<DWARF5AccelTableData::AttributeEncoding, 3>>
212-
Abbreviations;
211+
/// FoldingSet that uniques the abbreviations.
212+
FoldingSet<DebugNamesAbbrev> AbbreviationsSet;
213+
/// Vector containing DebugNames abbreviations for iteration in order.
214+
SmallVector<DebugNamesAbbrev *, 5> AbbreviationsVector;
215+
/// The bump allocator to use when creating DIEAbbrev objects in the uniqued
216+
/// storage container.
217+
BumpPtrAllocator Alloc;
213218
ArrayRef<std::variant<MCSymbol *, uint64_t>> CompUnits;
214219
ArrayRef<std::variant<MCSymbol *, uint64_t>> TypeUnits;
215220
llvm::function_ref<std::optional<DWARF5AccelTable::UnitIndexAndEncoding>(
@@ -234,7 +239,7 @@ class Dwarf5AccelTableWriter : public AccelTableWriter {
234239
void emitEntry(
235240
const DWARF5AccelTableData &Entry,
236241
const DenseMap<OffsetAndUnitID, MCSymbol *> &DIEOffsetToAccelEntryLabel,
237-
DenseSet<MCSymbol *> &EmittedAccelEntrySymbols) const;
242+
DenseSet<MCSymbol *> &EmittedAccelEntrySymbols);
238243
void emitData();
239244

240245
public:
@@ -370,7 +375,7 @@ void AppleAccelTableWriter::emit() const {
370375
DWARF5AccelTableData::DWARF5AccelTableData(const DIE &Die,
371376
const uint32_t UnitID,
372377
const bool IsTU)
373-
: OffsetVal(&Die), DieTag(Die.getTag()), UnitID(UnitID), IsTU(IsTU) {}
378+
: OffsetVal(&Die), DieTag(Die.getTag()), IsTU(IsTU), UnitID(UnitID) {}
374379

375380
void Dwarf5AccelTableWriter::Header::emit(Dwarf5AccelTableWriter &Ctx) {
376381
assert(CompUnitCount > 0 && "Index must have at least one CU.");
@@ -409,51 +414,6 @@ DWARF5AccelTableData::getDefiningParentDieOffset(const DIE &Die) {
409414
return {};
410415
}
411416

412-
enum IdxParentEncoding : uint8_t {
413-
NoIndexedParent = 0, /// Parent information present but parent isn't indexed.
414-
Ref4 = 1, /// Parent information present and parent is indexed.
415-
NoParent = 2, /// Parent information missing.
416-
};
417-
418-
static uint32_t constexpr NumBitsIdxParent = 2;
419-
420-
uint8_t encodeIdxParent(const std::optional<dwarf::Form> MaybeParentForm) {
421-
if (!MaybeParentForm)
422-
return NoParent;
423-
switch (*MaybeParentForm) {
424-
case dwarf::Form::DW_FORM_flag_present:
425-
return NoIndexedParent;
426-
case dwarf::Form::DW_FORM_ref4:
427-
return Ref4;
428-
default:
429-
// This is not crashing on bad input: we should only reach this if the
430-
// internal compiler logic is faulty; see getFormForIdxParent.
431-
llvm_unreachable("Bad form for IDX_parent");
432-
}
433-
}
434-
435-
static uint32_t constexpr ParentBitOffset = dwarf::DW_IDX_type_hash;
436-
static uint32_t constexpr TagBitOffset = ParentBitOffset + NumBitsIdxParent;
437-
static uint32_t getTagFromAbbreviationTag(const uint32_t AbbrvTag) {
438-
return AbbrvTag >> TagBitOffset;
439-
}
440-
441-
/// Constructs a unique AbbrevTag that captures what a DIE accesses.
442-
/// Using this tag we can emit a unique abbreviation for each DIE.
443-
static uint32_t constructAbbreviationTag(
444-
const unsigned Tag,
445-
const std::optional<DWARF5AccelTable::UnitIndexAndEncoding> &EntryRet,
446-
std::optional<dwarf::Form> MaybeParentForm) {
447-
uint32_t AbbrvTag = 0;
448-
if (EntryRet)
449-
AbbrvTag |= 1 << EntryRet->Encoding.Index;
450-
AbbrvTag |= 1 << dwarf::DW_IDX_die_offset;
451-
AbbrvTag |= 1 << dwarf::DW_IDX_parent;
452-
AbbrvTag |= encodeIdxParent(MaybeParentForm) << ParentBitOffset;
453-
AbbrvTag |= Tag << TagBitOffset;
454-
return AbbrvTag;
455-
}
456-
457417
static std::optional<dwarf::Form>
458418
getFormForIdxParent(const DenseSet<OffsetAndUnitID> &IndexedOffsets,
459419
std::optional<OffsetAndUnitID> ParentOffset) {
@@ -467,26 +427,42 @@ getFormForIdxParent(const DenseSet<OffsetAndUnitID> &IndexedOffsets,
467427
return dwarf::Form::DW_FORM_flag_present;
468428
}
469429

430+
void DebugNamesAbbrev::Profile(FoldingSetNodeID &ID) const {
431+
ID.AddInteger(DieTag);
432+
for (const DebugNamesAbbrev::AttributeEncoding &Enc : AttrVect) {
433+
ID.AddInteger(Enc.Index);
434+
ID.AddInteger(Enc.Form);
435+
}
436+
}
437+
470438
void Dwarf5AccelTableWriter::populateAbbrevsMap() {
471439
for (auto &Bucket : Contents.getBuckets()) {
472440
for (auto *Hash : Bucket) {
473441
for (auto *Value : Hash->getValues<DWARF5AccelTableData *>()) {
474442
std::optional<DWARF5AccelTable::UnitIndexAndEncoding> EntryRet =
475443
getIndexForEntry(*Value);
476-
unsigned Tag = Value->getDieTag();
477444
std::optional<dwarf::Form> MaybeParentForm = getFormForIdxParent(
478445
IndexedOffsets, Value->getParentDieOffsetAndUnitID());
479-
uint32_t AbbrvTag =
480-
constructAbbreviationTag(Tag, EntryRet, MaybeParentForm);
481-
if (Abbreviations.count(AbbrvTag) == 0) {
482-
SmallVector<DWARF5AccelTableData::AttributeEncoding, 3> UA;
483-
if (EntryRet)
484-
UA.push_back(EntryRet->Encoding);
485-
UA.push_back({dwarf::DW_IDX_die_offset, dwarf::DW_FORM_ref4});
486-
if (MaybeParentForm)
487-
UA.push_back({dwarf::DW_IDX_parent, *MaybeParentForm});
488-
Abbreviations.try_emplace(AbbrvTag, UA);
446+
DebugNamesAbbrev Abbrev(Value->getDieTag());
447+
if (EntryRet)
448+
Abbrev.addAttribute(EntryRet->Encoding);
449+
Abbrev.addAttribute({dwarf::DW_IDX_die_offset, dwarf::DW_FORM_ref4});
450+
if (MaybeParentForm)
451+
Abbrev.addAttribute({dwarf::DW_IDX_parent, *MaybeParentForm});
452+
FoldingSetNodeID ID;
453+
Abbrev.Profile(ID);
454+
void *InsertPos;
455+
if (DebugNamesAbbrev *Existing =
456+
AbbreviationsSet.FindNodeOrInsertPos(ID, InsertPos)) {
457+
Value->setAbbrevNumber(Existing->getNumber());
458+
continue;
489459
}
460+
DebugNamesAbbrev *NewAbbrev =
461+
new (Alloc) DebugNamesAbbrev(std::move(Abbrev));
462+
AbbreviationsVector.push_back(NewAbbrev);
463+
NewAbbrev->setNumber(AbbreviationsVector.size());
464+
AbbreviationsSet.InsertNode(NewAbbrev, InsertPos);
465+
Value->setAbbrevNumber(NewAbbrev->getNumber());
490466
}
491467
}
492468
}
@@ -536,14 +512,13 @@ void Dwarf5AccelTableWriter::emitStringOffsets() const {
536512

537513
void Dwarf5AccelTableWriter::emitAbbrevs() const {
538514
Asm->OutStreamer->emitLabel(AbbrevStart);
539-
for (const auto &Abbrev : Abbreviations) {
515+
for (const DebugNamesAbbrev *Abbrev : AbbreviationsVector) {
540516
Asm->OutStreamer->AddComment("Abbrev code");
541-
uint32_t Tag = getTagFromAbbreviationTag(Abbrev.first);
542-
assert(Tag != 0);
543-
Asm->emitULEB128(Abbrev.first);
544-
Asm->OutStreamer->AddComment(dwarf::TagString(Tag));
545-
Asm->emitULEB128(Tag);
546-
for (const auto &AttrEnc : Abbrev.second) {
517+
Asm->emitULEB128(Abbrev->getNumber());
518+
Asm->OutStreamer->AddComment(dwarf::TagString(Abbrev->getDieTag()));
519+
Asm->emitULEB128(Abbrev->getDieTag());
520+
for (const DebugNamesAbbrev::AttributeEncoding &AttrEnc :
521+
Abbrev->getAttributes()) {
547522
Asm->emitULEB128(AttrEnc.Index, dwarf::IndexString(AttrEnc.Index).data());
548523
Asm->emitULEB128(AttrEnc.Form,
549524
dwarf::FormEncodingString(AttrEnc.Form).data());
@@ -558,21 +533,15 @@ void Dwarf5AccelTableWriter::emitAbbrevs() const {
558533
void Dwarf5AccelTableWriter::emitEntry(
559534
const DWARF5AccelTableData &Entry,
560535
const DenseMap<OffsetAndUnitID, MCSymbol *> &DIEOffsetToAccelEntryLabel,
561-
DenseSet<MCSymbol *> &EmittedAccelEntrySymbols) const {
536+
DenseSet<MCSymbol *> &EmittedAccelEntrySymbols) {
537+
unsigned AbbrevIndex = Entry.getAbbrevNumber() - 1;
538+
assert(AbbrevIndex < AbbreviationsVector.size() &&
539+
"Entry abbrev index is outside of abbreviations vector range.");
540+
DebugNamesAbbrev *Abbrev = AbbreviationsVector[AbbrevIndex];
562541
std::optional<DWARF5AccelTable::UnitIndexAndEncoding> EntryRet =
563542
getIndexForEntry(Entry);
564543
std::optional<OffsetAndUnitID> MaybeParentOffset =
565544
Entry.getParentDieOffsetAndUnitID();
566-
std::optional<dwarf::Form> MaybeParentForm =
567-
getFormForIdxParent(IndexedOffsets, MaybeParentOffset);
568-
uint32_t AbbrvTag =
569-
constructAbbreviationTag(Entry.getDieTag(), EntryRet, MaybeParentForm);
570-
auto AbbrevIt = Abbreviations.find(AbbrvTag);
571-
assert(AbbrevIt != Abbreviations.end() &&
572-
"Why wasn't this abbrev generated?");
573-
assert(getTagFromAbbreviationTag(AbbrevIt->first) == Entry.getDieTag() &&
574-
"Invalid Tag");
575-
576545
auto EntrySymbolIt =
577546
DIEOffsetToAccelEntryLabel.find(Entry.getDieOffsetAndUnitID());
578547
assert(EntrySymbolIt != DIEOffsetToAccelEntryLabel.end());
@@ -584,9 +553,10 @@ void Dwarf5AccelTableWriter::emitEntry(
584553
if (EmittedAccelEntrySymbols.insert(EntrySymbol).second)
585554
Asm->OutStreamer->emitLabel(EntrySymbol);
586555

587-
Asm->emitULEB128(AbbrevIt->first, "Abbreviation code");
556+
Asm->emitULEB128(Entry.getAbbrevNumber(), "Abbreviation code");
588557

589-
for (const auto &AttrEnc : AbbrevIt->second) {
558+
for (const DebugNamesAbbrev::AttributeEncoding &AttrEnc :
559+
Abbrev->getAttributes()) {
590560
Asm->OutStreamer->AddComment(dwarf::IndexString(AttrEnc.Index));
591561
switch (AttrEnc.Index) {
592562
case dwarf::DW_IDX_compile_unit:

llvm/test/DebugInfo/X86/debug-names-dwarf64.ll

+5-5
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@
3030
; CHECK-NEXT: CU[0]: 0x00000000
3131
; CHECK-NEXT: ]
3232
; CHECK-NEXT: Abbreviations [
33-
; CHECK-NEXT: Abbreviation [[ABBREV_LABEL:0x[0-9a-f]*]] {
34-
; CHECK-NEXT: Tag: DW_TAG_label
35-
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
36-
; CHECK-NEXT: DW_IDX_parent: DW_FORM_ref4
37-
; CHECK-NEXT: }
3833
; CHECK-NEXT: Abbreviation [[ABBREV:0x[0-9a-f]*]] {
3934
; CHECK-NEXT: Tag: DW_TAG_base_type
4035
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
@@ -50,6 +45,11 @@
5045
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
5146
; CHECK-NEXT: DW_IDX_parent: DW_FORM_flag_present
5247
; CHECK-NEXT: }
48+
; CHECK-NEXT: Abbreviation [[ABBREV_LABEL:0x[0-9a-f]*]] {
49+
; CHECK-NEXT: Tag: DW_TAG_label
50+
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
51+
; CHECK-NEXT: DW_IDX_parent: DW_FORM_ref4
52+
; CHECK-NEXT: }
5353
; CHECK-NEXT: ]
5454
; CHECK-NEXT: Bucket 0 [
5555
; CHECK-NEXT: Name 1 {

llvm/test/DebugInfo/X86/debug-names-types.ll

+21-21
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,14 @@
3737
; CHECK-NEXT: LocalTU[0]: 0x00000000
3838
; CHECK-NEXT: ]
3939
; CHECK: Abbreviations [
40-
; CHECK-NEXT: Abbreviation [[ABBREV3:0x[0-9a-f]*]] {
41-
; CHECK-NEXT: Tag: DW_TAG_structure_type
42-
; CHECK-NEXT: DW_IDX_type_unit: DW_FORM_data1
43-
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
44-
; CHECK-NEXT: DW_IDX_parent: DW_FORM_flag_present
45-
; CHECK-NEXT: }
46-
; CHECK-NEXT: Abbreviation [[ABBREV4:0x[0-9a-f]*]] {
40+
; CHECK-NEXT: Abbreviation [[ABBREV:0x[0-9a-f]*]] {
4741
; CHECK-NEXT: Tag: DW_TAG_base_type
48-
; CHECK-NEXT: DW_IDX_type_unit: DW_FORM_data1
4942
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
5043
; CHECK-NEXT: DW_IDX_parent: DW_FORM_flag_present
5144
; CHECK-NEXT: }
52-
; CHECK-NEXT: Abbreviation [[ABBREV:0x[0-9a-f]*]] {
53-
; CHECK-NEXT: Tag: DW_TAG_base_type
45+
; CHECK-NEXT: Abbreviation [[ABBREV3:0x[0-9a-f]*]] {
46+
; CHECK-NEXT: Tag: DW_TAG_structure_type
47+
; CHECK-NEXT: DW_IDX_type_unit: DW_FORM_data1
5448
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
5549
; CHECK-NEXT: DW_IDX_parent: DW_FORM_flag_present
5650
; CHECK-NEXT: }
@@ -64,6 +58,12 @@
6458
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
6559
; CHECK-NEXT: DW_IDX_parent: DW_FORM_flag_present
6660
; CHECK-NEXT: }
61+
; CHECK-NEXT: Abbreviation [[ABBREV4:0x[0-9a-f]*]] {
62+
; CHECK-NEXT: Tag: DW_TAG_base_type
63+
; CHECK-NEXT: DW_IDX_type_unit: DW_FORM_data1
64+
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
65+
; CHECK-NEXT: DW_IDX_parent: DW_FORM_flag_present
66+
; CHECK-NEXT: }
6767
; CHECK-NEXT: ]
6868
; CHECK-NEXT: Bucket 0 [
6969
; CHECK-NEXT: Name 1 {
@@ -130,7 +130,7 @@
130130
; CHECK-SPLIT: Foreign TU count: 1
131131
; CHECK-SPLIT-NEXT: Bucket count: 4
132132
; CHECK-SPLIT-NEXT: Name count: 4
133-
; CHECK-SPLIT-NEXT: Abbreviations table size: 0x32
133+
; CHECK-SPLIT-NEXT: Abbreviations table size: 0x2D
134134
; CHECK-SPLIT-NEXT: Augmentation: 'LLVM0700'
135135
; CHECK-SPLIT-NEXT: }
136136
; CHECK-SPLIT-NEXT: Compilation Unit offsets [
@@ -140,20 +140,14 @@
140140
; CHECK-SPLIT-NEXT: ForeignTU[0]: 0x675d23e4f33235f2
141141
; CHECK-SPLIT-NEXT: ]
142142
; CHECK-SPLIT-NEXT: Abbreviations [
143-
; CHECK-SPLIT-NEXT: Abbreviation [[ABBREV1:0x[0-9a-f]*]] {
144-
; CHECK-SPLIT-NEXT: Tag: DW_TAG_structure_type
145-
; CHECK-SPLIT-NEXT: DW_IDX_type_unit: DW_FORM_data1
146-
; CHECK-SPLIT-NEXT: DW_IDX_die_offset: DW_FORM_ref4
147-
; CHECK-SPLIT-NEXT: DW_IDX_parent: DW_FORM_flag_present
148-
; CHECK-SPLIT-NEXT: }
149-
; CHECK-SPLIT-NEXT: Abbreviation [[ABBREV4:0x[0-9a-f]*]] {
143+
; CHECK-SPLIT-NEXT: Abbreviation [[ABBREV2:0x[0-9a-f]*]] {
150144
; CHECK-SPLIT-NEXT: Tag: DW_TAG_base_type
151-
; CHECK-SPLIT-NEXT: DW_IDX_type_unit: DW_FORM_data1
152145
; CHECK-SPLIT-NEXT: DW_IDX_die_offset: DW_FORM_ref4
153146
; CHECK-SPLIT-NEXT: DW_IDX_parent: DW_FORM_flag_present
154147
; CHECK-SPLIT-NEXT: }
155-
; CHECK-SPLIT-NEXT: Abbreviation [[ABBREV2:0x[0-9a-f]*]] {
156-
; CHECK-SPLIT-NEXT: Tag: DW_TAG_base_type
148+
; CHECK-SPLIT-NEXT: Abbreviation [[ABBREV1:0x[0-9a-f]*]] {
149+
; CHECK-SPLIT-NEXT: Tag: DW_TAG_structure_type
150+
; CHECK-SPLIT-NEXT: DW_IDX_type_unit: DW_FORM_data1
157151
; CHECK-SPLIT-NEXT: DW_IDX_die_offset: DW_FORM_ref4
158152
; CHECK-SPLIT-NEXT: DW_IDX_parent: DW_FORM_flag_present
159153
; CHECK-SPLIT-NEXT: }
@@ -167,6 +161,12 @@
167161
; CHECK-SPLIT-NEXT: DW_IDX_die_offset: DW_FORM_ref4
168162
; CHECK-SPLIT-NEXT: DW_IDX_parent: DW_FORM_flag_present
169163
; CHECK-SPLIT-NEXT: }
164+
; CHECK-SPLIT-NEXT: Abbreviation [[ABBREV4:0x[0-9a-f]*]] {
165+
; CHECK-SPLIT-NEXT: Tag: DW_TAG_base_type
166+
; CHECK-SPLIT-NEXT: DW_IDX_type_unit: DW_FORM_data1
167+
; CHECK-SPLIT-NEXT: DW_IDX_die_offset: DW_FORM_ref4
168+
; CHECK-SPLIT-NEXT: DW_IDX_parent: DW_FORM_flag_present
169+
; CHECK-SPLIT-NEXT: }
170170
; CHECK-SPLIT-NEXT: ]
171171
; CHECK-SPLIT-NEXT: Bucket 0 [
172172
; CHECK-SPLIT-NEXT: Name 1 {

0 commit comments

Comments
 (0)