[DWARF] Change pubnames to use DWARFSection instead of StringRef

Summary: The debug_info_offset values in .debug_{,gnu_}pub{name,types} may be relocated. Change it to DWARFSection so that we can get relocated values.

Reviewers: ruiu, dblaikie, grimar, JDevlieghere

Reviewed By: JDevlieghere

Subscribers: aprantl, JDevlieghere, llvm-commits

Differential Revision: https://reviews.llvm.org/D54375

llvm-svn: 346615
This commit is contained in:
Fangrui Song 2018-11-11 18:57:28 +00:00
parent f8f140dd55
commit 158b26213f
6 changed files with 72 additions and 32 deletions

View File

@ -13,6 +13,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/DebugInfo/DWARF/DWARFObject.h"
#include <cstdint>
#include <vector>
@ -67,7 +68,8 @@ private:
bool GnuStyle;
public:
DWARFDebugPubTable(StringRef Data, bool LittleEndian, bool GnuStyle);
DWARFDebugPubTable(const DWARFObject &Obj, const DWARFSection &Sec,
bool LittleEndian, bool GnuStyle);
void dump(raw_ostream &OS) const;

View File

@ -49,10 +49,10 @@ public:
virtual const DWARFSection &getRangeSection() const { return Dummy; }
virtual const DWARFSection &getRnglistsSection() const { return Dummy; }
virtual StringRef getMacinfoSection() const { return ""; }
virtual StringRef getPubNamesSection() const { return ""; }
virtual StringRef getPubTypesSection() const { return ""; }
virtual StringRef getGnuPubNamesSection() const { return ""; }
virtual StringRef getGnuPubTypesSection() const { return ""; }
virtual const DWARFSection &getPubNamesSection() const { return Dummy; }
virtual const DWARFSection &getPubTypesSection() const { return Dummy; }
virtual const DWARFSection &getGnuPubNamesSection() const { return Dummy; }
virtual const DWARFSection &getGnuPubTypesSection() const { return Dummy; }
virtual const DWARFSection &getStringOffsetSection() const { return Dummy; }
virtual void
forEachInfoDWOSections(function_ref<void(const DWARFSection &)> F) const {}

View File

