diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h index 7f028c357941..ac0809f95029 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -169,6 +169,7 @@ struct BaseAddress { /// Represents a unit's contribution to the string offsets table. struct StrOffsetsContributionDescriptor { uint64_t Base = 0; + /// The contribution size not including the header. uint64_t Size = 0; /// Format and version. dwarf::FormParams FormParams = {0, 0, dwarf::DwarfFormat::DWARF32}; diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp index a3ea96b72ba9..f3a3cbdbc74d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfFile.cpp @@ -36,9 +36,9 @@ void DwarfFile::emitStringOffsetsTableHeader(MCSection *Section) { // FIXME: DWARF64 // We are emitting the header for a contribution to the string offsets // table. The header consists of an entry with the contribution's - // size (not including the size of the header), the DWARF version and + // size (not including the size of the length field), the DWARF version and // 2 bytes of padding. - Asm->emitInt32(StrPool.size() * EntrySize); + Asm->emitInt32(StrPool.size() * EntrySize + 4); Asm->emitInt16(Asm->getDwarfVersion()); Asm->emitInt16(0); // Define the symbol that marks the start of the contribution. It is diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp index 6fbe55bbdc70..8488fe8ced7b 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -172,7 +172,11 @@ static void dumpDWARFv5StringOffsetsSection( OS << (ContributionHeader - Offset) << "\n"; } OS << format("0x%8.8x: ", (uint32_t)ContributionHeader); - OS << "Contribution size = " << Contribution->Size + // In DWARF v5 the contribution size in the descriptor does not equal + // the originally encoded length (it does not contain the length of the + // version field and the padding, a total of 4 bytes). Add them back in + // for reporting. + OS << "Contribution size = " << (Contribution->Size + (Version < 5 ? 0 : 4)) << ", Format = " << (Format == DWARF32 ? "DWARF32" : "DWARF64") << ", Version = " << Version << "\n"; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index d54275d302f3..2d456b4b5303 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -517,7 +517,9 @@ parseDWARF64StringOffsetsTableHeader(DWARFDataExtractor &DA, uint32_t Offset) { uint64_t Size = DA.getU64(&Offset); uint8_t Version = DA.getU16(&Offset); (void)DA.getU16(&Offset); // padding - return StrOffsetsContributionDescriptor(Offset, Size, Version, DWARF64); + // The encoded length includes the 2-byte version field and the 2-byte + // padding, so we need to subtract them out when we populate the descriptor. + return StrOffsetsContributionDescriptor(Offset, Size - 4, Version, DWARF64); //return Optional(Descriptor); } @@ -532,7 +534,10 @@ parseDWARF32StringOffsetsTableHeader(DWARFDataExtractor &DA, uint32_t Offset) { return Optional(); uint8_t Version = DA.getU16(&Offset); (void)DA.getU16(&Offset); // padding - return StrOffsetsContributionDescriptor(Offset, ContributionSize, Version, DWARF32); + // The encoded length includes the 2-byte version field and the 2-byte + // padding, so we need to subtract them out when we populate the descriptor. + return StrOffsetsContributionDescriptor(Offset, ContributionSize - 4, Version, + DWARF32); //return Optional(Descriptor); } diff --git a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s index 0ff6fdbb0aa7..07c7cfde13f0 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-3.s @@ -71,7 +71,7 @@ CU1_5_end: .long str_CU1_dir .debug_str_offsets_segment0_end: # CU2's contribution - .long .debug_str_offsets_segment1_end-.debug_str_offsets_base1 + .long .debug_str_offsets_segment1_end-.debug_str_offsets_base1+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base1: @@ -80,7 +80,7 @@ CU1_5_end: .long str_CU2_dir .debug_str_offsets_segment1_end: # The TU's contribution - .long .debug_str_offsets_segment2_end-.debug_str_offsets_base2 + .long .debug_str_offsets_segment2_end-.debug_str_offsets_base2+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base2: diff --git a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s index 36ac7124a9f0..d4d56577206c 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-4.s @@ -42,7 +42,7 @@ CU1_5_end: # CU1's contribution # The length is not a multiple of 4. Check that we don't read off the # end. - .long .debug_str_offsets_segment0_end-.debug_str_offsets_base0 + .long .debug_str_offsets_segment0_end-.debug_str_offsets_base0+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base0: diff --git a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s index 28c4a418d125..0a35c5e93db3 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-invalid-6.s @@ -70,7 +70,7 @@ CU2_5_end: .section .debug_str_offsets,"",@progbits # CU1's contribution - .long .debug_str_offsets_segment1_end-.debug_str_offsets_base0 + .long .debug_str_offsets_segment1_end-.debug_str_offsets_base0+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base0: @@ -80,7 +80,7 @@ CU2_5_end: .debug_str_offsets_segment0_end: # CU2's contribution # Overlapping with CU1's contribution - .long .debug_str_offsets_segment1_end-.debug_str_offsets_base1 + .long .debug_str_offsets_segment1_end-.debug_str_offsets_base1+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base1: diff --git a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-macho.s b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-macho.s index f8f48ea13882..b2b5104862e7 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-macho.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets-macho.s @@ -31,7 +31,7 @@ str_Variable3: .section __DWARF,__debug_str_offs,regular,debug Ldebug_str_offsets: - .long Ldebug_str_offsets_segment0_end-Ldebug_str_offsets_base0 + .long Ldebug_str_offsets_segment0_end-Ldebug_str_offsets_base0+4 .short 5 # DWARF version .short 0 # Padding Ldebug_str_offsets_base0: @@ -47,7 +47,7 @@ Ldebug_str_offsets_segment0_end: .long 0 # CU2's contribution (DWARF64 format) .long 0xffffffff - .quad Ldebug_str_offsets_segment1_end-Ldebug_str_offsets_base1 + .quad Ldebug_str_offsets_segment1_end-Ldebug_str_offsets_base1+4 .short 5 # DWARF version .short 0 # Padding Ldebug_str_offsets_base1: @@ -56,7 +56,7 @@ Ldebug_str_offsets_base1: .quad str_CU2_dir Ldebug_str_offsets_segment1_end: # The TU's contribution - .long Ldebug_str_offsets_segment2_end-Ldebug_str_offsets_base2 + .long Ldebug_str_offsets_segment2_end-Ldebug_str_offsets_base2+4 .short 5 # DWARF version .short 0 # Padding Ldebug_str_offsets_base2: @@ -250,7 +250,7 @@ TU_5_end: # # The .debug_str_offsets section # COMMON: .debug_str_offsets contents: -# COMMON-NEXT: 0x00000000: Contribution size = 28, Format = DWARF32, Version = 5 +# COMMON-NEXT: 0x00000000: Contribution size = 32, Format = DWARF32, Version = 5 # COMMON-NEXT: 0x00000008: 00000000 "Handmade DWARF producer" # COMMON-NEXT: 0x0000000c: 00000018 "Compile_Unit_1" # COMMON-NEXT: 0x00000010: 00000027 "/home/test/CU1" @@ -259,10 +259,10 @@ TU_5_end: # COMMON-NEXT: 0x0000001c: 00000075 "MyVar2" # COMMON-NEXT: 0x00000020: 0000007c "MyVar3" # COMMON-NEXT: 0x00000024: Gap, length = 4 -# COMMON-NEXT: 0x00000028: Contribution size = 24, Format = DWARF64, Version = 5 +# COMMON-NEXT: 0x00000028: Contribution size = 28, Format = DWARF64, Version = 5 # COMMON-NEXT: 0x00000038: 00000000 "Handmade DWARF producer" # COMMON-NEXT: 0x00000040: 00000036 "Compile_Unit_2" # COMMON-NEXT: 0x00000048: 00000045 "/home/test/CU2" -# COMMON-NEXT: 0x00000050: Contribution size = 8, Format = DWARF32, Version = 5 +# COMMON-NEXT: 0x00000050: Contribution size = 12, Format = DWARF32, Version = 5 # COMMON-NEXT: 0x00000058: 00000054 "Type_Unit" # COMMON-NEXT: 0x0000005c: 0000005e "MyStruct" diff --git a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets.s b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets.s index 363775a59f50..749f4f17bb40 100644 --- a/llvm/test/DebugInfo/X86/dwarfdump-str-offsets.s +++ b/llvm/test/DebugInfo/X86/dwarfdump-str-offsets.s @@ -32,7 +32,7 @@ str_Variable3: # Every unit contributes to the string_offsets table. .section .debug_str_offsets,"",@progbits # CU1's contribution - .long .debug_str_offsets_segment0_end-.debug_str_offsets_base0 + .long .debug_str_offsets_segment0_end-.debug_str_offsets_base0+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base0: @@ -48,7 +48,7 @@ str_Variable3: .long 0 # CU2's contribution in DWARF64 format .long 0xffffffff - .quad .debug_str_offsets_segment1_end-.debug_str_offsets_base1 + .quad .debug_str_offsets_segment1_end-.debug_str_offsets_base1+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base1: @@ -57,7 +57,7 @@ str_Variable3: .quad str_CU2_dir .debug_str_offsets_segment1_end: # The TU's contribution - .long .debug_str_offsets_segment2_end-.debug_str_offsets_base2 + .long .debug_str_offsets_segment2_end-.debug_str_offsets_base2+4 .short 5 # DWARF version .short 0 # Padding .debug_str_offsets_base2: @@ -79,7 +79,7 @@ dwo_str_TU_5_type: .section .debug_str_offsets.dwo,"",@progbits # One contribution only in a .dwo file - .long .debug_dwo_str_offsets_segment0_end-.debug_dwo_str_offsets_base0 + .long .debug_dwo_str_offsets_segment0_end-.debug_dwo_str_offsets_base0+4 .short 5 # DWARF version .short 0 # Padding .debug_dwo_str_offsets_base0: @@ -358,7 +358,7 @@ TU_split_5_end: # # The .debug_str_offsets section # COMMON: .debug_str_offsets contents: -# COMMON-NEXT: 0x00000000: Contribution size = 28, Format = DWARF32, Version = 5 +# COMMON-NEXT: 0x00000000: Contribution size = 32, Format = DWARF32, Version = 5 # COMMON-NEXT: 0x00000008: 00000000 "Handmade DWARF producer" # COMMON-NEXT: 0x0000000c: 00000018 "Compile_Unit_1" # COMMON-NEXT: 0x00000010: 00000027 "/home/test/CU1" @@ -367,16 +367,16 @@ TU_split_5_end: # COMMON-NEXT: 0x0000001c: 00000075 "MyVar2" # COMMON-NEXT: 0x00000020: 0000007c "MyVar3" # COMMON-NEXT: Gap, length = 4 -# COMMON-NEXT: 0x00000028: Contribution size = 24, Format = DWARF64, Version = 5 +# COMMON-NEXT: 0x00000028: Contribution size = 28, Format = DWARF64, Version = 5 # COMMON-NEXT: 0x00000038: 00000000 "Handmade DWARF producer" # COMMON-NEXT: 0x00000040: 00000036 "Compile_Unit_2" # COMMON-NEXT: 0x00000048: 00000045 "/home/test/CU2" -# COMMON-NEXT: 0x00000050: Contribution size = 8, Format = DWARF32, Version = 5 +# COMMON-NEXT: 0x00000050: Contribution size = 12, Format = DWARF32, Version = 5 # COMMON-NEXT: 0x00000058: 00000054 "Type_Unit" # COMMON-NEXT: 0x0000005c: 0000005e "MyStruct" # # SPLIT: .debug_str_offsets.dwo contents: -# SPLIT-NEXT: 0x00000000: Contribution size = 20, Format = DWARF32, Version = 5 +# SPLIT-NEXT: 0x00000000: Contribution size = 24, Format = DWARF32, Version = 5 # SPLIT-NEXT: 0x00000008: 00000000 "Handmade split DWARF producer" # SPLIT-NEXT: 0x0000000c: 0000001e "V5_split_compile_unit" # SPLIT-NEXT: 0x00000010: 00000034 "/home/test/splitCU" diff --git a/llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll b/llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll index 49006876b7d1..2f479fa5af07 100644 --- a/llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll +++ b/llvm/test/DebugInfo/X86/string-offsets-multiple-cus.ll @@ -94,7 +94,7 @@ ; Check the .debug_str_offsets section header and make sure the referenced string ; has the correct offset. ; BOTH: .debug_str_offsets contents: -; BOTH-NEXT: 0x00000000: Contribution size = 80, Format = DWARF32, Version = 5 +; BOTH-NEXT: 0x00000000: Contribution size = 84, Format = DWARF32, Version = 5 ; BOTH-NEXT: 0x[[CU1_STROFF]]: ; BOTH-NEXT: {{.*:}} ; BOTH-NEXT: {{.*:}} diff --git a/llvm/test/DebugInfo/X86/string-offsets-table.ll b/llvm/test/DebugInfo/X86/string-offsets-table.ll index e2b856f3baf6..2234853566b9 100644 --- a/llvm/test/DebugInfo/X86/string-offsets-table.ll +++ b/llvm/test/DebugInfo/X86/string-offsets-table.ll @@ -44,7 +44,7 @@ ; Verify that the .debug_str_offsets section is there and that it starts ; with an 8-byte header, followed by offsets into the .debug_str section. ; MONOLITHIC: .debug_str_offsets contents: -; MONOLITHIC-NEXT: Contribution size = 32, Format = DWARF32, Version = 5 +; MONOLITHIC-NEXT: Contribution size = 36, Format = DWARF32, Version = 5 ; MONOLITHIC-NEXT: 0x00000008: 00000000 ; MONOLITHIC-NEXT: 0x0000000c: [[STRING2]] ; MONOLITHIC-NEXT: 0x00000010: [[STRING3]] @@ -91,11 +91,11 @@ ; Check the string offsets sections in both the main and the .dwo files and ; verify that the extracted string offsets are referenced correctly. ; SPLIT: .debug_str_offsets contents: -; SPLIT-NEXT: 0x00000000: Contribution size = 8, Format = DWARF32, Version = 5 +; SPLIT-NEXT: 0x00000000: Contribution size = 12, Format = DWARF32, Version = 5 ; SPLIT-NEXT: 0x00000008: 00000000{{.*}} ; SPLIT-NEXT: 0x0000000c: [[STRING2SPLIT]] ; SPLIT: .debug_str_offsets.dwo contents: -; SPLIT-NEXT: 0x00000000: Contribution size = 32, Format = DWARF32, Version = 5 +; SPLIT-NEXT: 0x00000000: Contribution size = 36, Format = DWARF32, Version = 5 ; SPLIT-NEXT: 0x00000008: 00000000{{.*}} ; SPLIT-NEXT: 0x0000000c: [[STRING2DWO]]{{.*}} ; SPLIT-NEXT: 0x00000010: [[STRING3DWO]]