Skip to content

Commit 9384d0c

Browse files
Merge pull request #8585 from rastogishubham/RewriteMCCASDebugInfo
Rewrite MCCAS Debug Info creation as iterative
2 parents 9c7e223 + 3e7d9f0 commit 9384d0c

File tree

1 file changed

+47
-46
lines changed

1 file changed

+47
-46
lines changed

llvm/lib/MCCAS/MCCASObjectV1.cpp

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,14 +2303,16 @@ struct DIEToCASConverter {
23032303
bool IsLittleEndian;
23042304
uint8_t AddressSize;
23052305

2306-
Error convertInNewDIEBlock(
2307-
DWARFDie DIE, DistinctDataWriter &DistinctWriter,
2308-
AbbrevSetWriter &AbbrevWriter,
2309-
SmallVectorImpl<std::unique_ptr<DIEDataWriter>> &DIEWriters);
2306+
struct ParentAndChildDIE {
2307+
DWARFDie Parent;
2308+
bool ParentAlreadyWritten;
2309+
DIEDataWriter &Writer;
2310+
std::optional<DWARFDie> Child;
2311+
};
23102312

23112313
Error
2312-
convertImpl(DWARFDie &DIE, DIEDataWriter &DIEWriter,
2313-
DistinctDataWriter &DistinctWriter, AbbrevSetWriter &AbbrevWriter,
2314+
convertImpl(DWARFDie DIE, DistinctDataWriter &DistinctWriter,
2315+
AbbrevSetWriter &AbbrevWriter,
23142316
SmallVectorImpl<std::unique_ptr<DIEDataWriter>> &DIEWriters);
23152317
};
23162318

@@ -3660,6 +3662,12 @@ static void writeDIEAttrs(DWARFDie &DIE, ArrayRef<char> DebugInfoData,
36603662
}
36613663
}
36623664

