aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/tools/llvm-symbolizer/split-dwarf-zero-signature-not-found.s
blob: de3cc738e1ff101d1b9a48cd6e69ef9b0981faf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
## This test checks that looking up a zero hash in the .debug_cu_index hash
## table works correctly when there's no CU with signature = 0.
##
## LLVM used to check just the signature bits to decide if the hash lookup ended
## at a match or at an empty slot. This is wrong when signature = 0 because
## empty slots have all zeros in the signature field too, and LLVM would return
## the empty slot as a valid result.

# REQUIRES: x86-registered-target

# RUN: llvm-mc --filetype=obj --triple x86_64 %s -o %t --defsym MAIN=0
# RUN: llvm-mc --filetype=obj --triple x86_64 %s -o %t.dwp
# RUN: llvm-symbolizer --obj=%t --dwp=%t.dwp 0x0 | FileCheck %s

## This expected output is very uninteresting, but it's better than a crash.
# CHECK: ??:0:0

        .section        .debug_abbrev,"",@progbits
        .byte   1                       # Abbreviation Code
        .byte   17                      # DW_TAG_compile_unit
        .byte   0                       # DW_CHILDREN_no
        .ascii  "\260B"                 # DW_AT_GNU_dwo_name
        .byte   8                       # DW_FORM_string
        .ascii  "\261B"                 # DW_AT_GNU_dwo_id
        .byte   7                       # DW_FORM_data8
        .ascii  "\263B"                 # DW_AT_GNU_addr_base
        .byte   23                      # DW_FORM_sec_offset
        .byte   85                      # DW_AT_ranges
        .byte   23                      # DW_FORM_sec_offset
        .byte   0                       # EOM(1)
        .byte   0                       # EOM(2)
        .byte   0                       # EOM(3)

## Create two CUs, with dwo_ids 0 and 1 respectively.
.ifdef MAIN
.irpc I,01
        .data
A\I:
        .long \I

        .text
F\I:
        nop

        .section        .debug_info,"",@progbits
.Lcu_begin\I:
        .long   .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit
.Ldebug_info_start\I:
        .short  4                       # DWARF version number
        .long   .debug_abbrev           # Offset Into Abbrev. Section
        .byte   8                       # Address Size (in bytes)
        .byte   1                       # Abbrev [1] 0xb:0x25 DW_TAG_compile_unit
        .asciz  "A.dwo"                 # DW_AT_GNU_dwo_name
        .quad   \I                      # DW_AT_GNU_dwo_id
        .long   .debug_addr             # DW_AT_GNU_addr_base
        .long   .Lranges\I              # DW_AT_ranges
.Ldebug_info_end\I:

        .section        .debug_addr,"",@progbits
        .quad   A\I
        .quad   F\I

        .section        .debug_ranges,"",@progbits
.Lranges\I:
        .quad   F\I
        .quad   F\I+1
        .quad   0
        .quad   0
.endr
.else
## Deliberately omit compile unit 0 in the DWP. We want to check the case where
## a signature = 0 matches an empty hash slot in .debug_cu_index and the index
## in the parallel table has to be checked.
        .section        .debug_abbrev.dwo,"e",@progbits
.Labbrev1:
        .byte   1                       # Abbreviation Code
        .byte   17                      # DW_TAG_compile_unit
        .byte   0                       # DW_CHILDREN_no
        .byte   37                      # DW_AT_producer
        .byte   8                       # DW_FORM_string
        .byte   3                       # DW_AT_name
        .byte   8                       # DW_FORM_string
        .byte   0                       # EOM(1)
        .byte   0                       # EOM(2)
        .byte   0                       # EOM(3)
.Labbrev_end1:

        .section        .debug_info.dwo,"e",@progbits
.Lcu_begin1:
        .long   .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
.Ldebug_info_start1:
        .short  4                       # DWARF version number
        .long   0                       # Offset Into Abbrev. Section
        .byte   8                       # Address Size (in bytes)
        .byte   1                       # Abbrev DW_TAG_compile_unit
        .asciz  "Hand-written DWARF"    # DW_AT_producer
        .byte   '1', '.', 'c', 0        # DW_AT_name
.Ldebug_info_end1:

        .section        .debug_cu_index,"",@progbits
        .long   2                       # DWARF version number
        .long   2                       # Section count
        .long   1                       # Unit count
        .long   8                       # Slot count

        .quad   1, 0, 0, 0, 0, 0, 0, 0  # Hash table
        .long   1, 0, 0, 0, 0, 0, 0, 0  # Index table

        .long   1                       # DW_SECT_INFO
        .long   3                       # DW_SECT_ABBREV

        .long .Lcu_begin1-.debug_info.dwo
        .long .Labbrev1-.debug_abbrev.dwo

        .long .Ldebug_info_end1-.Lcu_begin1
        .long .Labbrev_end1-.Labbrev1

.endif