Index: llvm/trunk/include/llvm/BinaryFormat/Dwarf.def =================================================================== --- llvm/trunk/include/llvm/BinaryFormat/Dwarf.def +++ llvm/trunk/include/llvm/BinaryFormat/Dwarf.def @@ -840,6 +840,7 @@ HANDLE_DWARF_SECTION(DebugInfo, ".debug_info", "debug-info") HANDLE_DWARF_SECTION(DebugTypes, ".debug_types", "debug-types") HANDLE_DWARF_SECTION(DebugLine, ".debug_line", "debug-line") +HANDLE_DWARF_SECTION(DebugLineStr, ".debug_line_str", "debug-line-str") HANDLE_DWARF_SECTION(DebugLoc, ".debug_loc", "debug-loc") HANDLE_DWARF_SECTION(DebugFrame, ".debug_frame", "debug-frame") HANDLE_DWARF_SECTION(DebugMacro, ".debug_macro", "debug-macro") Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFCompileUnit.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFCompileUnit.h +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFCompileUnit.h @@ -20,10 +20,11 @@ DWARFCompileUnit(DWARFContext &Context, const DWARFSection &Section, const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, - const DWARFSection *AOS, const DWARFSection &LS, bool LE, - bool IsDWO, const DWARFUnitSectionBase &UnitSection, + const DWARFSection *AOS, const DWARFSection &LS, + StringRef LSS, bool LE, bool IsDWO, + const DWARFUnitSectionBase &UnitSection, const DWARFUnitIndex::Entry *Entry) - : DWARFUnit(Context, Section, DA, RS, SS, SOS, AOS, LS, LE, IsDWO, + : DWARFUnit(Context, Section, DA, RS, SS, SOS, AOS, LS, LSS, LE, IsDWO, UnitSection, Entry) {} // VTable anchor. Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFObject.h @@ -42,6 +42,7 @@ virtual StringRef getDebugFrameSection() const { return ""; } virtual StringRef getEHFrameSection() const { return ""; } virtual const DWARFSection &getLineSection() const { return Dummy; } + virtual StringRef getLineStringSection() const { return ""; } virtual StringRef getStringSection() const { return ""; } virtual const DWARFSection &getRangeSection() const { return Dummy; } virtual StringRef getMacinfoSection() const { return ""; } Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFTypeUnit.h @@ -32,10 +32,10 @@ DWARFTypeUnit(DWARFContext &Context, const DWARFSection &Section, const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, const DWARFSection *AOS, - const DWARFSection &LS, bool LE, bool IsDWO, + const DWARFSection &LS, StringRef LSS, bool LE, bool IsDWO, const DWARFUnitSectionBase &UnitSection, const DWARFUnitIndex::Entry *Entry) - : DWARFUnit(Context, Section, DA, RS, SS, SOS, AOS, LS, LE, IsDWO, + : DWARFUnit(Context, Section, DA, RS, SS, SOS, AOS, LS, LSS, LE, IsDWO, UnitSection, Entry) {} uint32_t getHeaderSize() const override { 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 @@ -60,7 +60,8 @@ const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, const DWARFSection *AOS, const DWARFSection &LS, - bool isLittleEndian, bool isDWO, bool Lazy) = 0; + StringRef LSS, bool isLittleEndian, bool isDWO, + bool Lazy) = 0; }; const DWARFUnitIndex &getDWARFUnitIndex(DWARFContext &Context, @@ -119,7 +120,7 @@ void parseImpl(DWARFContext &Context, const DWARFSection &Section, const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, const DWARFSection *AOS, - const DWARFSection &LS, bool LE, bool IsDWO, + const DWARFSection &LS, StringRef LSS, bool LE, bool IsDWO, bool Lazy) override { if (Parsed) return; @@ -133,7 +134,7 @@ if (!Data.isValidOffset(Offset)) return nullptr; auto U = llvm::make_unique( - Context, Section, DA, RS, SS, SOS, AOS, LS, LE, IsDWO, *this, + Context, Section, DA, RS, SS, SOS, AOS, LS, LSS, LE, IsDWO, *this, Index ? Index->getFromOffset(Offset) : nullptr); if (!U->extract(Data, &Offset)) return nullptr; @@ -197,6 +198,7 @@ const DWARFSection *RangeSection; uint32_t RangeSectionBase; const DWARFSection &LineSection; + StringRef LineStringSection; StringRef StringSection; const DWARFSection &StringOffsetSection; const DWARFSection *AddrOffsetSection; @@ -293,7 +295,7 @@ DWARFUnit(DWARFContext &Context, const DWARFSection &Section, const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, const DWARFSection *AOS, - const DWARFSection &LS, bool LE, bool IsDWO, + const DWARFSection &LS, StringRef LSS, bool LE, bool IsDWO, const DWARFUnitSectionBase &UnitSection, const DWARFUnitIndex::Entry *IndexEntry = nullptr); @@ -302,6 +304,7 @@ DWARFContext& getContext() const { return Context; } const DWARFSection &getLineSection() const { return LineSection; } + StringRef getLineStringSection() const { return LineStringSection; } StringRef getStringSection() const { return StringSection; } const DWARFSection &getStringOffsetSection() const { return StringOffsetSection; @@ -322,11 +325,13 @@ DWARFDataExtractor getDebugInfoExtractor() const; + DataExtractor getLineStringExtractor() const { + return DataExtractor(LineStringSection, false, 0); + } DataExtractor getStringExtractor() const { return DataExtractor(StringSection, false, 0); } - bool extract(DataExtractor debug_info, uint32_t* offset_ptr); /// extractRangeList - extracts the range list referenced by this compile Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -459,6 +459,16 @@ strDWOOffset = offset; } } + if (shouldDump(Explicit, ".debug_line_str", DIDT_ID_DebugLineStr, + DObj->getLineStringSection())) { + DataExtractor strData(DObj->getLineStringSection(), isLittleEndian(), 0); + uint32_t offset = 0; + uint32_t strOffset = 0; + while (const char *s = strData.getCStr(&offset)) { + OS << format("0x%8.8x: \"%s\"\n", strOffset, s); + strOffset = offset; + } + } if (shouldDump(Explicit, ".debug_ranges", DIDT_ID_DebugRanges, DObj->getRangeSection().Data)) { @@ -1193,6 +1203,7 @@ StringRef CUIndexSection; StringRef GdbIndexSection; StringRef TUIndexSection; + StringRef LineStringSection; SmallVector, 4> UncompressedSections; @@ -1215,6 +1226,7 @@ .Case("debug_cu_index", &CUIndexSection) .Case("debug_tu_index", &TUIndexSection) .Case("gdb_index", &GdbIndexSection) + .Case("debug_line_str", &LineStringSection) // Any more debug info sections go here. .Default(nullptr); } @@ -1433,6 +1445,7 @@ const DWARFSection &getStringOffsetSection() const override { return StringOffsetSection; } + StringRef getLineStringSection() const override { return LineStringSection; } // Sections for DWARF5 split dwarf proposal. const DWARFSection &getInfoDWOSection() const override { Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -264,6 +264,7 @@ case DW_FORM_strx2: case DW_FORM_strx3: case DW_FORM_strx4: + case DW_FORM_line_strp: return (FC == FC_String); case DW_FORM_implicit_const: return (FC == FC_Constant); @@ -582,6 +583,11 @@ if (Form == DW_FORM_GNU_strp_alt || U == nullptr) return None; uint32_t Offset = Value.uval; + if (Form == DW_FORM_line_strp) { + if (const char *Str = U->getLineStringExtractor().getCStr(&Offset)) + return Str; + return None; + } if (Form == DW_FORM_GNU_str_index || Form == DW_FORM_strx || Form == DW_FORM_strx1 || Form == DW_FORM_strx2 || Form == DW_FORM_strx3 || Form == DW_FORM_strx4) { Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -34,8 +34,8 @@ const DWARFObject &D = C.getDWARFObj(); parseImpl(C, Section, C.getDebugAbbrev(), &D.getRangeSection(), D.getStringSection(), D.getStringOffsetSection(), - &D.getAddrSection(), D.getLineSection(), D.isLittleEndian(), false, - false); + &D.getAddrSection(), D.getLineSection(), D.getLineStringSection(), + D.isLittleEndian(), false, false); } void DWARFUnitSectionBase::parseDWO(DWARFContext &C, @@ -43,20 +43,21 @@ const DWARFObject &D = C.getDWARFObj(); parseImpl(C, DWOSection, C.getDebugAbbrevDWO(), &D.getRangeDWOSection(), D.getStringDWOSection(), D.getStringOffsetDWOSection(), - &D.getAddrSection(), D.getLineDWOSection(), C.isLittleEndian(), - true, Lazy); + &D.getAddrSection(), D.getLineDWOSection(), StringRef(), + C.isLittleEndian(), true, Lazy); } DWARFUnit::DWARFUnit(DWARFContext &DC, const DWARFSection &Section, const DWARFDebugAbbrev *DA, const DWARFSection *RS, StringRef SS, const DWARFSection &SOS, - const DWARFSection *AOS, const DWARFSection &LS, bool LE, - bool IsDWO, const DWARFUnitSectionBase &UnitSection, + const DWARFSection *AOS, const DWARFSection &LS, + StringRef LSS, bool LE, bool IsDWO, + const DWARFUnitSectionBase &UnitSection, const DWARFUnitIndex::Entry *IndexEntry) : Context(DC), InfoSection(Section), Abbrev(DA), RangeSection(RS), - LineSection(LS), StringSection(SS), StringOffsetSection(SOS), - AddrOffsetSection(AOS), isLittleEndian(LE), isDWO(IsDWO), - UnitSection(UnitSection), IndexEntry(IndexEntry) { + LineSection(LS), LineStringSection(LSS), StringSection(SS), + StringOffsetSection(SOS), AddrOffsetSection(AOS), isLittleEndian(LE), + isDWO(IsDWO), UnitSection(UnitSection), IndexEntry(IndexEntry) { clear(); } Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -282,8 +282,8 @@ DCtx, DObj.getInfoSection(), DCtx.getDebugAbbrev(), &DObj.getRangeSection(), DObj.getStringSection(), DObj.getStringOffsetSection(), &DObj.getAppleObjCSection(), - DObj.getLineSection(), DCtx.isLittleEndian(), false, TUSection, - nullptr)); + DObj.getLineSection(), DObj.getLineStringSection(), + DCtx.isLittleEndian(), false, TUSection, nullptr)); break; } case dwarf::DW_UT_skeleton: @@ -297,8 +297,8 @@ DCtx, DObj.getInfoSection(), DCtx.getDebugAbbrev(), &DObj.getRangeSection(), DObj.getStringSection(), DObj.getStringOffsetSection(), &DObj.getAppleObjCSection(), - DObj.getLineSection(), DCtx.isLittleEndian(), false, CUSection, - nullptr)); + DObj.getLineSection(), DObj.getLineStringSection(), + DCtx.isLittleEndian(), false, CUSection, nullptr)); break; } default: { llvm_unreachable("Invalid UnitType."); } Index: llvm/trunk/test/DebugInfo/X86/dwarfdump-header.s =================================================================== --- llvm/trunk/test/DebugInfo/X86/dwarfdump-header.s +++ llvm/trunk/test/DebugInfo/X86/dwarfdump-header.s @@ -300,18 +300,18 @@ # File table format .byte 3 # Three elements per file entry .byte 1 # DW_LNCT_path - .byte 0x08 # DW_FORM_string + .byte 0x1f # DW_FORM_line_strp (-> .debug_line_str) .byte 2 # DW_LNCT_directory_index .byte 0x0b # DW_FORM_data1 .byte 5 # DW_LNCT_MD5 .byte 0x1e # DW_FORM_data16 # File table entries .byte 2 # Two files - .asciz "File5a" + .long lstr_LT_5a .byte 0 .quad 0x7766554433221100 .quad 0xffeeddccbbaa9988 - .asciz "File5b" + .long lstr_LT_5b .byte 1 .quad 0x8899aabbccddeeff .quad 0x0011223344556677 @@ -332,6 +332,12 @@ # CHECK: file_names[ 2] 1 ffeeddccbbaa99887766554433221100 File5b{{$}} # CHECK-NOT: file_names + .section .debug_line_str,"MS",@progbits,1 +lstr_LT_5a: + .asciz "File5a" +lstr_LT_5b: + .asciz "File5b" + .section .debug_line.dwo,"",@progbits # CHECK-LABEL: .debug_line.dwo