xref: /llvm-project/lldb/test/Shell/SymbolFile/DWARF/x86/dwp-hash-collision.s (revision 57a19ac3365f1dc255e6f24fcb7afcde2ccef8f9)
1## Test that lldb handles (mainly, that it doesn't crash) the situation where
2## two skeleton compile units have the same DWO ID (and try to claim the same
3## split unit from the DWP file. This can sometimes happen when the compile unit
4## is nearly empty (e.g. because LTO has optimized all of it away).
5
6# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s --defsym MAIN=0 > %t
7# RUN: llvm-mc -triple=x86_64-pc-linux -filetype=obj %s > %t.dwp
8# RUN: %lldb %t -o "image lookup -t my_enum_type" \
9# RUN:   -o "image dump separate-debug-info" -o exit | FileCheck %s
10
11## Check that we're able to access the type within the split unit (no matter
12## which skeleton unit it ends up associated with). Completely ignoring the unit
13## might also be reasonable.
14# CHECK: image lookup -t my_enum_type
15# CHECK: 1 match found
16# CHECK:      name = "my_enum_type", byte-size = 4, compiler_type = "enum my_enum_type {
17# CHECK-NEXT: }"
18#
19## Check that we get some indication of the error.
20# CHECK: image dump separate-debug-info
21# CHECK:      Dwo ID             Err Dwo Path
22# CHECK: 0xdeadbeefbaadf00d E   multiple compile units with Dwo ID 0xdeadbeefbaadf00d
23
24.set DWO_ID, 0xdeadbeefbaadf00d
25
26## The main file.
27.ifdef MAIN
28        .section        .debug_abbrev,"",@progbits
29        .byte   1                       # Abbreviation Code
30        .byte   74                      # DW_TAG_compile_unit
31        .byte   0                       # DW_CHILDREN_no
32        .byte   0x76                    # DW_AT_dwo_name
33        .byte   8                       # DW_FORM_string
34        .byte   0                       # EOM(1)
35        .byte   0                       # EOM(2)
36        .byte   0                       # EOM(3)
37
38
39        .section        .debug_info,"",@progbits
40.irpc I,01
41.Lcu_begin\I:
42        .long   .Ldebug_info_end\I-.Ldebug_info_start\I # Length of Unit
43.Ldebug_info_start\I:
44        .short  5                       # DWARF version number
45        .byte   4                       # DWARF Unit Type
46        .byte   8                       # Address Size (in bytes)
47        .long   .debug_abbrev           # Offset Into Abbrev. Section
48        .quad   DWO_ID                  # DWO id
49        .byte   1                       # Abbrev [1] DW_TAG_compile_unit
50        .ascii  "foo"
51        .byte   '0' + \I
52        .asciz  ".dwo\0"                # DW_AT_dwo_name
53.Ldebug_info_end\I:
54.endr
55
56.else
57## DWP file starts here.
58
59        .section        .debug_abbrev.dwo,"e",@progbits
60.LAbbrevBegin:
61        .byte   1                       # Abbreviation Code
62        .byte   17                      # DW_TAG_compile_unit
63        .byte   1                       # DW_CHILDREN_yes
64        .byte   37                      # DW_AT_producer
65        .byte   8                       # DW_FORM_string
66        .byte   19                      # DW_AT_language
67        .byte   5                       # DW_FORM_data2
68        .byte   0                       # EOM(1)
69        .byte   0                       # EOM(2)
70        .byte   2                       # Abbreviation Code
71        .byte   4                       # DW_TAG_enumeration_type
72        .byte   0                       # DW_CHILDREN_no
73        .byte   3                       # DW_AT_name
74        .byte   8                       # DW_FORM_string
75        .byte   73                      # DW_AT_type
76        .byte   19                      # DW_FORM_ref4
77        .byte   11                      # DW_AT_byte_size
78        .byte   11                      # DW_FORM_data1
79        .byte   0                       # EOM(1)
80        .byte   0                       # EOM(2)
81        .byte   4                       # Abbreviation Code
82        .byte   36                      # DW_TAG_base_type
83        .byte   0                       # DW_CHILDREN_no
84        .byte   3                       # DW_AT_name
85        .byte   8                       # DW_FORM_string
86        .byte   62                      # DW_AT_encoding
87        .byte   11                      # DW_FORM_data1
88        .byte   11                      # DW_AT_byte_size
89        .byte   11                      # DW_FORM_data1
90        .byte   0                       # EOM(1)
91        .byte   0                       # EOM(2)
92        .byte   0                       # EOM(3)
93.LAbbrevEnd:
94        .section        .debug_info.dwo,"e",@progbits
95.LCUBegin:
96.Lcu_begin1:
97        .long   .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
98.Ldebug_info_start1:
99        .short  5                       # DWARF version number
100        .byte   5                       # DWARF Unit Type
101        .byte   8                       # Address Size (in bytes)
102        .long   0                       # Offset Into Abbrev. Section
103        .quad   DWO_ID                  # DWO id
104        .byte   1                       # Abbrev [1] DW_TAG_compile_unit
105        .asciz  "Hand-written DWARF"    # DW_AT_producer
106        .short  12                      # DW_AT_language
107        .byte   2                       # Abbrev [2] DW_TAG_enumeration_type
108        .asciz  "my_enum_type"          # DW_AT_name
109        .long   .Lint-.Lcu_begin1       # DW_AT_type
110        .byte   4                       # DW_AT_byte_size
111.Lint:
112        .byte   4                       # Abbrev [4] DW_TAG_base_type
113        .asciz  "int"                   # DW_AT_name
114        .byte   5                       # DW_AT_encoding
115        .byte   4                       # DW_AT_byte_size
116        .byte   0                       # End Of Children Mark
117.Ldebug_info_end1:
118.LCUEnd:
119        .section .debug_cu_index, "", @progbits
120## Header:
121        .short 5                        # Version
122        .short 0                        # Padding
123        .long 2                         # Section count
124        .long 1                         # Unit count
125        .long 2                         # Slot count
126## Hash Table of Signatures:
127        .quad 0
128        .quad DWO_ID
129## Parallel Table of Indexes:
130        .long 0
131        .long 1
132## Table of Section Offsets:
133## Row 0:
134        .long 1                         # DW_SECT_INFO
135        .long 3                         # DW_SECT_ABBREV
136## Row 1:
137        .long 0                         # Offset in .debug_info.dwo
138        .long 0                         # Offset in .debug_abbrev.dwo
139## Table of Section Sizes:
140        .long .LCUEnd-.LCUBegin         # Size in .debug_info.dwo
141        .long .LAbbrevEnd-.LAbbrevBegin # Size in .debug_abbrev.dwo
142.endif
143