From be4ac84b4f05fa52125298781d79bdad1ac8dfc3 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Thu, 20 Sep 2018 09:17:36 +0000 Subject: [PATCH] [DWARF] - Emit the correct value for DW_AT_addr_base. Currently, we emit DW_AT_addr_base that points to the beginning of the .debug_addr section. That is not correct for the DWARF5 case because address table contains the header and the attribute should point to the first entry following the header. This is currently the reason why LLDB does not work with such executables correctly. Patch fixes the issue. Differential revision: https://reviews.llvm.org/D52168 llvm-svn: 342635 --- lib/CodeGen/AsmPrinter/AddressPool.cpp | 12 +++++++----- lib/CodeGen/AsmPrinter/AddressPool.h | 6 ++++++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 12 +++++++----- lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 7 +++++++ lib/CodeGen/AsmPrinter/DwarfUnit.h | 3 +++ test/DebugInfo/PowerPC/tls-fission.ll | 1 + test/DebugInfo/X86/debug_addr.ll | 2 +- test/DebugInfo/X86/tls.ll | 1 + 8 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/AddressPool.cpp b/lib/CodeGen/AsmPrinter/AddressPool.cpp index c8305ad9c54..c21616766fa 100644 --- a/lib/CodeGen/AsmPrinter/AddressPool.cpp +++ b/lib/CodeGen/AsmPrinter/AddressPool.cpp @@ -27,8 +27,6 @@ unsigned AddressPool::getIndex(const MCSymbol *Sym, bool TLS) { void AddressPool::emitHeader(AsmPrinter &Asm, MCSection *Section) { static const uint8_t AddrSize = Asm.getDataLayout().getPointerSize(); - Asm.OutStreamer->SwitchSection(Section); - uint64_t Length = sizeof(uint16_t) // version + sizeof(uint8_t) // address_size + sizeof(uint8_t) // segment_selector_size @@ -41,15 +39,19 @@ void AddressPool::emitHeader(AsmPrinter &Asm, MCSection *Section) { // Emit addresses into the section given. void AddressPool::emit(AsmPrinter &Asm, MCSection *AddrSection) { + // Start the dwarf addr section. + Asm.OutStreamer->SwitchSection(AddrSection); + if (Asm.getDwarfVersion() >= 5) emitHeader(Asm, AddrSection); + // Define the symbol that marks the start of the contribution. + // It is referenced via DW_AT_addr_base. + Asm.OutStreamer->EmitLabel(AddressTableBaseSym); + if (Pool.empty()) return; - // Start the dwarf addr section. - Asm.OutStreamer->SwitchSection(AddrSection); - // Order the address pool entries by ID SmallVector Entries(Pool.size()); diff --git a/lib/CodeGen/AsmPrinter/AddressPool.h b/lib/CodeGen/AsmPrinter/AddressPool.h index d5008fab556..2209c7eb50e 100644 --- a/lib/CodeGen/AsmPrinter/AddressPool.h +++ b/lib/CodeGen/AsmPrinter/AddressPool.h @@ -51,8 +51,14 @@ public: void resetUsedFlag() { HasBeenUsed = false; } + MCSymbol *getLabel() { return AddressTableBaseSym; } + void setLabel(MCSymbol *Sym) { AddressTableBaseSym = Sym; } + private: void emitHeader(AsmPrinter &Asm, MCSection *Section); + + /// Symbol designates the start of the contribution to the address table. + MCSymbol *AddressTableBaseSym = nullptr; }; } // end namespace llvm diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 78d11fb1252..f6a875f405a 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -675,6 +675,10 @@ void DwarfDebug::beginModule() { (useSplitDwarf() ? SkeletonHolder : InfoHolder) .setRnglistsTableBaseSym(Asm->createTempSymbol("rnglists_table_base")); + // Create the symbol that points to the first entry following the debug + // address table (.debug_addr) header. + AddrPool.setLabel(Asm->createTempSymbol("addr_table_base")); + for (DICompileUnit *CUNode : M->debug_compile_units()) { // FIXME: Move local imported entities into a list attached to the // subprogram, then this search won't be needed and a @@ -792,11 +796,9 @@ void DwarfDebug::finalizeModuleInfo() { } // We don't keep track of which addresses are used in which CU so this // is a bit pessimistic under LTO. - if (!AddrPool.isEmpty()) { - const MCSymbol *Sym = TLOF.getDwarfAddrSection()->getBeginSymbol(); - SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_addr_base, - Sym, Sym); - } + if (!AddrPool.isEmpty()) + SkCU->addAddrTableBase(); + if (getDwarfVersion() < 5 && !SkCU->getRangeLists().empty()) { const MCSymbol *Sym = TLOF.getDwarfRangesSection()->getBeginSymbol(); SkCU->addSectionLabel(SkCU->getUnitDie(), dwarf::DW_AT_GNU_ranges_base, diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index bf96bc6380e..14e59c3df27 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1648,3 +1648,10 @@ void DwarfUnit::addRnglistsBase() { DU->getRnglistsTableBaseSym(), TLOF.getDwarfRnglistsSection()->getBeginSymbol()); } + +void DwarfUnit::addAddrTableBase() { + const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); + MCSymbol *Label = DD->getAddressPool().getLabel(); + addSectionLabel(getUnitDie(), dwarf::DW_AT_GNU_addr_base, Label, + TLOF.getDwarfAddrSection()->getBeginSymbol()); +} diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 225d9ae4061..6e2bd273cb6 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -299,6 +299,9 @@ public: /// Add the DW_AT_rnglists_base attribute to the unit DIE. void addRnglistsBase(); + /// Add the DW_AT_addr_base attribute to the unit DIE. + void addAddrTableBase(); + virtual DwarfCompileUnit &getCU() = 0; void constructTypeDIE(DIE &Buffer, const DICompositeType *CTy); diff --git a/test/DebugInfo/PowerPC/tls-fission.ll b/test/DebugInfo/PowerPC/tls-fission.ll index fa1c2982113..fdc53de8317 100644 --- a/test/DebugInfo/PowerPC/tls-fission.ll +++ b/test/DebugInfo/PowerPC/tls-fission.ll @@ -14,6 +14,7 @@ ; CHECK-NEXT: .byte 224 ; check that the expected TLS address description is the first thing in the debug_addr section ; CHECK: .section .debug_addr,"",@progbits +; CHECK-NEXT: .Laddr_table_base0: ; CHECK-NEXT: .quad tls@DTPREL+32768 source_filename = "test/DebugInfo/PowerPC/tls-fission.ll" diff --git a/test/DebugInfo/X86/debug_addr.ll b/test/DebugInfo/X86/debug_addr.ll index cf6b241b1de..ea7c8bda7bc 100644 --- a/test/DebugInfo/X86/debug_addr.ll +++ b/test/DebugInfo/X86/debug_addr.ll @@ -31,7 +31,7 @@ ; DWARF5: DW_TAG_compile_unit ; DWARF5-NOT: DW_TAG_{{.*}} ; DWARF5: DW_AT_GNU_dwo_name{{.*}}test.dwo -; DWARF5: DW_AT_GNU_addr_base{{.*}}0x00000000 +; DWARF5: DW_AT_GNU_addr_base{{.*}}0x00000008 ; DWARF5: .debug_addr contents: ; DWARF5-NEXT: 0x00000000: Addr Section: length = 0x0000000c, version = 0x0005, addr_size = 0x04, seg_size = 0x00 ; DWARF5-NEXT: Addrs: [ diff --git a/test/DebugInfo/X86/tls.ll b/test/DebugInfo/X86/tls.ll index bc89ee02a11..071ae15b8d1 100644 --- a/test/DebugInfo/X86/tls.ll +++ b/test/DebugInfo/X86/tls.ll @@ -78,6 +78,7 @@ ; check that the expected TLS address description is the first thing in the debug_addr section ; FISSION: .section .debug_addr +; FISSION-NEXT: .Laddr_table_base0: ; FISSION-NEXT: .quad tls@DTPOFF ; FISSION-NEXT: .quad glbl ; FISSION-NOT: .quad glbl