mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
Store TypeUnits in a SmallVector<DWARFUnitSection> instead of a single DWARFUnitSection.
There will be multiple TypeUnits in an unlinked object that will be extracted from different sections. Now that we have DWARFUnitSection that is supposed to represent an input section, we need a DWARFUnitSection<TypeUnit> per input .debug_types section. Once this is done, the interface is homogenous and we can move the Section parsing code into DWARFUnitSection. This is a respin of r218513 that got reverted because it broke some builders. This new version features an explicit move constructor for the DWARFUnitSection class to workaround compilers unable to generate correct C++11 default constructors. Reviewers: samsonov, dblaikie Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5482 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -86,15 +86,17 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) {
|
||||
|
||||
if ((DumpType == DIDT_All || DumpType == DIDT_Types) && getNumTypeUnits()) {
|
||||
OS << "\n.debug_types contents:\n";
|
||||
for (const auto &TU : type_units())
|
||||
TU->dump(OS);
|
||||
for (const auto &TUS : type_unit_sections())
|
||||
for (const auto &TU : TUS)
|
||||
TU->dump(OS);
|
||||
}
|
||||
|
||||
if ((DumpType == DIDT_All || DumpType == DIDT_TypesDwo) &&
|
||||
getNumDWOTypeUnits()) {
|
||||
OS << "\n.debug_types.dwo contents:\n";
|
||||
for (const auto &DWOTU : dwo_type_units())
|
||||
DWOTU->dump(OS);
|
||||
for (const auto &DWOTUS : dwo_type_unit_sections())
|
||||
for (const auto &DWOTU : DWOTUS)
|
||||
DWOTU->dump(OS);
|
||||
}
|
||||
|
||||
if (DumpType == DIDT_All || DumpType == DIDT_Loc) {
|
||||
@@ -337,15 +339,17 @@ void DWARFContext::parseTypeUnits() {
|
||||
uint32_t offset = 0;
|
||||
const DataExtractor &DIData =
|
||||
DataExtractor(I.second.Data, isLittleEndian(), 0);
|
||||
TUs.push_back(DWARFUnitSection<DWARFTypeUnit>());
|
||||
auto &TUS = TUs.back();
|
||||
while (DIData.isValidOffset(offset)) {
|
||||
std::unique_ptr<DWARFTypeUnit> TU(new DWARFTypeUnit(*this,
|
||||
getDebugAbbrev(), I.second.Data, getRangeSection(),
|
||||
getStringSection(), StringRef(), getAddrSection(),
|
||||
&I.second.Relocs, isLittleEndian(), TUs));
|
||||
&I.second.Relocs, isLittleEndian(), TUS));
|
||||
if (!TU->extract(DIData, &offset))
|
||||
break;
|
||||
TUs.push_back(std::move(TU));
|
||||
offset = TUs.back()->getNextUnitOffset();
|
||||
TUS.push_back(std::move(TU));
|
||||
offset = TUS.back()->getNextUnitOffset();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -376,15 +380,17 @@ void DWARFContext::parseDWOTypeUnits() {
|
||||
uint32_t offset = 0;
|
||||
const DataExtractor &DIData =
|
||||
DataExtractor(I.second.Data, isLittleEndian(), 0);
|
||||
DWOTUs.push_back(DWARFUnitSection<DWARFTypeUnit>());
|
||||
auto &TUS = DWOTUs.back();
|
||||
while (DIData.isValidOffset(offset)) {
|
||||
std::unique_ptr<DWARFTypeUnit> TU(new DWARFTypeUnit(*this,
|
||||
getDebugAbbrevDWO(), I.second.Data, getRangeDWOSection(),
|
||||
getStringDWOSection(), getStringOffsetDWOSection(), getAddrSection(),
|
||||
&I.second.Relocs, isLittleEndian(), DWOTUs));
|
||||
&I.second.Relocs, isLittleEndian(), TUS));
|
||||
if (!TU->extract(DIData, &offset))
|
||||
break;
|
||||
DWOTUs.push_back(std::move(TU));
|
||||
offset = DWOTUs.back()->getNextUnitOffset();
|
||||
TUS.push_back(std::move(TU));
|
||||
offset = TUS.back()->getNextUnitOffset();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user