Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDebugLoc.h @@ -42,7 +42,8 @@ SmallVector Entries; /// Dump this list on OS. void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize, - const MCRegisterInfo *MRI, unsigned Indent) const; + const MCRegisterInfo *MRI, uint64_t BaseAddress, + unsigned Indent) const; }; private: Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -420,9 +420,7 @@ llvm_unreachable("Invalid UnitType."); } - llvm::Optional getBaseAddress() const { return BaseAddr; } - - void setBaseAddress(BaseAddress BaseAddr) { this->BaseAddr = BaseAddr; } + llvm::Optional getBaseAddress(); DWARFDie getUnitDIE(bool ExtractUnitDIEOnly = true) { extractDIEsIfNeeded(ExtractUnitDIEOnly); Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp @@ -40,13 +40,15 @@ void DWARFDebugLoc::LocationList::dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize, const MCRegisterInfo *MRI, + uint64_t BaseAddress, unsigned Indent) const { for (const Entry &E : Entries) { OS << '\n'; OS.indent(Indent); OS << format("[0x%*.*" PRIx64 ", ", AddressSize * 2, AddressSize * 2, - E.Begin) - << format(" 0x%*.*" PRIx64 ")", AddressSize * 2, AddressSize * 2, E.End); + BaseAddress + E.Begin); + OS << format(" 0x%*.*" PRIx64 ")", AddressSize * 2, AddressSize * 2, + BaseAddress + E.End); OS << ": "; dumpExpression(OS, E.Loc, IsLittleEndian, AddressSize, MRI); @@ -67,7 +69,7 @@ Optional Offset) const { auto DumpLocationList = [&](const LocationList &L) { OS << format("0x%8.8x: ", L.Offset); - L.dump(OS, IsLittleEndian, AddressSize, MRI, 12); + L.dump(OS, IsLittleEndian, AddressSize, MRI, 0, 12); OS << "\n\n"; }; Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -102,15 +102,18 @@ const DWARFSection &LocSection = Obj.getLocSection(); const DWARFSection &LocDWOSection = Obj.getLocDWOSection(); uint32_t Offset = *FormValue.getAsSectionOffset(); - if (!LocSection.Data.empty()) { DWARFDebugLoc DebugLoc; DWARFDataExtractor Data(Obj, LocSection, Ctx.isLittleEndian(), Obj.getAddressSize()); auto LL = DebugLoc.parseOneLocationList(Data, &Offset); - if (LL) - LL->dump(OS, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, Indent); - else + if (LL) { + uint64_t BaseAddr = 0; + if (Optional BA = U->getBaseAddress()) + BaseAddr = BA->Address; + LL->dump(OS, Ctx.isLittleEndian(), Obj.getAddressSize(), MRI, BaseAddr, + Indent); + } else OS << "error extracting location list."; } else if (!LocDWOSection.Data.empty()) { DataExtractor Data(LocDWOSection.Data, Ctx.isLittleEndian(), 0); Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -269,10 +269,6 @@ // If CU DIE was just parsed, copy several attribute values from it. if (!HasCUDie) { DWARFDie UnitDie = getUnitDIE(); - Optional PC = UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc}); - if (Optional Addr = toAddress(PC)) - setBaseAddress({*Addr, PC->getSectionIndex()}); - if (!isDWO) { assert(AddrOffsetSectionBase == 0); assert(RangeSectionBase == 0); @@ -578,6 +574,18 @@ return Abbrevs; } +llvm::Optional DWARFUnit::getBaseAddress() { + if (BaseAddr) + return BaseAddr; + + DWARFDie UnitDie = getUnitDIE(); + Optional PC = UnitDie.find({DW_AT_low_pc, DW_AT_entry_pc}); + if (Optional Addr = toAddress(PC)) + BaseAddr = {*Addr, PC->getSectionIndex()}; + + return BaseAddr; +} + Optional StrOffsetsContributionDescriptor::validateContributionSize( DWARFDataExtractor &DA) { Index: llvm/trunk/test/DebugInfo/X86/debug-loc-offset.ll =================================================================== --- llvm/trunk/test/DebugInfo/X86/debug-loc-offset.ll +++ llvm/trunk/test/DebugInfo/X86/debug-loc-offset.ll @@ -43,8 +43,8 @@ ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}} -; CHECK-NEXT: [0x00000000, 0x00000017): DW_OP_breg0 EAX+0, DW_OP_deref -; CHECK-NEXT: [0x00000017, 0x00000043): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref +; CHECK-NEXT: [0x00000020, 0x00000037): DW_OP_breg0 EAX+0, DW_OP_deref +; CHECK-NEXT: [0x00000037, 0x00000063): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref ; CHECK-NEXT: DW_AT_name [DW_FORM_strp]{{.*}}"a" ; CHECK: DW_TAG_variable Index: llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test =================================================================== --- llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test +++ llvm/trunk/test/tools/dsymutil/X86/basic-lto-dw4-linking-x86.test @@ -74,7 +74,7 @@ CHECK: DW_AT_type (0x000000a1 CHECK: DW_TAG_formal_parameter CHECK: DW_AT_location (0x00000000 -CHECK: [0x0000000000000000, 0x000000000000000c): DW_OP_reg5 RDI, DW_OP_piece 0x4) +CHECK: [0x0000000100000f50, 0x0000000100000f5c): DW_OP_reg5 RDI, DW_OP_piece 0x4) CHECK: DW_AT_name ("arg") CHECK: DW_AT_type (0x000000a1 CHECK: DW_TAG_inlined_subroutine @@ -107,8 +107,8 @@ CHECK: DW_AT_name ("bar") CHECK: DW_TAG_formal_parameter CHECK: DW_AT_location (0x00000025 -CHECK: [0x0000000000000000, 0x000000000000000f): DW_OP_reg5 RDI, DW_OP_piece 0x4 -CHECK: [0x0000000000000019, 0x000000000000001d): DW_OP_reg5 RDI, DW_OP_piece 0x4) +CHECK: [0x0000000100000f90, 0x0000000100000f9f): DW_OP_reg5 RDI, DW_OP_piece 0x4 +CHECK: [0x0000000100000fa9, 0x0000000100000fad): DW_OP_reg5 RDI, DW_OP_piece 0x4) CHECK: DW_AT_name ("arg") CHECK: DW_TAG_inlined_subroutine CHECK: DW_AT_abstract_origin (0x0000015f "inc") Index: llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test =================================================================== --- llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test +++ llvm/trunk/test/tools/dsymutil/X86/basic-lto-linking-x86.test @@ -77,7 +77,7 @@ CHECK: DW_AT_name ("arg") CHECK: DW_AT_type (0x0000000000000063 CHECK: DW_AT_location (0x00000000 -CHECK: [0x0000000000000000, 0x000000000000000e): DW_OP_reg5 RDI, DW_OP_piece 0x4) +CHECK: [0x0000000100000f50, 0x0000000100000f5e): DW_OP_reg5 RDI, DW_OP_piece 0x4) CHECK:[[INC1:0x[0-9a-f]*]]{{.*}}DW_TAG_inlined_subroutine CHECK: DW_AT_abstract_origin (0x00000128 "inc") CHECK: DW_AT_low_pc (0x0000000100000f63) @@ -115,8 +115,8 @@ CHECK: DW_AT_name ("arg") CHECK: DW_AT_type (0x0000000000000063 CHECK: DW_AT_location (0x00000025 -CHECK: [0x0000000000000000, 0x000000000000000f): DW_OP_reg5 RDI, DW_OP_piece 0x4 -CHECK: [0x0000000000000019, 0x000000000000001d): DW_OP_reg5 RDI, DW_OP_piece 0x4) +CHECK: [0x0000000100000f90, 0x0000000100000f9f): DW_OP_reg5 RDI, DW_OP_piece 0x4 +CHECK: [0x0000000100000fa9, 0x0000000100000fad): DW_OP_reg5 RDI, DW_OP_piece 0x4) CHECK: DW_TAG_lexical_block CHECK: DW_AT_low_pc (0x0000000100000f94) CHECK: DW_AT_high_pc (0x0000000100000fa7)