1## This test checks that looking up a zero hash in the .debug_cu_index hash 2## table works correctly when there's no CU with signature = 0. 3## 4## LLVM used to check just the signature bits to decide if the hash lookup ended 5## at a match or at an empty slot. This is wrong when signature = 0 because 6## empty slots have all zeros in the signature field too, and LLVM would return 7## the empty slot as a valid result. 8 9# REQUIRES: x86-registered-target 10 11# RUN: llvm-mc --filetype=obj --triple x86_64 %s -o %t --defsym MAIN=0 12# RUN: llvm-mc --filetype=obj --triple x86_64 %s -o %t.dwp 13# RUN: llvm-symbolizer --obj=%t --dwp=%t.dwp 0x0 | FileCheck %s 14 15## This expected output is very uninteresting, but it's better than a crash. 16# CHECK: ??:0:0 17 18 .section .debug_abbrev,"",@progbits 19 .byte 1 # Abbreviation Code 20 .byte 17 # DW_TAG_compile_unit 21 .byte 0 # DW_CHILDREN_no 22 .ascii "\260B" # DW_AT_GNU_dwo_name 23 .byte 8 # DW_FORM_string 24 .ascii "\261B" # DW_AT_GNU_dwo_id 25 .byte 7 # DW_FORM_data8 26 .ascii "\263B" # DW_AT_GNU_addr_base 27 .byte 23 # DW_FORM_sec_offset 28 .byte 85 # DW_AT_ranges 29 .byte 23 # DW_FORM_sec_offset 30 .byte 0 # EOM(1) 31 .byte 0 # EOM(2) 32 .byte 0 # EOM(3) 33 34## Create two CUs, with dwo_ids 0 and 1 respectively. 35.ifdef MAIN 36.irpc I,01 37 .data 38A\I: 39 .long \I 40 41 .text 42F\I: 43 nop 44 45 .section .debug_info,"",@progbits 46.Lcu_begin\I: 47 .long .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit 48.Ldebug_info_start\I: 49 .short 4 # DWARF version number 50 .long .debug_abbrev # Offset Into Abbrev. Section 51 .byte 8 # Address Size (in bytes) 52 .byte 1 # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit 53 .asciz "A.dwo" # DW_AT_GNU_dwo_name 54 .quad \I # DW_AT_GNU_dwo_id 55 .long .debug_addr # DW_AT_GNU_addr_base 56 .long .Lranges\I # DW_AT_ranges 57.Ldebug_info_end\I: 58 59 .section .debug_addr,"",@progbits 60 .quad A\I 61 .quad F\I 62 63 .section .debug_ranges,"",@progbits 64.Lranges\I: 65 .quad F\I 66 .quad F\I+1 67 .quad 0 68 .quad 0 69.endr 70.else 71## Deliberately omit compile unit 0 in the DWP. We want to check the case where 72## a signature = 0 matches an empty hash slot in .debug_cu_index and the index 73## in the parallel table has to be checked. 74 .section .debug_abbrev.dwo,"e",@progbits 75.Labbrev1: 76 .byte 1 # Abbreviation Code 77 .byte 17 # DW_TAG_compile_unit 78 .byte 0 # DW_CHILDREN_no 79 .byte 37 # DW_AT_producer 80 .byte 8 # DW_FORM_string 81 .byte 3 # DW_AT_name 82 .byte 8 # DW_FORM_string 83 .byte 0 # EOM(1) 84 .byte 0 # EOM(2) 85 .byte 0 # EOM(3) 86.Labbrev_end1: 87 88 .section .debug_info.dwo,"e",@progbits 89.Lcu_begin1: 90 .long .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit 91.Ldebug_info_start1: 92 .short 4 # DWARF version number 93 .long 0 # Offset Into Abbrev. Section 94 .byte 8 # Address Size (in bytes) 95 .byte 1 # Abbrev DW_TAG_compile_unit 96 .asciz "Hand-written DWARF" # DW_AT_producer 97 .byte '1', '.', 'c', 0 # DW_AT_name 98.Ldebug_info_end1: 99 100 .section .debug_cu_index,"",@progbits 101 .long 2 # DWARF version number 102 .long 2 # Section count 103 .long 1 # Unit count 104 .long 8 # Slot count 105 106 .quad 1, 0, 0, 0, 0, 0, 0, 0 # Hash table 107 .long 1, 0, 0, 0, 0, 0, 0, 0 # Index table 108 109 .long 1 # DW_SECT_INFO 110 .long 3 # DW_SECT_ABBREV 111 112 .long .Lcu_begin1-.debug_info.dwo 113 .long .Labbrev1-.debug_abbrev.dwo 114 115 .long .Ldebug_info_end1-.Lcu_begin1 116 .long .Labbrev_end1-.Labbrev1 117 118.endif 119