xref: /llvm-project/llvm/test/DebugInfo/X86/dw_op_constu.mir (revision d391e4fe841d4289137b6cb1463fce2d1853a5eb)
1# RUN: llc -o - %s -start-after=patchable-function -O0 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
2
3# Test dwarf codegen of:
4#   - DW_OP_constu, X, DW_OP_minus
5#   - DW_OP_constu, X, DW_OP_plus
6#   - DW_OP_plus_uconst, X
7# when feeding a DW_OP_breg.
8#
9# Internally in LLVM the value X is saved as an "uint64_t".  But when
10# DwarfExpression::addMachineRegExpression is trying to simplify the DWARF by
11# folding such expressions into a DW_OP_breg (or DW_OP_fbreg) the offset is
12# converted to an "int".  We must be careful when doing those folds, checking
13# that X is in the range for "int".
14
15--- |
16  define void @test() !dbg !5 {
17  entry:
18    ret void, !dbg !14
19  }
20
21  !llvm.dbg.cu = !{!0}
22  !llvm.module.flags = !{!3, !4}
23
24  !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
25  !1 = !DIFile(filename: "1.cc", directory: "/tmp")
26  !2 = !{}
27  !3 = !{i32 2, !"Dwarf Version", i32 4}
28  !4 = !{i32 2, !"Debug Info Version", i32 3}
29  !5 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 4, type: !6, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
30  !6 = !DISubroutineType(types: !7)
31  !7 = !{null}
32  !8 = !{!9}
33  !9 = !DILocalVariable(name: "buf", scope: !5, file: !1, line: 5, type: !10)
34  !10 = !DICompositeType(tag: DW_TAG_array_type, baseType: !11, size: 3200, align: 32, elements: !12)
35  !11 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
36  !12 = !{!13}
37  !13 = !DISubrange(count: 100)
38  !14 = !DILocation(line: 7, column: 1, scope: !5)
39
40...
41---
42name:            test
43tracksRegLiveness: true
44body:             |
45
46  bb.0: ;-------------------------- DW_OP_plus -------------------------------
47
48    ; UINT_MAX
49    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
50    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967295, DW_OP_minus), debug-location !14
51
52    ; UINT_MAX+1
53    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
54    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967296, DW_OP_minus), debug-location !14
55
56    ; INT_MAX
57    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
58    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483647, DW_OP_minus), debug-location !14
59
60    ; INT_MAX+1
61    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
62    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483648, DW_OP_minus), debug-location !14
63
64    ; 0
65    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
66    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 0, DW_OP_minus), debug-location !14
67
68    ; -1
69    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
70    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551615, DW_OP_minus), debug-location !14
71
72    ; -2
73    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
74    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551614, DW_OP_minus), debug-location !14
75
76    RET64 debug-location !14
77
78
79  bb.1: ;-------------------------- DW_OP_plus -------------------------------
80
81    ; UINT_MAX
82    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
83    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967295, DW_OP_plus), debug-location !14
84
85    ; UINT_MAX+1
86    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
87    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 4294967296, DW_OP_plus), debug-location !14
88
89    ; INT_MAX
90    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
91    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483647, DW_OP_plus), debug-location !14
92
93    ; INT_MAX+1
94    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
95    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 2147483648, DW_OP_plus), debug-location !14
96
97    ; 0
98    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
99    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 0, DW_OP_plus), debug-location !14
100
101    ; -1
102    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
103    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551615, DW_OP_plus), debug-location !14
104
105    ; -2
106    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
107    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_constu, 18446744073709551614, DW_OP_plus), debug-location !14
108
109    RET64 debug-location !14
110
111
112  bb.2: ;-------------------------- DW_OP_plus_uconst -------------------------------
113
114    ; UINT_MAX
115    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
116    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 4294967295), debug-location !14
117
118    ; UINT_MAX+1
119    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
120    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 4294967296), debug-location !14
121
122    ; INT_MAX
123    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
124    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 2147483647), debug-location !14
125
126    ; INT_MAX+1
127    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
128    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 2147483648), debug-location !14
129
130    ; 0
131    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
132    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 0), debug-location !14
133
134    ; -1
135    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
136    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 18446744073709551615), debug-location !14
137
138    ; -2
139    renamable $rcx = MOV64rm renamable $noreg, 1, $noreg, 0, $fs
140    DBG_VALUE renamable $rcx, 0, !9, !DIExpression(DW_OP_plus_uconst, 18446744073709551614), debug-location !14
141
142    RET64 debug-location !14
143
144...
145
146
147# CHECK-LABEL: .Ldebug_loc0:
148# CHECK-NEXT:         .quad   .Ltmp0-.Lfunc_begin0
149# CHECK-NEXT:         .quad   .Ltmp1-.Lfunc_begin0
150# CHECK-NEXT:         .short  9                       # Loc expr size
151# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
152# CHECK-NEXT:         .byte   0                       # 0
153# CHECK-NEXT:         .byte   16                      # DW_OP_constu
154# CHECK-NEXT:         .byte   255                     # 4294967295
155# CHECK-NEXT:         .byte   255                     #
156# CHECK-NEXT:         .byte   255                     #
157# CHECK-NEXT:         .byte   255                     #
158# CHECK-NEXT:         .byte   15                      #
159# CHECK-NEXT:         .byte   28                      # DW_OP_minus
160# CHECK-NEXT:         .quad   .Ltmp1-.Lfunc_begin0
161# CHECK-NEXT:         .quad   .Ltmp2-.Lfunc_begin0
162# CHECK-NEXT:         .short  9                       # Loc expr size
163# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
164# CHECK-NEXT:         .byte   0                       # 0
165# CHECK-NEXT:         .byte   16                      # DW_OP_constu
166# CHECK-NEXT:         .byte   128                     # 4294967296
167# CHECK-NEXT:         .byte   128                     #
168# CHECK-NEXT:         .byte   128                     #
169# CHECK-NEXT:         .byte   128                     #
170# CHECK-NEXT:         .byte   16                      #
171# CHECK-NEXT:         .byte   28                      # DW_OP_minus
172# CHECK-NEXT:         .quad   .Ltmp2-.Lfunc_begin0
173# CHECK-NEXT:         .quad   .Ltmp3-.Lfunc_begin0
174# CHECK-NEXT:         .short  6                       # Loc expr size
175# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
176# CHECK-NEXT:         .byte   129                     # -2147483647
177# CHECK-NEXT:         .byte   128                     #
178# CHECK-NEXT:         .byte   128                     #
179# CHECK-NEXT:         .byte   128                     #
180# CHECK-NEXT:         .byte   120                     #
181# CHECK-NEXT:         .quad   .Ltmp3-.Lfunc_begin0
182# CHECK-NEXT:         .quad   .Ltmp4-.Lfunc_begin0
183# CHECK-NEXT:         .short  6                       # Loc expr size
184# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
185# CHECK-NEXT:         .byte   128                     # -2147483648
186# CHECK-NEXT:         .byte   128                     #
187# CHECK-NEXT:         .byte   128                     #
188# CHECK-NEXT:         .byte   128                     #
189# CHECK-NEXT:         .byte   120                     #
190# CHECK-NEXT:         .quad   .Ltmp4-.Lfunc_begin0
191# CHECK-NEXT:         .quad   .Ltmp5-.Lfunc_begin0
192# CHECK-NEXT:         .short  2                       # Loc expr size
193# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
194# CHECK-NEXT:         .byte   0                       # 0
195# CHECK-NEXT:         .quad   .Ltmp5-.Lfunc_begin0
196# CHECK-NEXT:         .quad   .Ltmp6-.Lfunc_begin0
197# CHECK-NEXT:         .short  5                       # Loc expr size
198# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
199# CHECK-NEXT:         .byte   0                       # 0
200# CHECK-NEXT:         .byte   48                      # DW_OP_lit0
201# CHECK-NEXT:         .byte   32                      # DW_OP_not
202# CHECK-NEXT:         .byte   28                      # DW_OP_minus
203# CHECK-NEXT:         .quad   .Ltmp6-.Lfunc_begin0
204# CHECK-NEXT:         .quad   .Ltmp7-.Lfunc_begin0
205# CHECK-NEXT:         .short  14                      # Loc expr size
206# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
207# CHECK-NEXT:         .byte   0                       # 0
208# CHECK-NEXT:         .byte   16                      # DW_OP_constu
209# CHECK-NEXT:         .byte   254                     # 18446744073709551614
210# CHECK-NEXT:         .byte   255                     #
211# CHECK-NEXT:         .byte   255                     #
212# CHECK-NEXT:         .byte   255                     #
213# CHECK-NEXT:         .byte   255                     #
214# CHECK-NEXT:         .byte   255                     #
215# CHECK-NEXT:         .byte   255                     #
216# CHECK-NEXT:         .byte   255                     #
217# CHECK-NEXT:         .byte   255                     #
218# CHECK-NEXT:         .byte   1                       #
219# CHECK-NEXT:         .byte   28                      # DW_OP_minus
220#-----------------------------------------------------------------------
221# CHECK-NEXT:         .quad   .Ltmp8-.Lfunc_begin0
222# CHECK-NEXT:         .quad   .Ltmp9-.Lfunc_begin0
223# CHECK-NEXT:         .short  9                       # Loc expr size
224# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
225# CHECK-NEXT:         .byte   0                       # 0
226# CHECK-NEXT:         .byte   16                      # DW_OP_constu
227# CHECK-NEXT:         .byte   255                     # 4294967295
228# CHECK-NEXT:         .byte   255                     #
229# CHECK-NEXT:         .byte   255                     #
230# CHECK-NEXT:         .byte   255                     #
231# CHECK-NEXT:         .byte   15                      #
232# CHECK-NEXT:         .byte   34                      # DW_OP_plus
233# CHECK-NEXT:         .quad   .Ltmp9-.Lfunc_begin0
234# CHECK-NEXT:         .quad   .Ltmp10-.Lfunc_begin0
235# CHECK-NEXT:         .short  9                       # Loc expr size
236# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
237# CHECK-NEXT:         .byte   0                       # 0
238# CHECK-NEXT:         .byte   16                      # DW_OP_constu
239# CHECK-NEXT:         .byte   128                     # 4294967296
240# CHECK-NEXT:         .byte   128                     #
241# CHECK-NEXT:         .byte   128                     #
242# CHECK-NEXT:         .byte   128                     #
243# CHECK-NEXT:         .byte   16                      #
244# CHECK-NEXT:         .byte   34                      # DW_OP_plus
245# CHECK-NEXT:         .quad   .Ltmp10-.Lfunc_begin0
246# CHECK-NEXT:         .quad   .Ltmp11-.Lfunc_begin0
247# CHECK-NEXT:         .short  6                       # Loc expr size
248# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
249# CHECK-NEXT:         .byte   255                     # 2147483647
250# CHECK-NEXT:         .byte   255                     #
251# CHECK-NEXT:         .byte   255                     #
252# CHECK-NEXT:         .byte   255                     #
253# CHECK-NEXT:         .byte   7                       #
254# CHECK-NEXT:         .quad   .Ltmp11-.Lfunc_begin0
255# CHECK-NEXT:         .quad   .Ltmp12-.Lfunc_begin0
256# CHECK-NEXT:         .short  9                       # Loc expr size
257# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
258# CHECK-NEXT:         .byte   0                       # 0
259# CHECK-NEXT:         .byte   16                      # DW_OP_constu
260# CHECK-NEXT:         .byte   128                     # 2147483648
261# CHECK-NEXT:         .byte   128                     #
262# CHECK-NEXT:         .byte   128                     #
263# CHECK-NEXT:         .byte   128                     #
264# CHECK-NEXT:         .byte   8                       #
265# CHECK-NEXT:         .byte   34                      # DW_OP_plus
266# CHECK-NEXT:         .quad   .Ltmp12-.Lfunc_begin0
267# CHECK-NEXT:         .quad   .Ltmp13-.Lfunc_begin0
268# CHECK-NEXT:         .short  2                       # Loc expr size
269# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
270# CHECK-NEXT:         .byte   0                       # 0
271# CHECK-NEXT:         .quad   .Ltmp13-.Lfunc_begin0
272# CHECK-NEXT:         .quad   .Ltmp14-.Lfunc_begin0
273# CHECK-NEXT:         .short  5                       # Loc expr size
274# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
275# CHECK-NEXT:         .byte   0                       # 0
276# CHECK-NEXT:         .byte   48                      # DW_OP_lit0
277# CHECK-NEXT:         .byte   32                      # DW_OP_not
278# CHECK-NEXT:         .byte   34                      # DW_OP_plus
279# CHECK-NEXT:         .quad   .Ltmp14-.Lfunc_begin0
280# CHECK-NEXT:         .quad   .Ltmp15-.Lfunc_begin0
281# CHECK-NEXT:         .short  14                      # Loc expr size
282# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
283# CHECK-NEXT:         .byte   0                       # 0
284# CHECK-NEXT:         .byte   16                      # DW_OP_constu
285# CHECK-NEXT:         .byte   254                     # 18446744073709551614
286# CHECK-NEXT:         .byte   255                     #
287# CHECK-NEXT:         .byte   255                     #
288# CHECK-NEXT:         .byte   255                     #
289# CHECK-NEXT:         .byte   255                     #
290# CHECK-NEXT:         .byte   255                     #
291# CHECK-NEXT:         .byte   255                     #
292# CHECK-NEXT:         .byte   255                     #
293# CHECK-NEXT:         .byte   255                     #
294# CHECK-NEXT:         .byte   1                       #
295# CHECK-NEXT:         .byte   34                      # DW_OP_plus
296#-----------------------------------------------------------------------
297# CHECK-NEXT:         .quad   .Ltmp16-.Lfunc_begin0
298# CHECK-NEXT:         .quad   .Ltmp17-.Lfunc_begin0
299# CHECK-NEXT:         .short  8                       # Loc expr size
300# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
301# CHECK-NEXT:         .byte   0                       # 0
302# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
303# CHECK-NEXT:         .byte   255                     # 4294967295
304# CHECK-NEXT:         .byte   255                     #
305# CHECK-NEXT:         .byte   255                     #
306# CHECK-NEXT:         .byte   255                     #
307# CHECK-NEXT:         .byte   15                      #
308# CHECK-NEXT:         .quad   .Ltmp17-.Lfunc_begin0
309# CHECK-NEXT:         .quad   .Ltmp18-.Lfunc_begin0
310# CHECK-NEXT:         .short  8                       # Loc expr size
311# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
312# CHECK-NEXT:         .byte   0                       # 0
313# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
314# CHECK-NEXT:         .byte   128                     # 4294967296
315# CHECK-NEXT:         .byte   128                     #
316# CHECK-NEXT:         .byte   128                     #
317# CHECK-NEXT:         .byte   128                     #
318# CHECK-NEXT:         .byte   16                      #
319# CHECK-NEXT:         .quad   .Ltmp18-.Lfunc_begin0
320# CHECK-NEXT:         .quad   .Ltmp19-.Lfunc_begin0
321# CHECK-NEXT:         .short  6                       # Loc expr size
322# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
323# CHECK-NEXT:         .byte   255                     # 2147483647
324# CHECK-NEXT:         .byte   255                     #
325# CHECK-NEXT:         .byte   255                     #
326# CHECK-NEXT:         .byte   255                     #
327# CHECK-NEXT:         .byte   7                       #
328# CHECK-NEXT:         .quad   .Ltmp19-.Lfunc_begin0
329# CHECK-NEXT:         .quad   .Ltmp20-.Lfunc_begin0
330# CHECK-NEXT:         .short  8                       # Loc expr size
331# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
332# CHECK-NEXT:         .byte   0                       # 0
333# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
334# CHECK-NEXT:         .byte   128                     # 2147483648
335# CHECK-NEXT:         .byte   128                     #
336# CHECK-NEXT:         .byte   128                     #
337# CHECK-NEXT:         .byte   128                     #
338# CHECK-NEXT:         .byte   8                       #
339# CHECK-NEXT:         .quad   .Ltmp20-.Lfunc_begin0
340# CHECK-NEXT:         .quad   .Ltmp21-.Lfunc_begin0
341# CHECK-NEXT:         .short  2                       # Loc expr size
342# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
343# CHECK-NEXT:         .byte   0                       # 0
344# CHECK-NEXT:         .quad   .Ltmp21-.Lfunc_begin0
345# CHECK-NEXT:         .quad   .Ltmp22-.Lfunc_begin0
346# CHECK-NEXT:         .short  13                      # Loc expr size
347# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
348# CHECK-NEXT:         .byte   0                       # 0
349# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
350# CHECK-NEXT:         .byte   255                     # 18446744073709551615
351# CHECK-NEXT:         .byte   255                     #
352# CHECK-NEXT:         .byte   255                     #
353# CHECK-NEXT:         .byte   255                     #
354# CHECK-NEXT:         .byte   255                     #
355# CHECK-NEXT:         .byte   255                     #
356# CHECK-NEXT:         .byte   255                     #
357# CHECK-NEXT:         .byte   255                     #
358# CHECK-NEXT:         .byte   255                     #
359# CHECK-NEXT:         .byte   1                       #
360# CHECK-NEXT:         .quad   .Ltmp22-.Lfunc_begin0
361# CHECK-NEXT:         .quad   .Lfunc_end0-.Lfunc_begin0
362# CHECK-NEXT:         .short  13                      # Loc expr size
363# CHECK-NEXT:         .byte   114                     # DW_OP_breg2
364# CHECK-NEXT:         .byte   0                       # 0
365# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
366# CHECK-NEXT:         .byte   254                     # 18446744073709551614
367# CHECK-NEXT:         .byte   255                     #
368# CHECK-NEXT:         .byte   255                     #
369# CHECK-NEXT:         .byte   255                     #
370# CHECK-NEXT:         .byte   255                     #
371# CHECK-NEXT:         .byte   255                     #
372# CHECK-NEXT:         .byte   255                     #
373# CHECK-NEXT:         .byte   255                     #
374# CHECK-NEXT:         .byte   255                     #
375# CHECK-NEXT:         .byte   1                       #
376# CHECK-NEXT:         .quad   0
377# CHECK-NEXT:         .quad   0
378