3665+
static void
3666+
pushNewDIEWriter(SmallVectorImpl<std::unique_ptr<DIEDataWriter>> &DIEWriters) {
3667+
auto DIEWriter = std::make_unique<DIEDataWriter>();
3668+
DIEWriters.push_back(std::move(DIEWriter));
3669+
}
3670+
36633671
/// Creates an abbreviation for DIE using AbbrevWriter.
36643672
/// Stores the contents of the DIE using DistinctWriter and DIEWriter following
36653673
/// the format:
@@ -3675,61 +3683,54 @@ static void writeDIEAttrs(DWARFDie &DIE, ArrayRef<char> DebugInfoData,
36753683
/// DIEAbbrevSetRef block. In this case, raw_data should be interpreted
36763684
/// according to the corresponding DIEAbbrevRefs block.
36773685
Error DIEToCASConverter::convertImpl(
3678-
DWARFDie &DIE, DIEDataWriter &DIEWriter, DistinctDataWriter &DistinctWriter,
3686+
DWARFDie DIE, DistinctDataWriter &DistinctWriter,
36793687
AbbrevSetWriter &AbbrevWriter,
36803688
SmallVectorImpl<std::unique_ptr<DIEDataWriter>> &DIEWriters) {
3681-
Expected<unsigned> MaybeAbbrevIndex =
3682-
AbbrevWriter.createAbbrevEntry(DIE, CASBuilder);
3683-
if (!MaybeAbbrevIndex)
3684-
return MaybeAbbrevIndex.takeError();
3685-
3686-
DistinctWriter.writeULEB128(encodeAbbrevIndex(*MaybeAbbrevIndex));
3687-
writeDIEAttrs(DIE, DebugInfoData, DIEWriter, DistinctWriter, IsLittleEndian,
3688-
AddressSize);
3689-
3690-
for (DWARFDie Child = DIE.getFirstChild(); Child;
3691-
Child = Child.getSibling()) {
3692-
dwarf::Tag ChildTag = Child.getTag();
3693-
if (ChildTag == dwarf::Tag::DW_TAG_null) {
3694-
DistinctWriter.writeULEB128(getEndOfDIESiblingsMarker());
3695-
break;
3689+
SmallVector<ParentAndChildDIE> DIEStack;
3690+
pushNewDIEWriter(DIEWriters);
3691+
DIEStack.push_back({DIE, false, *DIEWriters.back(), std::nullopt});
3692+
while (!DIEStack.empty()) {
3693+
auto ParentAndChild = DIEStack.pop_back_val();
3694+
DWARFDie CurrDIE = ParentAndChild.Parent;
3695+
3696+
if (!ParentAndChild.ParentAlreadyWritten) {
3697+
Expected<unsigned> MaybeAbbrevIndex =
3698+
AbbrevWriter.createAbbrevEntry(CurrDIE, CASBuilder);
3699+
if (!MaybeAbbrevIndex)
3700+
return MaybeAbbrevIndex.takeError();
3701+
3702+
DistinctWriter.writeULEB128(encodeAbbrevIndex(*MaybeAbbrevIndex));
3703+
writeDIEAttrs(CurrDIE, DebugInfoData, ParentAndChild.Writer,
3704+
DistinctWriter, IsLittleEndian, AddressSize);
36963705
}
36973706

3698-
// FIXME: don't use recursion.
3699-
if (shouldCreateSeparateBlockFor(Child)) {
3700-
DistinctWriter.writeULEB128(getDIEInAnotherBlockMarker());
3701-
if (auto E = convertInNewDIEBlock(Child, DistinctWriter, AbbrevWriter,
3702-
DIEWriters))
3703-
return E;
3704-
continue;
3707+
DWARFDie Child = ParentAndChild.Child ? ParentAndChild.Child->getSibling()
3708+
: CurrDIE.getFirstChild();
3709+
if (Child) {
3710+
dwarf::Tag ChildTag = Child.getTag();
3711+
if (ChildTag == dwarf::Tag::DW_TAG_null)
3712+
DistinctWriter.writeULEB128(getEndOfDIESiblingsMarker());
3713+
else if (shouldCreateSeparateBlockFor(Child)) {
3714+
DistinctWriter.writeULEB128(getDIEInAnotherBlockMarker());
3715+
DIEStack.push_back({CurrDIE, true, ParentAndChild.Writer, Child});
3716+
pushNewDIEWriter(DIEWriters);
3717+
DIEStack.push_back({Child, false, *DIEWriters.back(), std::nullopt});
3718+
} else {
3719+
DIEStack.push_back({CurrDIE, true, ParentAndChild.Writer, Child});
3720+
DIEStack.push_back({Child, false, ParentAndChild.Writer, std::nullopt});
3721+
}
37053722
}
3706-
if (auto E = convertImpl(Child, DIEWriter, DistinctWriter, AbbrevWriter,
3707-
DIEWriters))
3708-
return E;
37093723
}
37103724
return Error::success();
37113725
}
37123726

3713-
Error DIEToCASConverter::convertInNewDIEBlock(
3714-
DWARFDie DIE, DistinctDataWriter &DistinctWriter,
3715-
AbbrevSetWriter &AbbrevWriter,
3716-
SmallVectorImpl<std::unique_ptr<DIEDataWriter>> &DIEWriters) {
3717-
auto DIEWriter = std::make_unique<DIEDataWriter>();
3718-
DIEWriters.push_back(std::move(DIEWriter));
3719-
if (auto E = convertImpl(DIE, *DIEWriters.back(), DistinctWriter,
3720-
AbbrevWriter, DIEWriters))
3721-
return E;
3722-
return Error::success();
3723-
}
3724-
37253727
Expected<DIETopLevelRef>
37263728
DIEToCASConverter::convert(DWARFDie DIE, ArrayRef<char> HeaderData,
37273729
AbbrevSetWriter &AbbrevWriter) {
37283730
DistinctDataWriter DistinctWriter;
37293731
DistinctWriter.writeData(HeaderData);
37303732
SmallVector<std::unique_ptr<DIEDataWriter>> DIEWriters;
3731-
if (Error E =
3732-
convertInNewDIEBlock(DIE, DistinctWriter, AbbrevWriter, DIEWriters))
3733+
if (Error E = convertImpl(DIE, DistinctWriter, AbbrevWriter, DIEWriters))
37333734
return std::move(E);
37343735

37353736
Expected<DIEAbbrevSetRef> MaybeAbbrevSet =

0 commit comments

Comments
 (0)