Factor the Unit section parsing into the DWARFUnitSection class.

Summary: No functional change.

Reviewers: dblaikie, samsonov

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D5522

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219098 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Frederic Riss
2014-10-06 03:36:18 +00:00
parent ef68758aa8
commit 3736cc5be8
3 changed files with 50 additions and 62 deletions

View File

@@ -314,84 +314,28 @@ DWARFContext::getLineTableForUnit(DWARFUnit *cu) {
}
void DWARFContext::parseCompileUnits() {
if (!CUs.empty())
return;
uint32_t offset = 0;
const DataExtractor &DIData = DataExtractor(getInfoSection().Data,
isLittleEndian(), 0);
while (DIData.isValidOffset(offset)) {
std::unique_ptr<DWARFCompileUnit> CU(new DWARFCompileUnit(*this,
getDebugAbbrev(), getInfoSection().Data, getRangeSection(),
getStringSection(), StringRef(), getAddrSection(),
&getInfoSection().Relocs, isLittleEndian(), CUs));
if (!CU->extract(DIData, &offset)) {
break;
}
CUs.push_back(std::move(CU));
offset = CUs.back()->getNextUnitOffset();
}
CUs.parse(*this, getInfoSection().Data, getInfoSection().Relocs);
}
void DWARFContext::parseTypeUnits() {
if (!TUs.empty())
return;
for (const auto &I : getTypesSections()) {
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));
if (!TU->extract(DIData, &offset))
break;
TUS.push_back(std::move(TU));
offset = TUS.back()->getNextUnitOffset();
}
TUs.back().parse(*this, I.second.Data, I.second.Relocs);
}
}
void DWARFContext::parseDWOCompileUnits() {
if (!DWOCUs.empty())
return;
uint32_t offset = 0;
const DataExtractor &DIData =
DataExtractor(getInfoDWOSection().Data, isLittleEndian(), 0);
while (DIData.isValidOffset(offset)) {
std::unique_ptr<DWARFCompileUnit> DWOCU(new DWARFCompileUnit(*this,
getDebugAbbrevDWO(), getInfoDWOSection().Data, getRangeDWOSection(),
getStringDWOSection(), getStringOffsetDWOSection(), getAddrSection(),
&getInfoDWOSection().Relocs, isLittleEndian(), DWOCUs));
if (!DWOCU->extract(DIData, &offset)) {
break;
}
DWOCUs.push_back(std::move(DWOCU));
offset = DWOCUs.back()->getNextUnitOffset();
}
DWOCUs.parseDWO(*this, getInfoDWOSection().Data, getInfoDWOSection().Relocs);
}
void DWARFContext::parseDWOTypeUnits() {
if (!DWOTUs.empty())
return;
for (const auto &I : getTypesDWOSections()) {
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(), TUS));
if (!TU->extract(DIData, &offset))
break;
TUS.push_back(std::move(TU));
offset = TUS.back()->getNextUnitOffset();
}
DWOTUs.back().parseDWO(*this, I.second.Data, I.second.Relocs);
}
}