@ -549,24 +549,24 @@ void DWARFContext::dump(
}
if (shouldDump(Explicit, ".debug_pubnames", DIDT_ID_DebugPubnames,
DObj->getPubNamesSection()))
DWARFDebugPubTable(DObj->getPubNamesSection(), isLittleEndian(), false)
DObj->getPubNamesSection().Data))
DWARFDebugPubTable(*DObj, DObj->getPubNamesSection(), isLittleEndian(), false)
.dump(OS);
if (shouldDump(Explicit, ".debug_pubtypes", DIDT_ID_DebugPubtypes,
DObj->getPubTypesSection()))
DWARFDebugPubTable(DObj->getPubTypesSection(), isLittleEndian(), false)
DObj->getPubTypesSection().Data))
DWARFDebugPubTable(*DObj, DObj->getPubTypesSection(), isLittleEndian(), false)
.dump(OS);
if (shouldDump(Explicit, ".debug_gnu_pubnames", DIDT_ID_DebugGnuPubnames,
DObj->getGnuPubNamesSection()))
DWARFDebugPubTable(DObj->getGnuPubNamesSection(), isLittleEndian(),
DObj->getGnuPubNamesSection().Data))
DWARFDebugPubTable(*DObj, DObj->getGnuPubNamesSection(), isLittleEndian(),
true /* GnuStyle */)
.dump(OS);
if (shouldDump(Explicit, ".debug_gnu_pubtypes", DIDT_ID_DebugGnuPubtypes,
DObj->getGnuPubTypesSection()))
DWARFDebugPubTable(DObj->getGnuPubTypesSection(), isLittleEndian(),
DObj->getGnuPubTypesSection().Data))
DWARFDebugPubTable(*DObj, DObj->getGnuPubTypesSection(), isLittleEndian(),
true /* GnuStyle */)
.dump(OS);
@ -1265,6 +1265,10 @@ class DWARFObjInMemory final : public DWARFObject {
DWARFSectionMap AppleNamespacesSection;
DWARFSectionMap AppleObjCSection;
DWARFSectionMap DebugNamesSection;
DWARFSectionMap PubNamesSection;
DWARFSectionMap PubTypesSection;
DWARFSectionMap GnuPubNamesSection;
DWARFSectionMap GnuPubTypesSection;
DWARFSectionMap *mapNameToDWARFSection(StringRef Name) {
return StringSwitch<DWARFSectionMap *>(Name)
@ -1281,6 +1285,10 @@ class DWARFObjInMemory final : public DWARFObject {
.Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
.Case("debug_addr", &AddrSection)
.Case("apple_names", &AppleNamesSection)
.Case("debug_pubnames", &PubNamesSection)
.Case("debug_pubtypes", &PubTypesSection)
.Case("debug_gnu_pubnames", &GnuPubNamesSection)
.Case("debug_gnu_pubtypes", &GnuPubTypesSection)
.Case("apple_types", &AppleTypesSection)
.Case("apple_namespaces", &AppleNamespacesSection)
.Case("apple_namespac", &AppleNamespacesSection)
@ -1294,12 +1302,8 @@ class DWARFObjInMemory final : public DWARFObject {
StringRef EHFrameSection;
StringRef StringSection;
StringRef MacinfoSection;
StringRef PubNamesSection;
StringRef PubTypesSection;
StringRef GnuPubNamesSection;
StringRef AbbrevDWOSection;
StringRef StringDWOSection;
StringRef GnuPubTypesSection;
StringRef CUIndexSection;
StringRef GdbIndexSection;
StringRef TUIndexSection;
@ -1319,10 +1323,6 @@ class DWARFObjInMemory final : public DWARFObject {
.Case("eh_frame", &EHFrameSection)
.Case("debug_str", &StringSection)
.Case("debug_macinfo", &MacinfoSection)
.Case("debug_pubnames", &PubNamesSection)
.Case("debug_pubtypes", &PubTypesSection)
.Case("debug_gnu_pubnames", &GnuPubNamesSection)
.Case("debug_gnu_pubtypes", &GnuPubTypesSection)
.Case("debug_abbrev.dwo", &AbbrevDWOSection)
.Case("debug_str.dwo", &StringDWOSection)
.Case("debug_cu_index", &CUIndexSection)
@ -1598,12 +1598,12 @@ public:
return RnglistsSection;
}
StringRef getMacinfoSection() const override { return MacinfoSection; }
StringRef getPubNamesSection() const override { return PubNamesSection; }
StringRef getPubTypesSection() const override { return PubTypesSection; }
StringRef getGnuPubNamesSection() const override {
const DWARFSection &getPubNamesSection() const override { return PubNamesSection; }
const DWARFSection &getPubTypesSection() const override { return PubTypesSection; }
const DWARFSection &getGnuPubNamesSection() const override {
return GnuPubNamesSection;
}
StringRef getGnuPubTypesSection() const override {
const DWARFSection &getGnuPubTypesSection() const override {
return GnuPubTypesSection;
}
const DWARFSection &getAppleNamesSection() const override {

View File

@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/DataExtractor.h"
@ -18,10 +19,11 @@
using namespace llvm;
using namespace dwarf;
DWARFDebugPubTable::DWARFDebugPubTable(StringRef Data, bool LittleEndian,
bool GnuStyle)
DWARFDebugPubTable::DWARFDebugPubTable(const DWARFObject &Obj,
const DWARFSection &Sec,
bool LittleEndian, bool GnuStyle)
: GnuStyle(GnuStyle) {
DataExtractor PubNames(Data, LittleEndian, 0);
DWARFDataExtractor PubNames(Obj, Sec, LittleEndian, 0);
uint32_t Offset = 0;
while (PubNames.isValidOffset(Offset)) {
Sets.push_back({});
@ -29,10 +31,10 @@ DWARFDebugPubTable::DWARFDebugPubTable(StringRef Data, bool LittleEndian,
SetData.Length = PubNames.getU32(&Offset);
SetData.Version = PubNames.getU16(&Offset);
SetData.Offset = PubNames.getU32(&Offset);
SetData.Offset = PubNames.getRelocatedValue(4, &Offset);
SetData.Size = PubNames.getU32(&Offset);
while (Offset < Data.size()) {
while (Offset < Sec.Data.size()) {
uint32_t DieRef = PubNames.getU32(&Offset);
if (DieRef == 0)
break;

View File

@ -0,0 +1,35 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
# RUN: llvm-dwarfdump -debug-gnu-pubnames %t.o | FileCheck %s
# CHECK: unit_offset = 0x00000000
# CHECK: unit_offset = 0x0000000c
.section .debug_abbrev,"",@progbits
.byte 1
.section .debug_info,"",@progbits
.Lcu_begin0:
.long 8 # Length of Unit
.short 4 # DWARF version number
.long 0 # Offset Into Abbrev. Section
.byte 4 # Address Size
.byte 0 # NULL
.Lcu_begin1:
.long 8 # Length of Unit
.short 4 # DWARF version number
.long 0 # Offset Into Abbrev. Section
.byte 4 # Address Size
.byte 0 # NULL
.section .debug_gnu_pubnames,"",@progbits
.long 14
.short 2 # DWARF Version
.long .Lcu_begin0
.long 12 # Compilation Unit Length
.long 0
.long 14
.short 2 # DWARF Version
.long .Lcu_begin1
.long 12 # Compilation Unit Length
.long 0

View File

@ -81,8 +81,9 @@ void dumpDebugARanges(DWARFContext &DCtx, DWARFYAML::Data &Y) {
}
void dumpPubSection(DWARFContext &DCtx, DWARFYAML::PubSection &Y,
StringRef Section) {
DataExtractor PubSectionData(Section, DCtx.isLittleEndian(), 0);
DWARFSection Section) {
DWARFDataExtractor PubSectionData(DCtx.getDWARFObj(), Section,
DCtx.isLittleEndian(), 0);
uint32_t Offset = 0;
dumpInitialLength(PubSectionData, Offset, Y.Length);
Y.Version = PubSectionData.getU16(&Offset);