[DWARFFormValue] Don't consider DW_FORM_data4/8 to be section offsets.
authorJonas Devlieghere <jonas@devlieghere.com>
Tue, 5 Mar 2019 23:47:22 +0000 (23:47 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Tue, 5 Mar 2019 23:47:22 +0000 (23:47 +0000)
When dumping ToT clan's debug info with dwarfdump, we were seeing an
error saying that that the location list overflows the debug_loc
section. After reducing the testcase we figured out that we were
interpreting the DW_FORM_data4 as a section offset.

In DWARF3 DW_FORM_data4 and DW_FORM_data8 served also as a section
offset. Until now we didn't check check for the DWARF version, because
some producers (read old versions of clang) were still emitting this.
The relevant code/comment was added in 2013, and I believe it's now
reasonable to start checking the version.

The FormValue class is a little bit of a mess because it cashes the
DWARF unit and context when it extracted the value itself. Several
methods of the class rely on it being present, or return an Optional for
the code path that needs it. At the same time the FormValue class also
used in places where there's no DWARF unit.

For this patch I went with the least invasive change: checking the
version from the CU when it's available. If it's not (because the form
value was created from a value directly) we default to the old behavior.

Differential revision: https://reviews.llvm.org/D58698

llvm-svn: 355456

llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp
llvm/test/tools/llvm-dwarfdump/X86/formclass2.s [new file with mode: 0644]
llvm/test/tools/llvm-dwarfdump/X86/formclass4.s [new file with mode: 0644]

index 7ddc882..4129593 100644 (file)
@@ -220,13 +220,17 @@ bool DWARFFormValue::isFormClass(DWARFFormValue::FormClass FC) const {
   default:
     break;
   }
-  // In DWARF3 DW_FORM_data4 and DW_FORM_data8 served also as a section offset.
-  // Don't check for DWARF version here, as some producers may still do this
-  // by mistake. Also accept DW_FORM_[line_]strp since these are
-  // .debug_[line_]str section offsets.
-  return (Form == DW_FORM_data4 || Form == DW_FORM_data8 ||
-          Form == DW_FORM_strp || Form == DW_FORM_line_strp) &&
-         FC == FC_SectionOffset;
+
+  if (FC == FC_SectionOffset) {
+    if (Form == DW_FORM_strp || Form == DW_FORM_line_strp)
+      return true;
+    // In DWARF3 DW_FORM_data4 and DW_FORM_data8 served also as a section
+    // offset. If we don't have a DWARFUnit, default to the old behavior.
+    if (Form == DW_FORM_data4 || Form == DW_FORM_data8)
+      return !U || U->getVersion() <= 3;
+  }
+
+  return false;
 }
 
 bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data,
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/formclass2.s b/llvm/test/tools/llvm-dwarfdump/X86/formclass2.s
new file mode 100644 (file)
index 0000000..58945d9
--- /dev/null
@@ -0,0 +1,315 @@
+# Source:
+#   struct e {
+#     char f[16384];
+#     char g;
+#   };
+#   e foo() {
+#     auto E = new e;
+#     return *E;
+#   }
+# Compile with:
+#   clang -O2 -gdwarf-2 -S a.cpp -o a2.s
+
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o %t.o
+# RUN: llvm-dwarfdump -debug-info -name g %t.o | FileCheck %s
+
+# CHECK: DW_TAG_member
+# CHECK: DW_AT_name ("g")
+# CHECK: DW_AT_data_member_location (DW_OP_plus_uconst 0x4000)
+
+       .section        __TEXT,__text,regular,pure_instructions
+       .macosx_version_min 10, 14
+       .globl  __Z3foov                ## -- Begin function _Z3foov
+       .p2align        4, 0x90
+__Z3foov:                               ## @_Z3foov
+Lfunc_begin0:
+       .file   1 "/private/tmp" "a.cpp"
+       .loc    1 5 0                   ## a.cpp:5:0
+       .cfi_startproc
+## %bb.0:                               ## %entry
+       pushq   %rbp
+       .cfi_def_cfa_offset 16
+       .cfi_offset %rbp, -16
+       movq    %rsp, %rbp
+       .cfi_def_cfa_register %rbp
+       pushq   %rbx
+       pushq   %rax
+       .cfi_offset %rbx, -24
+       movq    %rdi, %rbx
+Ltmp0:
+       .loc    1 6 12 prologue_end     ## a.cpp:6:12
+       movl    $16385, %edi            ## imm = 0x4001
+       callq   __Znwm
+Ltmp1:
+       ##DEBUG_VALUE: foo:E <- $rax
+       .loc    1 7 10                  ## a.cpp:7:10
+       movl    $16385, %edx            ## imm = 0x4001
+       movq    %rbx, %rdi
+       movq    %rax, %rsi
+       callq   _memcpy
+Ltmp2:
+       .loc    1 8 1                   ## a.cpp:8:1
+       movq    %rbx, %rax
+       addq    $8, %rsp
+       popq    %rbx
+       popq    %rbp
+       retq
+Ltmp3:
+Lfunc_end0:
+       .cfi_endproc
+                                        ## -- End function
+       .section        __DWARF,__debug_str,regular,debug
+Linfo_string:
+       .asciz  "clang version 9.0.0 (git@github.com:llvm/llvm-project.git 10de39548976ae224709acdc1c337e33cf12f3c0)" ## string offset=0
+       .asciz  "a.cpp"                 ## string offset=100
+       .asciz  "/private/tmp"          ## string offset=106
+       .asciz  "foo"                   ## string offset=119
+       .asciz  "_Z3foov"               ## string offset=123
+       .asciz  "e"                     ## string offset=131
+       .asciz  "f"                     ## string offset=133
+       .asciz  "char"                  ## string offset=135
+       .asciz  "__ARRAY_SIZE_TYPE__"   ## string offset=140
+       .asciz  "g"                     ## string offset=160
+       .asciz  "E"                     ## string offset=162
+       .section        __DWARF,__debug_loc,regular,debug
+Lsection_debug_loc:
+Ldebug_loc0:
+.set Lset0, Ltmp1-Lfunc_begin0
+       .quad   Lset0
+.set Lset1, Ltmp2-Lfunc_begin0
+       .quad   Lset1
+       .short  1                       ## Loc expr size
+       .byte   80                      ## DW_OP_reg0
+       .quad   0
+       .quad   0
+       .section        __DWARF,__debug_abbrev,regular,debug
+Lsection_abbrev:
+       .byte   1                       ## Abbreviation Code
+       .byte   17                      ## DW_TAG_compile_unit
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   37                      ## DW_AT_producer
+       .byte   14                      ## DW_FORM_strp
+       .byte   19                      ## DW_AT_language
+       .byte   5                       ## DW_FORM_data2
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   16                      ## DW_AT_stmt_list
+       .byte   6                       ## DW_FORM_data4
+       .byte   27                      ## DW_AT_comp_dir
+       .byte   14                      ## DW_FORM_strp
+       .ascii  "\264B"                 ## DW_AT_GNU_pubnames
+       .byte   12                      ## DW_FORM_flag
+       .ascii  "\341\177"              ## DW_AT_APPLE_optimized
+       .byte   12                      ## DW_FORM_flag
+       .byte   17                      ## DW_AT_low_pc
+       .byte   1                       ## DW_FORM_addr
+       .byte   18                      ## DW_AT_high_pc
+       .byte   1                       ## DW_FORM_addr
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   2                       ## Abbreviation Code
+       .byte   46                      ## DW_TAG_subprogram
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   17                      ## DW_AT_low_pc
+       .byte   1                       ## DW_FORM_addr
+       .byte   18                      ## DW_AT_high_pc
+       .byte   1                       ## DW_FORM_addr
+       .byte   64                      ## DW_AT_frame_base
+       .byte   10                      ## DW_FORM_block1
+       .ascii  "\207@"                 ## DW_AT_MIPS_linkage_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   63                      ## DW_AT_external
+       .byte   12                      ## DW_FORM_flag
+       .ascii  "\341\177"              ## DW_AT_APPLE_optimized
+       .byte   12                      ## DW_FORM_flag
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   3                       ## Abbreviation Code
+       .byte   52                      ## DW_TAG_variable
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   2                       ## DW_AT_location
+       .byte   6                       ## DW_FORM_data4
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   4                       ## Abbreviation Code
+       .byte   19                      ## DW_TAG_structure_type
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   54                      ## DW_AT_calling_convention
+       .byte   11                      ## DW_FORM_data1
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   11                      ## DW_AT_byte_size
+       .byte   5                       ## DW_FORM_data2
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   5                       ## Abbreviation Code
+       .byte   13                      ## DW_TAG_member
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   56                      ## DW_AT_data_member_location
+       .byte   10                      ## DW_FORM_block1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   6                       ## Abbreviation Code
+       .byte   1                       ## DW_TAG_array_type
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   7                       ## Abbreviation Code
+       .byte   33                      ## DW_TAG_subrange_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   55                      ## DW_AT_count
+       .byte   5                       ## DW_FORM_data2
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   8                       ## Abbreviation Code
+       .byte   36                      ## DW_TAG_base_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   62                      ## DW_AT_encoding
+       .byte   11                      ## DW_FORM_data1
+       .byte   11                      ## DW_AT_byte_size
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   9                       ## Abbreviation Code
+       .byte   36                      ## DW_TAG_base_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   11                      ## DW_AT_byte_size
+       .byte   11                      ## DW_FORM_data1
+       .byte   62                      ## DW_AT_encoding
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   10                      ## Abbreviation Code
+       .byte   15                      ## DW_TAG_pointer_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   0                       ## EOM(3)
+       .section        __DWARF,__debug_info,regular,debug
+Lsection_info:
+Lcu_begin0:
+.set Lset2, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
+       .long   Lset2
+Ldebug_info_start0:
+       .short  2                       ## DWARF version number
+.set Lset3, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
+       .long   Lset3
+       .byte   8                       ## Address Size (in bytes)
+       .byte   1                       ## Abbrev [1] 0xb:0xa2 DW_TAG_compile_unit
+       .long   0                       ## DW_AT_producer
+       .short  4                       ## DW_AT_language
+       .long   100                     ## DW_AT_name
+.set Lset4, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
+       .long   Lset4
+       .long   106                     ## DW_AT_comp_dir
+       .byte   1                       ## DW_AT_GNU_pubnames
+       .byte   1                       ## DW_AT_APPLE_optimized
+       .quad   Lfunc_begin0            ## DW_AT_low_pc
+       .quad   Lfunc_end0              ## DW_AT_high_pc
+       .byte   2                       ## Abbrev [2] 0x30:0x33 DW_TAG_subprogram
+       .quad   Lfunc_begin0            ## DW_AT_low_pc
+       .quad   Lfunc_end0              ## DW_AT_high_pc
+       .byte   1                       ## DW_AT_frame_base
+       .byte   86
+       .long   123                     ## DW_AT_MIPS_linkage_name
+       .long   119                     ## DW_AT_name
+       .byte   1                       ## DW_AT_decl_file
+       .byte   5                       ## DW_AT_decl_line
+       .long   99                      ## DW_AT_type
+       .byte   1                       ## DW_AT_external
+       .byte   1                       ## DW_AT_APPLE_optimized
+       .byte   3                       ## Abbrev [3] 0x53:0xf DW_TAG_variable
+.set Lset5, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
+       .long   Lset5
+       .long   162                     ## DW_AT_name
+       .byte   1                       ## DW_AT_decl_file
+       .byte   6                       ## DW_AT_decl_line
+       .long   167                     ## DW_AT_type
+       .byte   0                       ## End Of Children Mark
+       .byte   4                       ## Abbrev [4] 0x63:0x29 DW_TAG_structure_type
+       .byte   5                       ## DW_AT_calling_convention
+       .long   131                     ## DW_AT_name
+       .short  16385                   ## DW_AT_byte_size
+       .byte   1                       ## DW_AT_decl_file
+       .byte   1                       ## DW_AT_decl_line
+       .byte   5                       ## Abbrev [5] 0x6d:0xe DW_TAG_member
+       .long   133                     ## DW_AT_name
+       .long   140                     ## DW_AT_type
+       .byte   1                       ## DW_AT_decl_file
+       .byte   2                       ## DW_AT_decl_line
+       .byte   2                       ## DW_AT_data_member_location
+       .byte   35
+       .byte   0
+       .byte   5                       ## Abbrev [5] 0x7b:0x10 DW_TAG_member
+       .long   160                     ## DW_AT_name
+       .long   153                     ## DW_AT_type
+       .byte   1                       ## DW_AT_decl_file
+       .byte   3                       ## DW_AT_decl_line
+       .byte   4                       ## DW_AT_data_member_location
+       .byte   35
+       .ascii  "\200\200\001"
+       .byte   0                       ## End Of Children Mark
+       .byte   6                       ## Abbrev [6] 0x8c:0xd DW_TAG_array_type
+       .long   153                     ## DW_AT_type
+       .byte   7                       ## Abbrev [7] 0x91:0x7 DW_TAG_subrange_type
+       .long   160                     ## DW_AT_type
+       .short  16384                   ## DW_AT_count
+       .byte   0                       ## End Of Children Mark
+       .byte   8                       ## Abbrev [8] 0x99:0x7 DW_TAG_base_type
+       .long   135                     ## DW_AT_name
+       .byte   6                       ## DW_AT_encoding
+       .byte   1                       ## DW_AT_byte_size
+       .byte   9                       ## Abbrev [9] 0xa0:0x7 DW_TAG_base_type
+       .long   140                     ## DW_AT_name
+       .byte   8                       ## DW_AT_byte_size
+       .byte   7                       ## DW_AT_encoding
+       .byte   10                      ## Abbrev [10] 0xa7:0x5 DW_TAG_pointer_type
+       .long   99                      ## DW_AT_type
+       .byte   0                       ## End Of Children Mark
+Ldebug_info_end0:
+       .section        __DWARF,__debug_macinfo,regular,debug
+Ldebug_macinfo:
+       .byte   0                       ## End Of Macro List Mark
+
+.subsections_via_symbols
+       .section        __DWARF,__debug_line,regular,debug
+Lsection_line:
+Lline_table_start0:
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/formclass4.s b/llvm/test/tools/llvm-dwarfdump/X86/formclass4.s
new file mode 100644 (file)
index 0000000..d0f8857
--- /dev/null
@@ -0,0 +1,331 @@
+# Source:
+#   struct e {
+#     enum {} f[16384];
+#     short g;
+#   };
+#   e foo() {
+#     auto E = new e;
+#     return *E;
+#   }
+# Compile with:
+#   clang -O2 -gdwarf-4 -S a.cpp -o a4.s
+
+# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o %t.o
+# RUN: llvm-dwarfdump -debug-info -name g %t.o | FileCheck %s
+
+# CHECK: DW_TAG_member
+# CHECK: DW_AT_name ("g")
+# CHECK: DW_AT_data_member_location    (0x4000)
+
+       .section        __TEXT,__text,regular,pure_instructions
+       .macosx_version_min 10, 14
+       .globl  __Z3foov                ## -- Begin function _Z3foov
+       .p2align        4, 0x90
+__Z3foov:                               ## @_Z3foov
+Lfunc_begin0:
+       .file   1 "/private/tmp" "a.cpp"
+       .loc    1 5 0                   ## a.cpp:5:0
+       .cfi_startproc
+## %bb.0:                               ## %entry
+       pushq   %rbp
+       .cfi_def_cfa_offset 16
+       .cfi_offset %rbp, -16
+       movq    %rsp, %rbp
+       .cfi_def_cfa_register %rbp
+       pushq   %rbx
+       pushq   %rax
+       .cfi_offset %rbx, -24
+       movq    %rdi, %rbx
+Ltmp0:
+       .loc    1 6 12 prologue_end     ## a.cpp:6:12
+       movl    $16385, %edi            ## imm = 0x4001
+       callq   __Znwm
+Ltmp1:
+       ##DEBUG_VALUE: foo:E <- $rax
+       .loc    1 7 10                  ## a.cpp:7:10
+       movl    $16385, %edx            ## imm = 0x4001
+       movq    %rbx, %rdi
+       movq    %rax, %rsi
+       callq   _memcpy
+Ltmp2:
+       .loc    1 8 1                   ## a.cpp:8:1
+       movq    %rbx, %rax
+       addq    $8, %rsp
+       popq    %rbx
+       popq    %rbp
+       retq
+Ltmp3:
+Lfunc_end0:
+       .cfi_endproc
+                                        ## -- End function
+       .section        __DWARF,__debug_str,regular,debug
+Linfo_string:
+       .asciz  "clang version 9.0.0 (git@github.com:llvm/llvm-project.git 10de39548976ae224709acdc1c337e33cf12f3c0)" ## string offset=0
+       .asciz  "a.cpp"                 ## string offset=100
+       .asciz  "/private/tmp"          ## string offset=106
+       .asciz  "foo"                   ## string offset=119
+       .asciz  "_Z3foov"               ## string offset=123
+       .asciz  "e"                     ## string offset=131
+       .asciz  "f"                     ## string offset=133
+       .asciz  "char"                  ## string offset=135
+       .asciz  "__ARRAY_SIZE_TYPE__"   ## string offset=140
+       .asciz  "g"                     ## string offset=160
+       .asciz  "E"                     ## string offset=162
+       .section        __DWARF,__debug_loc,regular,debug
+Lsection_debug_loc:
+Ldebug_loc0:
+.set Lset0, Ltmp1-Lfunc_begin0
+       .quad   Lset0
+.set Lset1, Ltmp2-Lfunc_begin0
+       .quad   Lset1
+       .short  1                       ## Loc expr size
+       .byte   80                      ## DW_OP_reg0
+       .quad   0
+       .quad   0
+       .section        __DWARF,__debug_abbrev,regular,debug
+Lsection_abbrev:
+       .byte   1                       ## Abbreviation Code
+       .byte   17                      ## DW_TAG_compile_unit
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   37                      ## DW_AT_producer
+       .byte   14                      ## DW_FORM_strp
+       .byte   19                      ## DW_AT_language
+       .byte   5                       ## DW_FORM_data2
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   16                      ## DW_AT_stmt_list
+       .byte   23                      ## DW_FORM_sec_offset
+       .byte   27                      ## DW_AT_comp_dir
+       .byte   14                      ## DW_FORM_strp
+       .ascii  "\264B"                 ## DW_AT_GNU_pubnames
+       .byte   25                      ## DW_FORM_flag_present
+       .ascii  "\341\177"              ## DW_AT_APPLE_optimized
+       .byte   25                      ## DW_FORM_flag_present
+       .byte   17                      ## DW_AT_low_pc
+       .byte   1                       ## DW_FORM_addr
+       .byte   18                      ## DW_AT_high_pc
+       .byte   6                       ## DW_FORM_data4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   2                       ## Abbreviation Code
+       .byte   46                      ## DW_TAG_subprogram
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   17                      ## DW_AT_low_pc
+       .byte   1                       ## DW_FORM_addr
+       .byte   18                      ## DW_AT_high_pc
+       .byte   6                       ## DW_FORM_data4
+       .byte   64                      ## DW_AT_frame_base
+       .byte   24                      ## DW_FORM_exprloc
+       .byte   122                     ## DW_AT_call_all_calls
+       .byte   25                      ## DW_FORM_flag_present
+       .byte   110                     ## DW_AT_linkage_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   63                      ## DW_AT_external
+       .byte   25                      ## DW_FORM_flag_present
+       .ascii  "\341\177"              ## DW_AT_APPLE_optimized
+       .byte   25                      ## DW_FORM_flag_present
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   3                       ## Abbreviation Code
+       .byte   52                      ## DW_TAG_variable
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   2                       ## DW_AT_location
+       .byte   23                      ## DW_FORM_sec_offset
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   4                       ## Abbreviation Code
+       .byte   19                      ## DW_TAG_structure_type
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   54                      ## DW_AT_calling_convention
+       .byte   11                      ## DW_FORM_data1
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   11                      ## DW_AT_byte_size
+       .byte   5                       ## DW_FORM_data2
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   5                       ## Abbreviation Code
+       .byte   13                      ## DW_TAG_member
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   56                      ## DW_AT_data_member_location
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   6                       ## Abbreviation Code
+       .byte   13                      ## DW_TAG_member
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   58                      ## DW_AT_decl_file
+       .byte   11                      ## DW_FORM_data1
+       .byte   59                      ## DW_AT_decl_line
+       .byte   11                      ## DW_FORM_data1
+       .byte   56                      ## DW_AT_data_member_location
+       .byte   5                       ## DW_FORM_data2
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   7                       ## Abbreviation Code
+       .byte   1                       ## DW_TAG_array_type
+       .byte   1                       ## DW_CHILDREN_yes
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   8                       ## Abbreviation Code
+       .byte   33                      ## DW_TAG_subrange_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   55                      ## DW_AT_count
+       .byte   5                       ## DW_FORM_data2
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   9                       ## Abbreviation Code
+       .byte   36                      ## DW_TAG_base_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   62                      ## DW_AT_encoding
+       .byte   11                      ## DW_FORM_data1
+       .byte   11                      ## DW_AT_byte_size
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   10                      ## Abbreviation Code
+       .byte   36                      ## DW_TAG_base_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   3                       ## DW_AT_name
+       .byte   14                      ## DW_FORM_strp
+       .byte   11                      ## DW_AT_byte_size
+       .byte   11                      ## DW_FORM_data1
+       .byte   62                      ## DW_AT_encoding
+       .byte   11                      ## DW_FORM_data1
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   11                      ## Abbreviation Code
+       .byte   15                      ## DW_TAG_pointer_type
+       .byte   0                       ## DW_CHILDREN_no
+       .byte   73                      ## DW_AT_type
+       .byte   19                      ## DW_FORM_ref4
+       .byte   0                       ## EOM(1)
+       .byte   0                       ## EOM(2)
+       .byte   0                       ## EOM(3)
+       .section        __DWARF,__debug_info,regular,debug
+Lsection_info:
+Lcu_begin0:
+.set Lset2, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit
+       .long   Lset2
+Ldebug_info_start0:
+       .short  4                       ## DWARF version number
+.set Lset3, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section
+       .long   Lset3
+       .byte   8                       ## Address Size (in bytes)
+       .byte   1                       ## Abbrev [1] 0xb:0x91 DW_TAG_compile_unit
+       .long   0                       ## DW_AT_producer
+       .short  4                       ## DW_AT_language
+       .long   100                     ## DW_AT_name
+.set Lset4, Lline_table_start0-Lsection_line ## DW_AT_stmt_list
+       .long   Lset4
+       .long   106                     ## DW_AT_comp_dir
+                                        ## DW_AT_GNU_pubnames
+                                        ## DW_AT_APPLE_optimized
+       .quad   Lfunc_begin0            ## DW_AT_low_pc
+.set Lset5, Lfunc_end0-Lfunc_begin0     ## DW_AT_high_pc
+       .long   Lset5
+       .byte   2                       ## Abbrev [2] 0x2a:0x2d DW_TAG_subprogram
+       .quad   Lfunc_begin0            ## DW_AT_low_pc
+.set Lset6, Lfunc_end0-Lfunc_begin0     ## DW_AT_high_pc
+       .long   Lset6
+       .byte   1                       ## DW_AT_frame_base
+       .byte   86
+                                        ## DW_AT_call_all_calls
+       .long   123                     ## DW_AT_linkage_name
+       .long   119                     ## DW_AT_name
+       .byte   1                       ## DW_AT_decl_file
+       .byte   5                       ## DW_AT_decl_line
+       .long   87                      ## DW_AT_type
+                                        ## DW_AT_external
+                                        ## DW_AT_APPLE_optimized
+       .byte   3                       ## Abbrev [3] 0x47:0xf DW_TAG_variable
+.set Lset7, Ldebug_loc0-Lsection_debug_loc ## DW_AT_location
+       .long   Lset7
+       .long   162                     ## DW_AT_name
+       .byte   1                       ## DW_AT_decl_file
+       .byte   6                       ## DW_AT_decl_line
+       .long   150                     ## DW_AT_type
+       .byte   0                       ## End Of Children Mark
+       .byte   4                       ## Abbrev [4] 0x57:0x24 DW_TAG_structure_type
+       .byte   5                       ## DW_AT_calling_convention
+       .long   131                     ## DW_AT_name
+       .short  16385                   ## DW_AT_byte_size
+       .byte   1                       ## DW_AT_decl_file
+       .byte   1                       ## DW_AT_decl_line
+       .byte   5                       ## Abbrev [5] 0x61:0xc DW_TAG_member
+       .long   133                     ## DW_AT_name
+       .long   123                     ## DW_AT_type
+       .byte   1                       ## DW_AT_decl_file
+       .byte   2                       ## DW_AT_decl_line
+       .byte   0                       ## DW_AT_data_member_location
+       .byte   6                       ## Abbrev [6] 0x6d:0xd DW_TAG_member
+       .long   160                     ## DW_AT_name
+       .long   136                     ## DW_AT_type
+       .byte   1                       ## DW_AT_decl_file
+       .byte   3                       ## DW_AT_decl_line
+       .short  16384                   ## DW_AT_data_member_location
+       .byte   0                       ## End Of Children Mark
+       .byte   7                       ## Abbrev [7] 0x7b:0xd DW_TAG_array_type
+       .long   136                     ## DW_AT_type
+       .byte   8                       ## Abbrev [8] 0x80:0x7 DW_TAG_subrange_type
+       .long   143                     ## DW_AT_type
+       .short  16384                   ## DW_AT_count
+       .byte   0                       ## End Of Children Mark
+       .byte   9                       ## Abbrev [9] 0x88:0x7 DW_TAG_base_type
+       .long   135                     ## DW_AT_name
+       .byte   6                       ## DW_AT_encoding
+       .byte   1                       ## DW_AT_byte_size
+       .byte   10                      ## Abbrev [10] 0x8f:0x7 DW_TAG_base_type
+       .long   140                     ## DW_AT_name
+       .byte   8                       ## DW_AT_byte_size
+       .byte   7                       ## DW_AT_encoding
+       .byte   11                      ## Abbrev [11] 0x96:0x5 DW_TAG_pointer_type
+       .long   87                      ## DW_AT_type
+       .byte   0                       ## End Of Children Mark
+Ldebug_info_end0:
+       .section        __DWARF,__debug_macinfo,regular,debug
+Ldebug_macinfo:
+       .byte   0                       ## End Of Macro List Mark
+
+.subsections_via_symbols
+       .section        __DWARF,__debug_line,regular,debug
+Lsection_line:
+Lline_table_start0: