summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorFrederic Riss <friss@apple.com>2014-09-26 12:15:40 +0000
committerFrederic Riss <friss@apple.com>2014-09-26 12:15:40 +0000
commit6b65eb0642165caf410526745a4f8b172fa23fb9 (patch)
treea7fb905578891edf7051fdde5a127fb345a63ba6 /llvm/lib
parent7165e8989246606c4a982d255ac1fbf2892f9af8 (diff)
downloadbcm5719-llvm-6b65eb0642165caf410526745a4f8b172fa23fb9.tar.gz
bcm5719-llvm-6b65eb0642165caf410526745a4f8b172fa23fb9.zip
Store TypeUnits in a SmallVector<DWARFUnitSection> instead of a single DWARFUnitSection.
Summary: 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. Reviewers: samsonov, dblaikie Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5482 llvm-svn: 218513
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/DebugInfo/DWARFContext.cpp26
-rw-r--r--llvm/lib/DebugInfo/DWARFContext.h13
2 files changed, 23 insertions, 16 deletions
diff --git a/llvm/lib/DebugInfo/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARFContext.cpp
index 1be0691a1d9..1f9491002d2 100644
--- a/llvm/lib/DebugInfo/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARFContext.cpp
@@ -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();
}
}
}
diff --git a/llvm/lib/DebugInfo/DWARFContext.h b/llvm/lib/DebugInfo/DWARFContext.h
index f00191acb93..972f313c622 100644
--- a/llvm/lib/DebugInfo/DWARFContext.h
+++ b/llvm/lib/DebugInfo/DWARFContext.h
@@ -30,7 +30,7 @@ namespace llvm {
class DWARFContext : public DIContext {
DWARFUnitSection<DWARFCompileUnit> CUs;
- DWARFUnitSection<DWARFTypeUnit> TUs;
+ SmallVector<DWARFUnitSection<DWARFTypeUnit>,1> TUs;
std::unique_ptr<DWARFDebugAbbrev> Abbrev;
std::unique_ptr<DWARFDebugLoc> Loc;
std::unique_ptr<DWARFDebugAranges> Aranges;
@@ -38,7 +38,7 @@ class DWARFContext : public DIContext {
std::unique_ptr<DWARFDebugFrame> DebugFrame;
DWARFUnitSection<DWARFCompileUnit> DWOCUs;
- DWARFUnitSection<DWARFTypeUnit> DWOTUs;
+ SmallVector<DWARFUnitSection<DWARFTypeUnit>,1> DWOTUs;
std::unique_ptr<DWARFDebugAbbrev> AbbrevDWO;
std::unique_ptr<DWARFDebugLocDWO> LocDWO;
@@ -77,6 +77,7 @@ public:
typedef DWARFUnitSection<DWARFCompileUnit>::iterator_range cu_iterator_range;
typedef DWARFUnitSection<DWARFTypeUnit>::iterator_range tu_iterator_range;
+ typedef iterator_range<SmallVectorImpl<DWARFUnitSection<DWARFTypeUnit>>::iterator> tu_section_iterator_range;
/// Get compile units in this context.
cu_iterator_range compile_units() {
@@ -85,9 +86,9 @@ public:
}
/// Get type units in this context.
- tu_iterator_range type_units() {
+ tu_section_iterator_range type_unit_sections() {
parseTypeUnits();
- return tu_iterator_range(TUs.begin(), TUs.end());
+ return tu_section_iterator_range(TUs.begin(), TUs.end());
}
/// Get compile units in the DWO context.
@@ -97,9 +98,9 @@ public:
}
/// Get type units in the DWO context.
- tu_iterator_range dwo_type_units() {
+ tu_section_iterator_range dwo_type_unit_sections() {
parseDWOTypeUnits();
- return tu_iterator_range(DWOTUs.begin(), DWOTUs.end());
+ return tu_section_iterator_range(DWOTUs.begin(), DWOTUs.end());
}
/// Get the number of compile units in this context.
OpenPOWER on IntegriCloud