Index: llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h +++ llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.h @@ -51,8 +51,14 @@ 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 Index: llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/AddressPool.cpp @@ -27,8 +27,6 @@ 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 @@ // 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()); Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -675,6 +675,10 @@ (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 @@ } // 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, Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -299,6 +299,9 @@ /// 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); Index: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp =================================================================== --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1648,3 +1648,10 @@ 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()); +} Index: llvm/trunk/test/DebugInfo/PowerPC/tls-fission.ll =================================================================== --- llvm/trunk/test/DebugInfo/PowerPC/tls-fission.ll +++ llvm/trunk/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" Index: llvm/trunk/test/DebugInfo/X86/debug_addr.ll =================================================================== --- llvm/trunk/test/DebugInfo/X86/debug_addr.ll +++ llvm/trunk/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: [ Index: llvm/trunk/test/DebugInfo/X86/tls.ll =================================================================== --- llvm/trunk/test/DebugInfo/X86/tls.ll +++ llvm/trunk/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