forked from OSchip/llvm-project
[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:
parent
f8f140dd55
commit
158b26213f
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue