forked from OSchip/llvm-project
DebugInfo: Wrap section data and relocs together for dwarf dumping support
This is a small step that may enable some simplifications in producer (DWARFContext) and consumer (DWARFCompileUnit and other places) by making a more complete abstraction around the data and relocations for a section. Small initial steps could include simple changes such as passing the pair to DWARFCompileUnit's ctor rather than passing the data and relocs separately. I don't intend to pursue any such changes immediately, however. The motivation for doing this now is that type unit dumping will need to deal with these data+reloc pairs moreso than the existing dumping support has needed to associate the data as type unit sections are named the same (debug_types) and comdat group folded. So to implement dumping and reloc handling we'll need a mapping of section->data+relocs. llvm-svn: 191209
This commit is contained in:
parent
f1bd57814a
commit
1b5ee5d9f1
|
@ -69,10 +69,10 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) {
|
|||
cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_stmt_list,
|
||||
-1U);
|
||||
if (stmtOffset != -1U) {
|
||||
DataExtractor lineData(getLineSection(), isLittleEndian(),
|
||||
DataExtractor lineData(getLineSection().Data, isLittleEndian(),
|
||||
savedAddressByteSize);
|
||||
DWARFDebugLine::DumpingState state(OS);
|
||||
DWARFDebugLine::parseStatementTable(lineData, &lineRelocMap(), &stmtOffset, state);
|
||||
DWARFDebugLine::parseStatementTable(lineData, &getLineSection().Relocs, &stmtOffset, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -206,8 +206,8 @@ const DWARFDebugLoc *DWARFContext::getDebugLoc() {
|
|||
if (Loc)
|
||||
return Loc.get();
|
||||
|
||||
DataExtractor LocData(getLocSection(), isLittleEndian(), 0);
|
||||
Loc.reset(new DWARFDebugLoc(locRelocMap()));
|
||||
DataExtractor LocData(getLocSection().Data, isLittleEndian(), 0);
|
||||
Loc.reset(new DWARFDebugLoc(getLocSection().Relocs));
|
||||
// assume all compile units have the same address byte size
|
||||
if (getNumCompileUnits())
|
||||
Loc->parse(LocData, getCompileUnitAtIndex(0)->getAddressByteSize());
|
||||
|
@ -252,7 +252,7 @@ const DWARFDebugFrame *DWARFContext::getDebugFrame() {
|
|||
const DWARFLineTable *
|
||||
DWARFContext::getLineTableForCompileUnit(DWARFCompileUnit *cu) {
|
||||
if (!Line)
|
||||
Line.reset(new DWARFDebugLine(&lineRelocMap()));
|
||||
Line.reset(new DWARFDebugLine(&getLineSection().Relocs));
|
||||
|
||||
unsigned stmtOffset =
|
||||
cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_stmt_list,
|
||||
|
@ -265,20 +265,20 @@ DWARFContext::getLineTableForCompileUnit(DWARFCompileUnit *cu) {
|
|||
return lt;
|
||||
|
||||
// We have to parse it first.
|
||||
DataExtractor lineData(getLineSection(), isLittleEndian(),
|
||||
DataExtractor lineData(getLineSection().Data, isLittleEndian(),
|
||||
cu->getAddressByteSize());
|
||||
return Line->getOrParseLineTable(lineData, stmtOffset);
|
||||
}
|
||||
|
||||
void DWARFContext::parseCompileUnits() {
|
||||
uint32_t offset = 0;
|
||||
const DataExtractor &DIData = DataExtractor(getInfoSection(),
|
||||
const DataExtractor &DIData = DataExtractor(getInfoSection().Data,
|
||||
isLittleEndian(), 0);
|
||||
while (DIData.isValidOffset(offset)) {
|
||||
OwningPtr<DWARFCompileUnit> CU(new DWARFCompileUnit(
|
||||
getDebugAbbrev(), getInfoSection(), getAbbrevSection(),
|
||||
getDebugAbbrev(), getInfoSection().Data, getAbbrevSection(),
|
||||
getRangeSection(), getStringSection(), StringRef(), getAddrSection(),
|
||||
&infoRelocMap(), isLittleEndian()));
|
||||
&getInfoSection().Relocs, isLittleEndian()));
|
||||
if (!CU->extract(DIData, &offset)) {
|
||||
break;
|
||||
}
|
||||
|
@ -289,14 +289,14 @@ void DWARFContext::parseCompileUnits() {
|
|||
|
||||
void DWARFContext::parseDWOCompileUnits() {
|
||||
uint32_t offset = 0;
|
||||
const DataExtractor &DIData = DataExtractor(getInfoDWOSection(),
|
||||
isLittleEndian(), 0);
|
||||
const DataExtractor &DIData =
|
||||
DataExtractor(getInfoDWOSection().Data, isLittleEndian(), 0);
|
||||
while (DIData.isValidOffset(offset)) {
|
||||
OwningPtr<DWARFCompileUnit> DWOCU(new DWARFCompileUnit(
|
||||
getDebugAbbrevDWO(), getInfoDWOSection(), getAbbrevDWOSection(),
|
||||
getDebugAbbrevDWO(), getInfoDWOSection().Data, getAbbrevDWOSection(),
|
||||
getRangeDWOSection(), getStringDWOSection(),
|
||||
getStringOffsetDWOSection(), getAddrSection(), &infoDWORelocMap(),
|
||||
isLittleEndian()));
|
||||
getStringOffsetDWOSection(), getAddrSection(),
|
||||
&getInfoDWOSection().Relocs, isLittleEndian()));
|
||||
if (!DWOCU->extract(DIData, &offset)) {
|
||||
break;
|
||||
}
|
||||
|
@ -574,17 +574,17 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) :
|
|||
}
|
||||
|
||||
StringRef *Section = StringSwitch<StringRef*>(name)
|
||||
.Case("debug_info", &InfoSection)
|
||||
.Case("debug_info", &InfoSection.Data)
|
||||
.Case("debug_abbrev", &AbbrevSection)
|
||||
.Case("debug_loc", &LocSection)
|
||||
.Case("debug_line", &LineSection)
|
||||
.Case("debug_loc", &LocSection.Data)
|
||||
.Case("debug_line", &LineSection.Data)
|
||||
.Case("debug_aranges", &ARangeSection)
|
||||
.Case("debug_frame", &DebugFrameSection)
|
||||
.Case("debug_str", &StringSection)
|
||||
.Case("debug_ranges", &RangeSection)
|
||||
.Case("debug_pubnames", &PubNamesSection)
|
||||
.Case("debug_gnu_pubnames", &GnuPubNamesSection)
|
||||
.Case("debug_info.dwo", &InfoDWOSection)
|
||||
.Case("debug_info.dwo", &InfoDWOSection.Data)
|
||||
.Case("debug_abbrev.dwo", &AbbrevDWOSection)
|
||||
.Case("debug_str.dwo", &StringDWOSection)
|
||||
.Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
|
||||
|
@ -611,10 +611,10 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) :
|
|||
// TODO: Add support for relocations in other sections as needed.
|
||||
// Record relocations for the debug_info and debug_line sections.
|
||||
RelocAddrMap *Map = StringSwitch<RelocAddrMap*>(RelSecName)
|
||||
.Case("debug_info", &InfoRelocMap)
|
||||
.Case("debug_loc", &LocRelocMap)
|
||||
.Case("debug_info.dwo", &InfoDWORelocMap)
|
||||
.Case("debug_line", &LineRelocMap)
|
||||
.Case("debug_info", &InfoSection.Relocs)
|
||||
.Case("debug_loc", &LocSection.Relocs)
|
||||
.Case("debug_info.dwo", &InfoDWOSection.Relocs)
|
||||
.Case("debug_line", &LineSection.Relocs)
|
||||
.Default(0);
|
||||
if (!Map)
|
||||
continue;
|
||||
|
|
|
@ -48,6 +48,11 @@ class DWARFContext : public DIContext {
|
|||
void parseDWOCompileUnits();
|
||||
|
||||
public:
|
||||
struct Section {
|
||||
StringRef Data;
|
||||
RelocAddrMap Relocs;
|
||||
};
|
||||
|
||||
DWARFContext() : DIContext(CK_DWARF) {}
|
||||
virtual ~DWARFContext();
|
||||
|
||||
|
@ -113,28 +118,24 @@ public:
|
|||
|
||||
virtual bool isLittleEndian() const = 0;
|
||||
virtual uint8_t getAddressSize() const = 0;
|
||||
virtual const RelocAddrMap &infoRelocMap() const = 0;
|
||||
virtual const RelocAddrMap &lineRelocMap() const = 0;
|
||||
virtual const RelocAddrMap &locRelocMap() const = 0;
|
||||
virtual StringRef getInfoSection() = 0;
|
||||
virtual const Section &getInfoSection() = 0;
|
||||
virtual StringRef getAbbrevSection() = 0;
|
||||
virtual StringRef getLocSection() = 0;
|
||||
virtual const Section &getLocSection() = 0;
|
||||
virtual StringRef getARangeSection() = 0;
|
||||
virtual StringRef getDebugFrameSection() = 0;
|
||||
virtual StringRef getLineSection() = 0;
|
||||
virtual const Section &getLineSection() = 0;
|
||||
virtual StringRef getStringSection() = 0;
|
||||
virtual StringRef getRangeSection() = 0;
|
||||
virtual StringRef getPubNamesSection() = 0;
|
||||
virtual StringRef getGnuPubNamesSection() = 0;
|
||||
|
||||
// Sections for DWARF5 split dwarf proposal.
|
||||
virtual StringRef getInfoDWOSection() = 0;
|
||||
virtual const Section &getInfoDWOSection() = 0;
|
||||
virtual StringRef getAbbrevDWOSection() = 0;
|
||||
virtual StringRef getStringDWOSection() = 0;
|
||||
virtual StringRef getStringOffsetDWOSection() = 0;
|
||||
virtual StringRef getRangeDWOSection() = 0;
|
||||
virtual StringRef getAddrSection() = 0;
|
||||
virtual const RelocAddrMap &infoDWORelocMap() const = 0;
|
||||
|
||||
static bool isSupportedVersion(unsigned version) {
|
||||
return version == 2 || version == 3 || version == 4;
|
||||
|
@ -155,23 +156,19 @@ class DWARFContextInMemory : public DWARFContext {
|
|||
virtual void anchor();
|
||||
bool IsLittleEndian;
|
||||
uint8_t AddressSize;
|
||||
RelocAddrMap InfoRelocMap;
|
||||
RelocAddrMap LocRelocMap;
|
||||
RelocAddrMap LineRelocMap;
|
||||
StringRef InfoSection;
|
||||
Section InfoSection;
|
||||
StringRef AbbrevSection;
|
||||
StringRef LocSection;
|
||||
Section LocSection;
|
||||
StringRef ARangeSection;
|
||||
StringRef DebugFrameSection;
|
||||
StringRef LineSection;
|
||||
Section LineSection;
|
||||
StringRef StringSection;
|
||||
StringRef RangeSection;
|
||||
StringRef PubNamesSection;
|
||||
StringRef GnuPubNamesSection;
|
||||
|
||||
// Sections for DWARF5 split dwarf proposal.
|
||||
RelocAddrMap InfoDWORelocMap;
|
||||
StringRef InfoDWOSection;
|
||||
Section InfoDWOSection;
|
||||
StringRef AbbrevDWOSection;
|
||||
StringRef StringDWOSection;
|
||||
StringRef StringOffsetDWOSection;
|
||||
|
@ -185,22 +182,19 @@ public:
|
|||
~DWARFContextInMemory();
|
||||
virtual bool isLittleEndian() const { return IsLittleEndian; }
|
||||
virtual uint8_t getAddressSize() const { return AddressSize; }
|
||||
virtual const RelocAddrMap &infoRelocMap() const { return InfoRelocMap; }
|
||||
virtual const RelocAddrMap &locRelocMap() const { return LocRelocMap; }
|
||||
virtual const RelocAddrMap &lineRelocMap() const { return LineRelocMap; }
|
||||
virtual StringRef getInfoSection() { return InfoSection; }
|
||||
virtual const Section &getInfoSection() { return InfoSection; }
|
||||
virtual StringRef getAbbrevSection() { return AbbrevSection; }
|
||||
virtual StringRef getLocSection() { return LocSection; }
|
||||
virtual const Section &getLocSection() { return LocSection; }
|
||||
virtual StringRef getARangeSection() { return ARangeSection; }
|
||||
virtual StringRef getDebugFrameSection() { return DebugFrameSection; }
|
||||
virtual StringRef getLineSection() { return LineSection; }
|
||||
virtual const Section &getLineSection() { return LineSection; }
|
||||
virtual StringRef getStringSection() { return StringSection; }
|
||||
virtual StringRef getRangeSection() { return RangeSection; }
|
||||
virtual StringRef getPubNamesSection() { return PubNamesSection; }
|
||||
virtual StringRef getGnuPubNamesSection() { return GnuPubNamesSection; }
|
||||
|
||||
// Sections for DWARF5 split dwarf proposal.
|
||||
virtual StringRef getInfoDWOSection() { return InfoDWOSection; }
|
||||
virtual const Section &getInfoDWOSection() { return InfoDWOSection; }
|
||||
virtual StringRef getAbbrevDWOSection() { return AbbrevDWOSection; }
|
||||
virtual StringRef getStringDWOSection() { return StringDWOSection; }
|
||||
virtual StringRef getStringOffsetDWOSection() {
|
||||
|
@ -210,9 +204,6 @@ public:
|
|||
virtual StringRef getAddrSection() {
|
||||
return AddrSection;
|
||||
}
|
||||
virtual const RelocAddrMap &infoDWORelocMap() const {
|
||||
return InfoDWORelocMap;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue