diff --git a/lib/DebugInfo/DWARFAcceleratorTable.cpp b/lib/DebugInfo/DWARFAcceleratorTable.cpp index 4b844e999eb..50283b40ca8 100644 --- a/lib/DebugInfo/DWARFAcceleratorTable.cpp +++ b/lib/DebugInfo/DWARFAcceleratorTable.cpp @@ -92,7 +92,13 @@ void DWARFAcceleratorTable::dump(raw_ostream &OS) { OS << " Invalid section offset\n"; continue; } - while (unsigned StringOffset = AccelSection.getU32(&DataOffset)) { + while (AccelSection.isValidOffsetForDataOfSize(DataOffset, 4)) { + unsigned StringOffset = AccelSection.getU32(&DataOffset); + RelocAddrMap::const_iterator Reloc = Relocs.find(DataOffset-4); + if (Reloc != Relocs.end()) + StringOffset += Reloc->second.second; + if (!StringOffset) + break; OS << format(" Name: %08x \"%s\"\n", StringOffset, StringSection.getCStr(&StringOffset)); unsigned NumData = AccelSection.getU32(&DataOffset); diff --git a/lib/DebugInfo/DWARFAcceleratorTable.h b/lib/DebugInfo/DWARFAcceleratorTable.h index bb25917b47d..bd8a0bdae85 100644 --- a/lib/DebugInfo/DWARFAcceleratorTable.h +++ b/lib/DebugInfo/DWARFAcceleratorTable.h @@ -1,4 +1,6 @@ +#include "DWARFRelocMap.h" + #include "llvm/ADT/SmallVector.h" #include "llvm/DebugInfo/DWARFFormValue.h" @@ -27,9 +29,11 @@ class DWARFAcceleratorTable { struct HeaderData HdrData; DataExtractor AccelSection; DataExtractor StringSection; + const RelocAddrMap& Relocs; public: - DWARFAcceleratorTable(DataExtractor AccelSection, DataExtractor StringSection) - : AccelSection(AccelSection), StringSection(StringSection) {} + DWARFAcceleratorTable(DataExtractor AccelSection, DataExtractor StringSection, + const RelocAddrMap &Relocs) + : AccelSection(AccelSection), StringSection(StringSection), Relocs(Relocs) {} bool extract(); void dump(raw_ostream &OS); diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp index 845718d195d..9a2c7cc1962 100644 --- a/lib/DebugInfo/DWARFContext.cpp +++ b/lib/DebugInfo/DWARFContext.cpp @@ -60,12 +60,13 @@ static void dumpPubSection(raw_ostream &OS, StringRef Name, StringRef Data, } } -static void dumpAccelSection(raw_ostream &OS, StringRef Name, StringRef Data, - StringRef StringSection, bool LittleEndian) { - DataExtractor AccelSection(Data, LittleEndian, 0); +static void dumpAccelSection(raw_ostream &OS, StringRef Name, + const DWARFSection& Section, StringRef StringSection, + bool LittleEndian) { + DataExtractor AccelSection(Section.Data, LittleEndian, 0); DataExtractor StrData(StringSection, LittleEndian, 0); OS << "\n." << Name << " contents:\n"; - DWARFAcceleratorTable Accel(AccelSection, StrData); + DWARFAcceleratorTable Accel(AccelSection, StrData, Section.Relocs); if (!Accel.extract()) return; Accel.dump(OS); @@ -593,11 +594,11 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj) .Case("debug_str.dwo", &StringDWOSection) .Case("debug_str_offsets.dwo", &StringOffsetDWOSection) .Case("debug_addr", &AddrSection) - .Case("apple_names", &AppleNamesSection) - .Case("apple_types", &AppleTypesSection) - .Case("apple_namespaces", &AppleNamespacesSection) - .Case("apple_namespac", &AppleNamespacesSection) - .Case("apple_objc", &AppleObjCSection) + .Case("apple_names", &AppleNamesSection.Data) + .Case("apple_types", &AppleTypesSection.Data) + .Case("apple_namespaces", &AppleNamespacesSection.Data) + .Case("apple_namespac", &AppleNamespacesSection.Data) + .Case("apple_objc", &AppleObjCSection.Data) // Any more debug info sections go here. .Default(nullptr); if (SectionData) { @@ -630,6 +631,11 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj) .Case("debug_loc", &LocSection.Relocs) .Case("debug_info.dwo", &InfoDWOSection.Relocs) .Case("debug_line", &LineSection.Relocs) + .Case("apple_names", &AppleNamesSection.Relocs) + .Case("apple_types", &AppleTypesSection.Relocs) + .Case("apple_namespaces", &AppleNamespacesSection.Relocs) + .Case("apple_namespac", &AppleNamespacesSection.Relocs) + .Case("apple_objc", &AppleObjCSection.Relocs) .Default(nullptr); if (!Map) { // Find debug_types relocs by section rather than name as there are diff --git a/lib/DebugInfo/DWARFContext.h b/lib/DebugInfo/DWARFContext.h index 926f7c39bd3..dd3fcc71f32 100644 --- a/lib/DebugInfo/DWARFContext.h +++ b/lib/DebugInfo/DWARFContext.h @@ -192,10 +192,10 @@ public: virtual StringRef getStringOffsetDWOSection() = 0; virtual StringRef getRangeDWOSection() = 0; virtual StringRef getAddrSection() = 0; - virtual StringRef getAppleNamesSection() = 0; - virtual StringRef getAppleTypesSection() = 0; - virtual StringRef getAppleNamespacesSection() = 0; - virtual StringRef getAppleObjCSection() = 0; + virtual const DWARFSection& getAppleNamesSection() = 0; + virtual const DWARFSection& getAppleTypesSection() = 0; + virtual const DWARFSection& getAppleNamespacesSection() = 0; + virtual const DWARFSection& getAppleObjCSection() = 0; static bool isSupportedVersion(unsigned version) { return version == 2 || version == 3 || version == 4; @@ -240,10 +240,10 @@ class DWARFContextInMemory : public DWARFContext { StringRef StringOffsetDWOSection; StringRef RangeDWOSection; StringRef AddrSection; - StringRef AppleNamesSection; - StringRef AppleTypesSection; - StringRef AppleNamespacesSection; - StringRef AppleObjCSection; + DWARFSection AppleNamesSection; + DWARFSection AppleTypesSection; + DWARFSection AppleNamespacesSection; + DWARFSection AppleObjCSection; SmallVector, 4> UncompressedSections; @@ -264,10 +264,10 @@ public: StringRef getPubTypesSection() override { return PubTypesSection; } StringRef getGnuPubNamesSection() override { return GnuPubNamesSection; } StringRef getGnuPubTypesSection() override { return GnuPubTypesSection; } - StringRef getAppleNamesSection() override { return AppleNamesSection; } - StringRef getAppleTypesSection() override { return AppleTypesSection; } - StringRef getAppleNamespacesSection() override { return AppleNamespacesSection; } - StringRef getAppleObjCSection() override { return AppleObjCSection; } + const DWARFSection& getAppleNamesSection() override { return AppleNamesSection; } + const DWARFSection& getAppleTypesSection() override { return AppleTypesSection; } + const DWARFSection& getAppleNamespacesSection() override { return AppleNamespacesSection; } + const DWARFSection& getAppleObjCSection() override { return AppleObjCSection; } // Sections for DWARF5 split dwarf proposal. const DWARFSection &getInfoDWOSection() override { return InfoDWOSection; } diff --git a/test/DebugInfo/cross-cu-inlining.ll b/test/DebugInfo/cross-cu-inlining.ll index 20c04aa6243..f262022eee9 100644 --- a/test/DebugInfo/cross-cu-inlining.ll +++ b/test/DebugInfo/cross-cu-inlining.ll @@ -1,7 +1,7 @@ ; REQUIRES: object-emission ; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck -implicit-check-not=DW_TAG %s -; RUN: %llc_dwarf -mtriple x86_64-apple-darwin -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck --check-prefix=CHECK-ACCEL --check-prefix=CHECK %s +; RUN: %llc_dwarf -dwarf-accel-tables=Enable -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck --check-prefix=CHECK-ACCEL --check-prefix=CHECK %s ; Build from source: ; $ clang++ a.cpp b.cpp -g -c -emit-llvm