Index: dwp-string-offsets-invalid-1.s =================================================================== --- dwp-string-offsets-invalid-1.s +++ dwp-string-offsets-invalid-1.s @@ -0,0 +1,62 @@ +# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.dwo +# RUN: not llvm-dwp %t.dwo -o %t.dwp |& FileCheck %s + +# Test object to verify that dwp handles invalid DWARF v5 contributions +# to the string offsets table. We have one simple compile unit. +# + .section .debug_str.dwo,"MS",@progbits,1 +str_producer: + .asciz "Handmade DWARF producer" +str_CU1: + .asciz "Compile_Unit_1" +str_CU1_dir: + .asciz "/home/test/CU1" + + .section .debug_str_offsets.dwo,"",@progbits +# An invalid DWARF v5 contribution to the .debug_str_offsets.dwo section. +.debug_str_offsets_object_file1_start: + .long 500 # Invalid length + .short 5 # DWARF version + .short 0 # Padding +.debug_str_offsets_base_1: + .long str_producer-.debug_str.dwo + .long str_CU1-.debug_str.dwo + .long str_CU1_dir-.debug_str.dwo +.debug_str_offsets_object_file1_end: + +# A simple abbrev section. + .section .debug_abbrev.dwo,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .byte 0x25 # DW_AT_producer + .byte 0x1a # DW_FORM_strx + .byte 0x03 # DW_AT_name + .byte 0x1a # DW_FORM_strx + .byte 0x03 # DW_AT_name + .byte 0x1a # DW_FORM_strx + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) +abbrev_end: + + .section .debug_info.dwo,"",@progbits + +# DWARF v5 CU header. +CU1_5_start: + .long CU1_5_end-CU1_5_version # Length of Unit +CU1_5_version: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev.dwo # Offset Into Abbrev. Section +# The compile-unit DIE, which has a DW_AT_producer, DW_AT_name +# and DW_AT_compdir. + .byte 1 # Abbreviation code + .byte 0 # The index of the producer string + .byte 1 # The index of the CU name string + .byte 2 # The index of the comp dir string + .byte 0 # NULL +CU1_5_end: + +# CHECK: String offsets table contribution has invalid length Index: dwp-string-offsets-invalid-2.s =================================================================== --- dwp-string-offsets-invalid-2.s +++ dwp-string-offsets-invalid-2.s @@ -0,0 +1,62 @@ +# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.dwo +# RUN: not llvm-dwp %t.dwo -o %t.dwp |& FileCheck %s + +# Test object to verify that dwp handles invalid DWARF v5 contributions +# to the string offsets table. We have one simple compile unit. +# + .section .debug_str.dwo,"MS",@progbits,1 +str_producer: + .asciz "Handmade DWARF producer" +str_CU1: + .asciz "Compile_Unit_1" +str_CU1_dir: + .asciz "/home/test/CU1" + + .section .debug_str_offsets.dwo,"",@progbits +# An invalid DWARF v5 contribution to the .debug_str_offsets.dwo section. +.debug_str_offsets_object_file1_start: + .long 0xfffffff4 # Invalid length + .short 5 # DWARF version + .short 0 # Padding +.debug_str_offsets_base_1: + .long str_producer-.debug_str.dwo + .long str_CU1-.debug_str.dwo + .long str_CU1_dir-.debug_str.dwo +.debug_str_offsets_object_file1_end: + +# A simple abbrev section. + .section .debug_abbrev.dwo,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .byte 0x25 # DW_AT_producer + .byte 0x1a # DW_FORM_strx + .byte 0x03 # DW_AT_name + .byte 0x1a # DW_FORM_strx + .byte 0x03 # DW_AT_name + .byte 0x1a # DW_FORM_strx + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) +abbrev_end: + + .section .debug_info.dwo,"",@progbits + +# DWARF v5 CU header. +CU1_5_start: + .long CU1_5_end-CU1_5_version # Length of Unit +CU1_5_version: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev.dwo # Offset Into Abbrev. Section +# The compile-unit DIE, which has a DW_AT_producer, DW_AT_name +# and DW_AT_compdir. + .byte 1 # Abbreviation code + .byte 0 # The index of the producer string + .byte 1 # The index of the CU name string + .byte 2 # The index of the comp dir string + .byte 0 # NULL +CU1_5_end: + +# CHECK: Invalid string offsets table contribution Index: dwp-string-offsets-invalid-3.s =================================================================== --- dwp-string-offsets-invalid-3.s +++ dwp-string-offsets-invalid-3.s @@ -0,0 +1,57 @@ +# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.dwo +# RUN: not llvm-dwp %t.dwo -o %t.dwp |& FileCheck %s + +# Test object to verify that dwp handles invalid DWARF v5 contributions +# to the string offsets table. We have one simple compile unit. +# + .section .debug_str.dwo,"MS",@progbits,1 +str_producer: + .asciz "Handmade DWARF producer" +str_CU1: + .asciz "Compile_Unit_1" +str_CU1_dir: + .asciz "/home/test/CU1" + + .section .debug_str_offsets.dwo,"",@progbits +# An invalid DWARF v5 contribution to the .debug_str_offsets.dwo section. +# The section is too short to contain a valid header. +.debug_str_offsets_object_file1_start: + .long 0 +.debug_str_offsets_object_file1_end: + +# A simple abbrev section. + .section .debug_abbrev.dwo,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .byte 0x25 # DW_AT_producer + .byte 0x1a # DW_FORM_strx + .byte 0x03 # DW_AT_name + .byte 0x1a # DW_FORM_strx + .byte 0x03 # DW_AT_name + .byte 0x1a # DW_FORM_strx + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) +abbrev_end: + + .section .debug_info.dwo,"",@progbits + +# DWARF v5 CU header. +CU1_5_start: + .long CU1_5_end-CU1_5_version # Length of Unit +CU1_5_version: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev.dwo # Offset Into Abbrev. Section +# The compile-unit DIE, which has a DW_AT_producer, DW_AT_name +# and DW_AT_compdir. + .byte 1 # Abbreviation code + .byte 0 # The index of the producer string + .byte 1 # The index of the CU name string + .byte 2 # The index of the comp dir string + .byte 0 # NULL +CU1_5_end: + +# CHECK: Invalid string offsets table contribution Index: dwp-string-offsets-invalid-4.s =================================================================== --- dwp-string-offsets-invalid-4.s +++ dwp-string-offsets-invalid-4.s @@ -0,0 +1,38 @@ +# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.dwo +# RUN: not llvm-dwp %t.dwo -o %t.dwp |& FileCheck %s + +# Test object to verify that dwp rejects input files that use DW_FORM_strp. +# + .section .debug_str.dwo,"MS",@progbits,1 +str_name: + .asciz "CU1" + +# A simple abbrev section. + .section .debug_abbrev.dwo,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .byte 0x03 # DW_AT_name + .byte 0x0e # DW_FORM_strp + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) +abbrev_end: + + .section .debug_info.dwo,"",@progbits + +# DWARF v5 CU header. +CU1_5_start: + .long CU1_5_end-CU1_5_version # Length of Unit +CU1_5_version: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev.dwo # Offset Into Abbrev. Section +# The rudimentary compile-unit DIE, which has a DW_AT_name. + .byte 1 # Abbreviation code + .long str_name-.debug_str.dwo # The offset of the name string + .byte 0 # NULL +CU1_5_end: + +# CHECK: DW_FORM_strp is not supported in dwp files Index: invalid_string_form.test =================================================================== --- invalid_string_form.test +++ invalid_string_form.test @@ -1,3 +1,3 @@ RUN: not llvm-dwp %p/../Inputs/invalid_string_form.dwo -o %t 2>&1 | FileCheck %s -CHECK: error: string field encoded without DW_FORM_string or DW_FORM_GNU_str_index +CHECK: error: string field encoded with unsupported form Index: string_offsets_mixed.s =================================================================== --- string_offsets_mixed.s +++ string_offsets_mixed.s @@ -0,0 +1,373 @@ +# Produce a dwp file from a dwo and a dwp file. This ensures that both relevant +# code paths in llvm-dwp's write() are exercised. + +# RUN: llvm-mc -filetype=obj %p/../Inputs/string_offsets/c.s -o %tc.dwo +# RUN: llvm-mc %s -filetype=obj -o %tmixed.dwp +# RUN: llvm-dwp %tmixed.dwp %tc.dwo -o %t2.dwp +# RUN: llvm-dwarfdump -v %t2.dwp | FileCheck %s + +# The dwp input file (this file) has been hand constructed and contains one v5 +# compile unit, one v4 compile unit, one v5 type unit and one v4 type unit. +# +# The compile and type units have been generated from the following 2 source files by +# compiling them with clang -S -gsplit-dwarf -gdwarf-5 -fdebug-types-section for file 1 +# and clang -S -gsplit-dwarf -gdwarf-4 -fdebug-tpes-section for file 2. +# +# file1: +# enum E1 {a}; +# E1 glob1; +# +# file2: +# enum E2 {d}; +# E2 glob2; +# +# The following sections were extracted and the compile unit and type unit DIEs were +# reduced to a minimum: +# .debug_str.dwo +# .debug_abbrev.dwo +# .debug_str_offsets.dwo +# .debug_info.dwo +# .debug_types.dwo +# +# The order of contributions to the string offsets table is different from the order in +# which the compile units appear in the CU index table. The second compile unit's +# contribution precedes the first unit's contribution. +# +# The rationale for this is the following: The initial parsing of CUs in the input file +# occurs in the order in which the CUs appear in the index table. It is possible that +# this order does not correspond to the order in which contributions to the string +# offsets table are laid out. +# With DWARF v5 we need to match up CUs with their corresponding string offsets table +# contributions (in order to properly process the contribution headers) and hence need +# to remap and write them unit-by-unit to the output file. The pre-v5 implementation +# did not need to worry about this because it could just rewrite the input file's string +# offsets table in one chunk. The test therefore ensures that llvm-dwp rewrites the +# string offsets table contributions in the order they appear in the input file section, +# and not in the order in which their corresponding CUs appear in the index table. +# +# The index sections were constructed by hand according to the DWARF v5 standard. + +# We check that the final DWP contains 2 v5 CUs with a v4 CU sandwiched between +# them. We make sure that at least one string from each CU and TU is displayed correctly +# and that the string offsets table looks correct. + +# CHECK: .debug_info.dwo contents: +# CHECK-NEXT: Compile Unit:{{.*}}version = 0x0005 +# CHECK-NOT: Compile Unit +# CHECK: DW_AT_name [DW_FORM_strx1] ( indexed{{.*}}string = "a.cpp") +# +# The second compile unit. +# CHECK: Compile Unit:{{.*}}version = 0x0004 +# CHECK-NOT: Compile Unit +# CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed{{.*}}string = "b.cpp") +# +# The third compile unit. +# CHECK: Compile Unit:{{.*}}version = 0x0005 +# CHECK-NOT: Compile Unit +# CHECK: DW_AT_name [DW_FORM_strx1] ( indexed{{.*}}string = "E3") +# +# The first type unit. +# CHECK: .debug_types.dwo contents: +# CHECK: Type Unit:{{.*}}version = 0x0005 +# CHECK-NOT: Type Unit +# CHECK: DW_AT_name [DW_FORM_strx1] ( indexed{{.*}}string = "a") +# +# The second type unit. +# CHECK: Type Unit:{{.*}}version = 0x0004 +# CHECK-NOT: Type Unit +# CHECK: DW_AT_name [DW_FORM_GNU_str_index] ( indexed{{.*}}string = "d") +# +# We expect the first contribution to the string offsets section to be from the +# second compile unit (and hence of version 4). +# CHECK: .debug_str_offsets.dwo contents: +# CHECK-NEXT: 0x00000000: Contribution size = 20, Format = DWARF32, Version = 4 +# CHECK-NEXT: 0x00000000:{{.*}}b.dwo" +# +# We expect the secont contribution to the string offsets section to be from the +# first compile unit, which has version 5. +# CHECK: 0x[[SECONDCONTRIBOFFSET:[0-9a-f]*]]: Contribution size = 20, Format = DWARF32, Version = 5 +# CHECK-NEXT: 0x{{.*}}a.dwo" +# +# Check that the third contribution is of version 5 and contains the string "c.dwo" +# CHECK: Contribution size = 16, Format = DWARF32, Version = 5 +# CHECK-NEXT: {{.*}}c.dwo" + + .section .debug_str.dwo,"MS",@progbits,1 +str_dwo_name1: + .asciz "/test/a.dwo" +str_dwo_name2: + .asciz "/test/b.dwo" +str_CU1: + .asciz "a.cpp" +str_CU2: + .asciz "b.cpp" +str_TU1: + .asciz "Type_Unit_1" +str_TU2: + .asciz "Type_Unit_2" +str_enum1: + .asciz "E1" +str_enum2: + .asciz "E2" +str_enumerator1: + .asciz "a" +str_enumerator2: + .asciz "d" + + .section .debug_str_offsets.dwo,"",@progbits +# Object files 2's portion of the .debug_str_offsets.dwo section. +# This is a pre-DWARF v5 string offsets table contribution (i.e. no header). +.debug_str_offsets_object_file2_start: +.debug_str_offsets_base_2: + .long str_dwo_name2-.debug_str.dwo + .long str_CU2-.debug_str.dwo + .long str_TU2-.debug_str.dwo + .long str_enum2-.debug_str.dwo + .long str_enumerator2-.debug_str.dwo +.debug_str_offsets_object_file2_end: + +# Object files 1's portion of the .debug_str_offsets.dwo section. +# CU1 and TU1 share a contribution to the string offsets table. +.debug_str_offsets_object_file1_start: + .long .debug_str_offsets_object_file1_end-.debug_str_offsets_base_1 + .short 5 # DWARF version + .short 0 # Padding +.debug_str_offsets_base_1: + .long str_dwo_name1-.debug_str.dwo + .long str_CU1-.debug_str.dwo + .long str_TU1-.debug_str.dwo + .long str_enum1-.debug_str.dwo + .long str_enumerator1-.debug_str.dwo +.debug_str_offsets_object_file1_end: + +# Abbrevs are shared for all compile and type units of the same version. + .section .debug_abbrev.dwo,"",@progbits +V5_abbrev_start: + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .short 0x42b0 # DW_AT_GNU_dwo_name + .byte 0x25 # DW_FORM_strx1 + .byte 0x03 # DW_AT_name + .byte 0x25 # DW_FORM_strx1 + .short 0x42b1 # DW_AT_GNU_dwo_id + .byte 0x07 # DW_FORM_data8 + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x02 # Abbrev code + .byte 0x41 # DW_TAG_type_unit + .byte 0x01 # DW_CHILDREN_yes + .byte 0x03 # DW_AT_name + .byte 0x25 # DW_FORM_strx1 + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x03 # Abbrev code + .byte 0x04 # DW_TAG_enumeration_type + .byte 0x01 # DW_CHILDREN_yes + .byte 0x03 # DW_AT_name + .byte 0x25 # DW_FORM_strx1 + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x04 # Abbrev code + .byte 0x28 # DW_TAG_enumerator + .byte 0x00 # DW_CHILDREN_no + .byte 0x03 # DW_AT_name + .byte 0x25 # DW_FORM_strx1 + .byte 0x1c # DW_AT_const_value + .byte 0x0d # DW_FORM_sdata + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) +V5_abbrev_end: +V4_abbrev_start: + .byte 0x01 # Abbrev code + .byte 0x11 # DW_TAG_compile_unit + .byte 0x00 # DW_CHILDREN_no + .short 0x42b0 # DW_AT_GNU_dwo_name + .short 0x3e82 # DW_FORM_GNU_str_index + .byte 0x03 # DW_AT_name + .short 0x3e82 # DW_FORM_GNU_str_index + .short 0x42b1 # DW_AT_GNU_dwo_id + .byte 0x07 # DW_FORM_data8 + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x02 # Abbrev code + .byte 0x41 # DW_TAG_type_unit + .byte 0x01 # DW_CHILDREN_yes + .byte 0x03 # DW_AT_name + .short 0x3e82 # DW_FORM_GNU_str_index + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x03 # Abbrev code + .byte 0x04 # DW_TAG_enumeration_type + .byte 0x01 # DW_CHILDREN_yes + .byte 0x03 # DW_AT_name + .short 0x3e82 # DW_FORM_GNU_str_index + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x04 # Abbrev code + .byte 0x28 # DW_TAG_enumerator + .byte 0x00 # DW_CHILDREN_no + .byte 0x03 # DW_AT_name + .short 0x3e82 # DW_FORM_GNU_str_index + .byte 0x1c # DW_AT_const_value + .byte 0x0d # DW_FORM_sdata + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) +V4_abbrev_end: +abbrev_end: + + .section .debug_info.dwo,"",@progbits +# DWARF v5 CU header. +CU1_5_start: + .long CU1_5_end-CU1_5_version # Length of Unit +CU1_5_version: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long 0 # Offset Into Abbrev. Contribution +# The compile-unit DIE, which has a DW_AT_GNU_dwo_name, DW_AT_name +# and DW_AT_GNU_dwo_id. + .byte 1 # Abbreviation code + .byte 0 # The index of the dwo name string + .byte 1 # The index of the CU name string + .quad 0xaa00bb00cc00dd00 # dwo id + .byte 0 # NULL +CU1_5_end: + +# DWARF v4 CU header. +CU2_4_start: + .long CU2_4_end-CU2_4_version # Length of Unit +CU2_4_version: + .short 4 # DWARF version number + .long 0 # Offset Into Abbrev. Contribution + .byte 8 # Address Size (in bytes) +# The compile-unit DIE, which has a DW_AT_GNU_dwo_name, DW_AT_name +# and DW_AT_GNU_dwo_id. + .byte 1 # Abbreviation code + .byte 0 # The index of the dwo name string + .byte 1 # The index of the CU name string + .quad 0xcc00dd00ee00ff00 # dwo id + .byte 0 # NULL +CU2_4_end: + + .section .debug_types.dwo,"",@progbits +# DWARF v5 Type unit header. +TU1_5_start: + .long TU1_5_end-TU1_5_version # Length of Unit +TU1_5_version: + .short 5 # DWARF version number + .byte 2 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long 0 # Offset Into Abbrev. Section + .quad 0x0011223344556677 # Type Signature + .long TU1_5_type-TU1_5_start # Type offset +# The type-unit DIE, which has a name. + .byte 2 # Abbreviation code + .byte 2 # Index of the unit type name string +# The enumeration type DIE, which has a name. +TU1_5_type: + .byte 3 # Abbreviation code + .byte 3 # Index of the enumeration type name string +# One enumerator, which has a name. + .byte 4 # Abbreviation code + .byte 4 # Index of the enumerator string + .byte 0 # NULL + .byte 0 # NULL +TU1_5_end: + +# DWARF v4 Type unit header. +TU2_4_start: + .long TU2_4_end-TU2_4_version # Length of Unit +TU2_4_version: + .short 4 # DWARF version number + .long 0 # Offset Into Abbrev. Section + .byte 8 # Address Size (in bytes) + .quad 0x00aabbccddeeff99 # Type Signature + .long TU2_4_type-TU2_4_start # Type offset +# The type-unit DIE, which has a name. + .byte 2 # Abbreviation code + .byte 2 # Index of the unit type name string +# The enumeration type DIE, which has a name. +TU2_4_type: + .byte 3 # Abbreviation code + .byte 3 # Index of the enumeration type name string +# One enumerator, which has a name. + .byte 4 # Abbreviation code + .byte 4 # Index of the enumerator string + .byte 0 # NULL + .byte 0 # NULL +TU2_4_end: + + .section .debug_cu_index,"",@progbits + # The index header + .long 2 # Version + .long 3 # Columns of contribution matrix + .long 2 # number of units + .long 2 # number of hash buckets in table + + # The signatures for both CUs. + .quad 0xddeeaaddbbaabbee # signature 1 + .quad 0xff00ffeeffaaff00 # signature 2 + # The indexes for both CUs. + .long 1 # index 1 + .long 2 # index 2 + # The sections to which all CUs contribute. + .long 1 # DW_SECT_INFO + .long 3 # DW_SECT_ABBREV + .long 6 # DW_SECT_STR_OFFSETS + + # The starting offsets of all CU's contributions to info, + # abbrev and string offsets table. + .long CU1_5_start-.debug_info.dwo + .long V5_abbrev_start-.debug_abbrev.dwo + .long .debug_str_offsets_object_file1_start-.debug_str_offsets.dwo + .long CU2_4_start-.debug_info.dwo + .long V4_abbrev_start-.debug_abbrev.dwo + .long .debug_str_offsets_object_file2_start-.debug_str_offsets.dwo + + # The lengths of all CU's contributions to info, abbrev and + # string offsets table. + .long CU1_5_end-CU1_5_start + .long V5_abbrev_end-V5_abbrev_start + .long .debug_str_offsets_object_file1_end-.debug_str_offsets_object_file1_start + .long CU2_4_end-CU2_4_start + .long V4_abbrev_end-V4_abbrev_start + .long .debug_str_offsets_object_file2_end-.debug_str_offsets_object_file2_start + + .section .debug_tu_index,"",@progbits + # The index header + .long 2 # Version + .long 3 # Columns of contribution matrix + .long 2 # number of units + .long 2 # number of hash buckets in table + + # The signatures for both TUs. + .quad 0xeeaaddbbaabbeedd # signature 1 + .quad 0x00ffeeffaaff00ff # signature 2 + # The indexes for both TUs. + .long 1 # index 1 + .long 2 # index 2 + # The sections to which both TUs contribute. + .long 2 # DW_SECT_TYPES + .long 3 # DW_SECT_ABBREV + .long 6 # DW_SECT_STR_OFFSETS + + # The starting offsets of both TU's contributions to info, + # abbrev and string offsets table. + .long TU1_5_start-.debug_types.dwo + .long V5_abbrev_start-.debug_abbrev.dwo + .long .debug_str_offsets_object_file1_start-.debug_str_offsets.dwo + .long TU2_4_start-.debug_types.dwo + .long V4_abbrev_start-.debug_abbrev.dwo + .long .debug_str_offsets_object_file2_start-.debug_str_offsets.dwo + + # The lengths of both TU's contributions to info, abbrev and + # string offsets table. + .long TU1_5_end-TU1_5_start + .long V5_abbrev_end-V5_abbrev_start + .long .debug_str_offsets_object_file1_end-.debug_str_offsets_object_file1_start + .long TU2_4_end-TU2_4_start + .long V4_abbrev_end-V4_abbrev_start + .long .debug_str_offsets_object_file2_end-.debug_str_offsets_object_file2_start