1# This test ensures that dwarfdump doesn't crash for malformed DWARF where a 2# DIE references itself. 3# 4# Source: 5# void f(); 6# __attribute__((always_inline)) void g() { 7# f(); 8# } 9# void h() { 10# g(); 11# }; 12# 13# Compile with: 14# clang inlined.c -S -g -o inlined.s 15# 16# RUN: llvm-mc %s -filetype obj -triple x86_64-apple-darwin -o - \ 17# RUN: | llvm-dwarfdump -debug-info - \ 18# RUN: | FileCheck %s 19 20# CHECK: 0x0000005a: DW_TAG_inlined_subroutine 21# CHECK-NEXT: DW_AT_abstract_origin (0x0000005a) 22 23 .section __TEXT,__text,regular,pure_instructions 24 .macosx_version_min 10, 13 25 .globl _g ## -- Begin function g 26 .p2align 4, 0x90 27_g: ## @g 28Lfunc_begin0: 29 .file 1 "inlined.c" 30 .loc 1 2 0 ## inlined.c:2:0 31 .cfi_startproc 32## %bb.0: ## %entry 33 pushq %rbp 34 .cfi_def_cfa_offset 16 35 .cfi_offset %rbp, -16 36 movq %rsp, %rbp 37 .cfi_def_cfa_register %rbp 38Ltmp0: 39 .loc 1 3 3 prologue_end ## inlined.c:3:3 40 movb $0, %al 41 callq _f 42 .loc 1 4 1 ## inlined.c:4:1 43 popq %rbp 44 retq 45Ltmp1: 46Lfunc_end0: 47 .cfi_endproc 48 ## -- End function 49 .globl _h ## -- Begin function h 50 .p2align 4, 0x90 51_h: ## @h 52Lfunc_begin1: 53 .loc 1 5 0 ## inlined.c:5:0 54 .cfi_startproc 55## %bb.0: ## %entry 56 pushq %rbp 57 .cfi_def_cfa_offset 16 58 .cfi_offset %rbp, -16 59 movq %rsp, %rbp 60 .cfi_def_cfa_register %rbp 61Ltmp2: 62 .loc 1 3 3 prologue_end ## inlined.c:3:3 63 movb $0, %al 64 callq _f 65Ltmp3: 66 .loc 1 7 1 ## inlined.c:7:1 67 popq %rbp 68 retq 69Ltmp4: 70Lfunc_end1: 71 .cfi_endproc 72 ## -- End function 73 .section __DWARF,__debug_str,regular,debug 74Linfo_string: 75 .asciz "clang version 7.0.0 " ## string offset=0 76 .asciz "inlined.c" ## string offset=21 77 .asciz "/private/tmp" ## string offset=31 78 .asciz "g" ## string offset=44 79 .asciz "h" ## string offset=46 80 .section __DWARF,__debug_abbrev,regular,debug 81Lsection_abbrev: 82 .byte 1 ## Abbreviation Code 83 .byte 17 ## DW_TAG_compile_unit 84 .byte 1 ## DW_CHILDREN_yes 85 .byte 37 ## DW_AT_producer 86 .byte 14 ## DW_FORM_strp 87 .byte 19 ## DW_AT_language 88 .byte 5 ## DW_FORM_data2 89 .byte 3 ## DW_AT_name 90 .byte 14 ## DW_FORM_strp 91 .byte 16 ## DW_AT_stmt_list 92 .byte 23 ## DW_FORM_sec_offset 93 .byte 27 ## DW_AT_comp_dir 94 .byte 14 ## DW_FORM_strp 95 .byte 17 ## DW_AT_low_pc 96 .byte 1 ## DW_FORM_addr 97 .byte 18 ## DW_AT_high_pc 98 .byte 6 ## DW_FORM_data4 99 .byte 0 ## EOM(1) 100 .byte 0 ## EOM(2) 101 .byte 2 ## Abbreviation Code 102 .byte 46 ## DW_TAG_subprogram 103 .byte 0 ## DW_CHILDREN_no 104 .byte 17 ## DW_AT_low_pc 105 .byte 1 ## DW_FORM_addr 106 .byte 18 ## DW_AT_high_pc 107 .byte 6 ## DW_FORM_data4 108 .byte 64 ## DW_AT_frame_base 109 .byte 24 ## DW_FORM_exprloc 110 .byte 49 ## DW_AT_abstract_origin 111 .byte 19 ## DW_FORM_ref4 112 .byte 0 ## EOM(1) 113 .byte 0 ## EOM(2) 114 .byte 3 ## Abbreviation Code 115 .byte 46 ## DW_TAG_subprogram 116 .byte 0 ## DW_CHILDREN_no 117 .byte 3 ## DW_AT_name 118 .byte 14 ## DW_FORM_strp 119 .byte 58 ## DW_AT_decl_file 120 .byte 11 ## DW_FORM_data1 121 .byte 59 ## DW_AT_decl_line 122 .byte 11 ## DW_FORM_data1 123 .byte 63 ## DW_AT_external 124 .byte 25 ## DW_FORM_flag_present 125 .byte 32 ## DW_AT_inline 126 .byte 11 ## DW_FORM_data1 127 .byte 0 ## EOM(1) 128 .byte 0 ## EOM(2) 129 .byte 4 ## Abbreviation Code 130 .byte 46 ## DW_TAG_subprogram 131 .byte 1 ## DW_CHILDREN_yes 132 .byte 17 ## DW_AT_low_pc 133 .byte 1 ## DW_FORM_addr 134 .byte 18 ## DW_AT_high_pc 135 .byte 6 ## DW_FORM_data4 136 .byte 64 ## DW_AT_frame_base 137 .byte 24 ## DW_FORM_exprloc 138 .byte 3 ## DW_AT_name 139 .byte 14 ## DW_FORM_strp 140 .byte 58 ## DW_AT_decl_file 141 .byte 11 ## DW_FORM_data1 142 .byte 59 ## DW_AT_decl_line 143 .byte 11 ## DW_FORM_data1 144 .byte 63 ## DW_AT_external 145 .byte 25 ## DW_FORM_flag_present 146 .byte 0 ## EOM(1) 147 .byte 0 ## EOM(2) 148 .byte 5 ## Abbreviation Code 149 .byte 29 ## DW_TAG_inlined_subroutine 150 .byte 0 ## DW_CHILDREN_no 151 .byte 49 ## DW_AT_abstract_origin 152 .byte 19 ## DW_FORM_ref4 153 .byte 17 ## DW_AT_low_pc 154 .byte 1 ## DW_FORM_addr 155 .byte 18 ## DW_AT_high_pc 156 .byte 6 ## DW_FORM_data4 157 .byte 88 ## DW_AT_call_file 158 .byte 11 ## DW_FORM_data1 159 .byte 89 ## DW_AT_call_line 160 .byte 11 ## DW_FORM_data1 161 .byte 0 ## EOM(1) 162 .byte 0 ## EOM(2) 163 .byte 0 ## EOM(3) 164 .section __DWARF,__debug_info,regular,debug 165Lsection_info: 166Lcu_begin0: 167 .long 107 ## Length of Unit 168 .short 4 ## DWARF version number 169Lset0 = Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section 170 .long Lset0 171 .byte 8 ## Address Size (in bytes) 172 .byte 1 ## Abbrev [1] 0xb:0x64 DW_TAG_compile_unit 173 .long 0 ## DW_AT_producer 174 .short 12 ## DW_AT_language 175 .long 21 ## DW_AT_name 176Lset1 = Lline_table_start0-Lsection_line ## DW_AT_stmt_list 177 .long Lset1 178 .long 31 ## DW_AT_comp_dir 179 .quad Lfunc_begin0 ## DW_AT_low_pc 180Lset2 = Lfunc_end1-Lfunc_begin0 ## DW_AT_high_pc 181 .long Lset2 182 .byte 2 ## Abbrev [2] 0x2a:0x13 DW_TAG_subprogram 183 .quad Lfunc_begin0 ## DW_AT_low_pc 184Lset3 = Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc 185 .long Lset3 186 .byte 1 ## DW_AT_frame_base 187 .byte 86 188 .long 61 ## DW_AT_abstract_origin 189 .byte 3 ## Abbrev [3] 0x3d:0x8 DW_TAG_subprogram 190 .long 44 ## DW_AT_name 191 .byte 1 ## DW_AT_decl_file 192 .byte 2 ## DW_AT_decl_line 193 ## DW_AT_external 194 .byte 1 ## DW_AT_inline 195 .byte 4 ## Abbrev [4] 0x45:0x29 DW_TAG_subprogram 196 .quad Lfunc_begin1 ## DW_AT_low_pc 197Lset4 = Lfunc_end1-Lfunc_begin1 ## DW_AT_high_pc 198 .long Lset4 199 .byte 1 ## DW_AT_frame_base 200 .byte 86 201 .long 46 ## DW_AT_name 202 .byte 1 ## DW_AT_decl_file 203 .byte 5 ## DW_AT_decl_line 204 ## DW_AT_external 205 .byte 5 ## Abbrev [5] 0x5a:0x13 DW_TAG_inlined_subroutine 206 .long 90 ## DW_AT_abstract_origin <- We modified the value so the DIE references itself. 207 .quad Ltmp2 ## DW_AT_low_pc 208Lset5 = Ltmp3-Ltmp2 ## DW_AT_high_pc 209 .long Lset5 210 .byte 1 ## DW_AT_call_file 211 .byte 6 ## DW_AT_call_line 212 .byte 0 ## End Of Children Mark 213 .byte 0 ## End Of Children Mark 214 .section __DWARF,__debug_ranges,regular,debug 215Ldebug_range: 216 .section __DWARF,__debug_macinfo,regular,debug 217Ldebug_macinfo: 218Lcu_macro_begin0: 219 .byte 0 ## End Of Macro List Mark 220 .section __DWARF,__apple_names,regular,debug 221Lnames_begin: 222 .long 1212240712 ## Header Magic 223 .short 1 ## Header Version 224 .short 0 ## Header Hash Function 225 .long 2 ## Header Bucket Count 226 .long 2 ## Header Hash Count 227 .long 12 ## Header Data Length 228 .long 0 ## HeaderData Die Offset Base 229 .long 1 ## HeaderData Atom Count 230 .short 1 ## DW_ATOM_die_offset 231 .short 6 ## DW_FORM_data4 232 .long 0 ## Bucket 0 233 .long 1 ## Bucket 1 234 .long 177676 ## Hash in Bucket 0 235 .long 177677 ## Hash in Bucket 1 236 .long LNames0-Lnames_begin ## Offset in Bucket 0 237 .long LNames1-Lnames_begin ## Offset in Bucket 1 238LNames0: 239 .long 44 ## g 240 .long 2 ## Num DIEs 241 .long 42 242 .long 90 243 .long 0 244LNames1: 245 .long 46 ## h 246 .long 1 ## Num DIEs 247 .long 69 248 .long 0 249 .section __DWARF,__apple_objc,regular,debug 250Lobjc_begin: 251 .long 1212240712 ## Header Magic 252 .short 1 ## Header Version 253 .short 0 ## Header Hash Function 254 .long 1 ## Header Bucket Count 255 .long 0 ## Header Hash Count 256 .long 12 ## Header Data Length 257 .long 0 ## HeaderData Die Offset Base 258 .long 1 ## HeaderData Atom Count 259 .short 1 ## DW_ATOM_die_offset 260 .short 6 ## DW_FORM_data4 261 .long -1 ## Bucket 0 262 .section __DWARF,__apple_namespac,regular,debug 263Lnamespac_begin: 264 .long 1212240712 ## Header Magic 265 .short 1 ## Header Version 266 .short 0 ## Header Hash Function 267 .long 1 ## Header Bucket Count 268 .long 0 ## Header Hash Count 269 .long 12 ## Header Data Length 270 .long 0 ## HeaderData Die Offset Base 271 .long 1 ## HeaderData Atom Count 272 .short 1 ## DW_ATOM_die_offset 273 .short 6 ## DW_FORM_data4 274 .long -1 ## Bucket 0 275 .section __DWARF,__apple_types,regular,debug 276Ltypes_begin: 277 .long 1212240712 ## Header Magic 278 .short 1 ## Header Version 279 .short 0 ## Header Hash Function 280 .long 1 ## Header Bucket Count 281 .long 0 ## Header Hash Count 282 .long 20 ## Header Data Length 283 .long 0 ## HeaderData Die Offset Base 284 .long 3 ## HeaderData Atom Count 285 .short 1 ## DW_ATOM_die_offset 286 .short 6 ## DW_FORM_data4 287 .short 3 ## DW_ATOM_die_tag 288 .short 5 ## DW_FORM_data2 289 .short 4 ## DW_ATOM_type_flags 290 .short 11 ## DW_FORM_data1 291 .long -1 ## Bucket 0 292 293.subsections_via_symbols 294 .section __DWARF,__debug_line,regular,debug 295Lsection_line: 296Lline_table_start0: 297