Skip to content

Commit 5b7e529

Browse files
committed
Add a utility script for checking for hex constants in IR tests.
LLVM always prints IR constants as signed decimal, which is not ideal when looking for packed bit patterns in tests. Add a little filter script that turns hex constants of the form `<iNN 0xNNNNN>` into the decimal output we'd expect from the LLVM printer.
1 parent 76f9826 commit 5b7e529

File tree

2 files changed

+87
-53
lines changed

2 files changed

+87
-53
lines changed

test/IRGen/keypaths.sil

Lines changed: 56 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
1+
// RUN: rm -rf %t && mkdir -p %t
2+
// -- Convert <i32 0x...> constants to decimal constants that LLVM will print
3+
// RUN: %utils/chex.py < %s > %t/keypaths.sil
4+
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %t/keypaths.sil --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
25

36
sil_stage canonical
47
import Swift
@@ -27,8 +30,8 @@ sil_vtable C {}
2730
// CHECK-SAME: [[WORD]] 0,
2831
// CHECK-SAME: %swift.type* (i8*)*
2932
// CHECK-SAME: %swift.type* (i8*)*
30-
// -- 0x8000_0004 - instantiable in-line, size 4
31-
// CHECK-SAME: i32 -2147483644,
33+
// -- instantiable in-line, size 4
34+
// CHECK-SAME: <i32 0x8000_0004>,
3235
// CHECK-64-SAME: [4 x i8] zeroinitializer,
3336
// -- offset of S.x
3437
// CHECK-SAME: i32 0 }>
@@ -38,8 +41,8 @@ sil_vtable C {}
3841
// CHECK-SAME: [[WORD]] 0,
3942
// CHECK-SAME: %swift.type* (i8*)*
4043
// CHECK-SAME: %swift.type* (i8*)*
41-
// -- 0x8000_0004 - instantiable in-line, size 4
42-
// CHECK-SAME: i32 -2147483644,
44+
// -- instantiable in-line, size 4
45+
// CHECK-SAME: <i32 0x8000_0004>,
4346
// CHECK-64-SAME: [4 x i8] zeroinitializer,
4447
// -- offset of S.y
4548
// CHECK-32-SAME: i32 4 }>
@@ -50,8 +53,8 @@ sil_vtable C {}
5053
// CHECK-SAME: [[WORD]] 0,
5154
// CHECK-SAME: %swift.type* (i8*)*
5255
// CHECK-SAME: %swift.type* (i8*)*
53-
// -- 0x8000_0004 - instantiable in-line, size 4
54-
// CHECK-SAME: i32 -2147483644,
56+
// -- instantiable in-line, size 4
57+
// CHECK-SAME: <i32 0x8000_0004>,
5558
// CHECK-64-SAME: [4 x i8] zeroinitializer,
5659
// -- offset of S.z
5760
// CHECK-32-SAME: i32 16 }>
@@ -62,69 +65,69 @@ sil_vtable C {}
6265
// CHECK-SAME: [[WORD]] 0,
6366
// CHECK-SAME: %swift.type* (i8*)*
6467
// CHECK-SAME: %swift.type* (i8*)*
65-
// -- 0x8000_0004 - instantiable in-line, size 4
66-
// CHECK-SAME: i32 -2147483644,
68+
// -- instantiable in-line, size 4
69+
// CHECK-SAME: <i32 0x8000_0004>,
6770
// CHECK-64-SAME: [4 x i8] zeroinitializer,
6871
// -- 0x4000_0000 (class) + offset of C.x
69-
// CHECK-32-SAME: i32 1073741836 }>
70-
// CHECK-64-SAME: i32 1073741840 }>
72+
// CHECK-32-SAME: <i32 0x4000_000c> }>
73+
// CHECK-64-SAME: <i32 0x4000_0010> }>
7174

7275
// -- %e: C.y
7376
// CHECK: [[KP_E:@keypath.*]] = private global <{ {{.*}} }> <{
7477
// CHECK-SAME: [[WORD]] 0,
7578
// CHECK-SAME: %swift.type* (i8*)*
7679
// CHECK-SAME: %swift.type* (i8*)*
77-
// -- 0x8000_0004 - instantiable in-line, size 4
78-
// CHECK-SAME: i32 -2147483644,
80+
// -- instantiable in-line, size 4
81+
// CHECK-SAME: <i32 0x8000_0004>,
7982
// CHECK-64-SAME: [4 x i8] zeroinitializer,
8083
// -- 0x4000_0000 (class) + offset of C.y
81-
// CHECK-32-SAME: i32 1073741840 }>
82-
// CHECK-64-SAME: i32 1073741848 }>
84+
// CHECK-32-SAME: <i32 0x4000_0010> }>
85+
// CHECK-64-SAME: <i32 0x4000_0018> }>
8386

8487
// -- %f: C.z
8588
// CHECK: [[KP_F:@keypath.*]] = private global <{ {{.*}} }> <{
8689
// CHECK-SAME: [[WORD]] 0,
8790
// CHECK-SAME: %swift.type* (i8*)*
8891
// CHECK-SAME: %swift.type* (i8*)*
89-
// -- 0x8000_0004 - instantiable in-line, size 4
90-
// CHECK-SAME: i32 -2147483644,
92+
// -- instantiable in-line, size 4
93+
// CHECK-SAME: <i32 0x8000_0004>,
9194
// CHECK-64-SAME: [4 x i8] zeroinitializer,
9295
// -- 0x4000_0000 (class) + offset of C.z
93-
// CHECK-32-SAME: i32 1073741852 }>
94-
// CHECK-64-SAME: i32 1073741872 }>
96+
// CHECK-32-SAME: <i32 0x4000_001c> }>
97+
// CHECK-64-SAME: <i32 0x4000_0030> }>
9598

9699
// -- %g: S.z.x
97100
// CHECK: [[KP_G:@keypath.*]] = private global <{ {{.*}} }> <{
98101
// CHECK-SAME: [[WORD]] 0,
99102
// CHECK-SAME: %swift.type* (i8*)*
100103
// CHECK-SAME: %swift.type* (i8*)*
101-
// -- 0x8000_000c - instantiable in-line, size 12
102-
// CHECK-32-SAME: i32 -2147483636,
103-
// -- 0x8000_0014 - instantiable in-line, size 16
104-
// CHECK-64-SAME: i32 -2147483628,
104+
// -- instantiable in-line, size 12
105+
// CHECK-32-SAME: <i32 0x8000_000c>,
106+
// -- instantiable in-line, size 20
107+
// CHECK-64-SAME: <i32 0x8000_0014>,
105108
// CHECK-64-SAME: [4 x i8] zeroinitializer,
106109
// -- offset of S.z
107110
// CHECK-32-SAME: i32 16,
108111
// CHECK-64-SAME: i32 32,
109112
// CHECK-64-SAME: [4 x i8] zeroinitializer,
110113
// CHECK: %swift.type* (i8*)*
111114
// -- 0x4000_0000 (class) + offset of C.x
112-
// CHECK-32-SAME: i32 1073741836 }>
113-
// CHECK-64-SAME: i32 1073741840 }>
115+
// CHECK-32-SAME: <i32 0x4000_000c> }>
116+
// CHECK-64-SAME: <i32 0x4000_0010> }>
114117

115118
// -- %h: C.z.x
116119
// CHECK: [[KP_H:@keypath.*]] = private global <{ {{.*}} }> <{
117120
// CHECK-SAME: [[WORD]] 0,
118121
// CHECK-SAME: %swift.type* (i8*)*
119122
// CHECK-SAME: %swift.type* (i8*)*
120-
// -- 0x8000_000c - instantiable in-line, size 12
121-
// CHECK-32-SAME: i32 -2147483636,
122-
// -- 0x8000_0014 - instantiable in-line, size 16
123-
// CHECK-64-SAME: i32 -2147483628,
123+
// -- instantiable in-line, size 12
124+
// CHECK-32-SAME: <i32 0x8000_000c>,
125+
// -- instantiable in-line, size 20
126+
// CHECK-64-SAME: <i32 0x8000_0014>,
124127
// CHECK-64-SAME: [4 x i8] zeroinitializer,
125128
// -- 0x4000_0000 (class) + offset of C.z
126-
// CHECK-32-SAME: i32 1073741852,
127-
// CHECK-64-SAME: i32 1073741872,
129+
// CHECK-32-SAME: <i32 0x4000_001c>,
130+
// CHECK-64-SAME: <i32 0x4000_0030>,
128131
// CHECK-64-SAME: [4 x i8] zeroinitializer,
129132
// CHECK: %swift.type* (i8*)*
130133
// -- offset of S.x
@@ -135,13 +138,13 @@ sil_vtable C {}
135138
// CHECK-SAME: [[WORD]] 0,
136139
// CHECK-SAME: %swift.type* (i8*)*
137140
// CHECK-SAME: %swift.type* (i8*)*
138-
// -- 0x8000_0018 - instantiable in-line, size 24
139-
// CHECK-64-SAME: i32 -2147483624,
141+
// -- instantiable in-line, size 24
142+
// CHECK-64-SAME: <i32 0x8000_0018>,
140143
// CHECK-64-SAME: [4 x i8] zeroinitializer,
141-
// -- 0x8000_000c - instantiable in-line, size 12
142-
// CHECK-32-SAME: i32 -2147483636,
143-
// -- 0x2000_0000 - computed, get-only, identified by function pointer, no args
144-
// CHECK-SAME: i32 536870912,
144+
// -- instantiable in-line, size 12
145+
// CHECK-32-SAME: <i32 0x8000_000c>,
146+
// -- computed, get-only, identified by function pointer, no args
147+
// CHECK-SAME: <i32 0x2000_0000>,
145148
// CHECK-64-SAME: [4 x i8] zeroinitializer,
146149
// CHECK-SAME: void ()* @k_id,
147150
// CHECK-SAME: void (%TSi*, %T8keypaths1SV*)* @k_get }>
@@ -151,13 +154,13 @@ sil_vtable C {}
151154
// CHECK-SAME: [[WORD]] 0,
152155
// CHECK-SAME: %swift.type* (i8*)*
153156
// CHECK-SAME: %swift.type* (i8*)*
154-
// -- 0x8000_0020 - instantiable in-line, size 32
155-
// CHECK-64-SAME: i32 -2147483616,
157+
// -- instantiable in-line, size 32
158+
// CHECK-64-SAME: <i32 0x8000_0020>,
156159
// CHECK-64-SAME: [4 x i8] zeroinitializer,
157-
// -- 0x8000_0010 - instantiable in-line, size 16
158-
// CHECK-32-SAME: i32 -2147483632,
159-
// -- 0x2a00_0000 - computed, settable, nonmutating, identified by vtable, no args
160-
// CHECK-SAME: i32 704643072,
160+
// -- instantiable in-line, size 16
161+
// CHECK-32-SAME: <i32 0x8000_0010>,
162+
// -- computed, settable, nonmutating, identified by vtable, no args
163+
// CHECK-SAME: <i32 0x2a00_0000>,
161164
// CHECK-64-SAME: [4 x i8] zeroinitializer,
162165
// CHECK-SAME: [[WORD]]
163166
// CHECK-SAME: void (%TSi*, %T8keypaths1CC**)* @l_get,
@@ -168,13 +171,13 @@ sil_vtable C {}
168171
// CHECK-SAME: [[WORD]] 0,
169172
// CHECK-SAME: %swift.type* (i8*)*
170173
// CHECK-SAME: %swift.type* (i8*)*
171-
// -- 0x8000_0020 - instantiable in-line, size 32
172-
// CHECK-64-SAME: i32 -2147483616,
174+
// -- instantiable in-line, size 32
175+
// CHECK-64-SAME: <i32 0x8000_0020>,
173176
// CHECK-64-SAME: [4 x i8] zeroinitializer,
174-
// -- 0x8000_0010 - instantiable in-line, size 16
175-
// CHECK-32-SAME: i32 -2147483632,
176-
// -- 0x3c00_0000 - computed, settable, nonmutating, identified by property offset, no args
177-
// CHECK-SAME: i32 1006632960,
177+
// -- instantiable in-line, size 16
178+
// CHECK-32-SAME: <i32 0x8000_0010>,
179+
// -- computed, settable, nonmutating, identified by property offset, no args
180+
// CHECK-SAME: <i32 0x3c00_0000>,
178181
// CHECK-64-SAME: [4 x i8] zeroinitializer,
179182
// CHECK-SAME: [[WORD]]
180183
// CHECK-SAME: void (%swift.function*, %T8keypaths1SV*)* @m_get,
@@ -189,8 +192,8 @@ sil_vtable C {}
189192
// -- size 8
190193
// CHECK-SAME: i32 8,
191194
// CHECK-64-SAME: [4 x i8] zeroinitializer,
192-
// -- 0x1ffffffe - struct with runtime-resolved offset
193-
// CHECK-SAME: i32 536870910,
195+
// -- struct with runtime-resolved offset
196+
// CHECK-SAME: <i32 0x1ffffffe>,
194197
// CHECK-32-SAME: i32 12 }>
195198
// CHECK-64-SAME: i32 24 }>
196199

@@ -202,8 +205,8 @@ sil_vtable C {}
202205
// -- size 8
203206
// CHECK-SAME: i32 8,
204207
// CHECK-64-SAME: [4 x i8] zeroinitializer,
205-
// -- 0x1ffffffe - struct with runtime-resolved offset
206-
// CHECK-SAME: i32 536870910,
208+
// -- struct with runtime-resolved offset
209+
// CHECK-SAME: <i32 0x1ffffffe>,
207210
// CHECK-32-SAME: i32 16 }>
208211
// CHECK-64-SAME: i32 32 }>
209212

utils/chex.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/usr/bin/env python
2+
# Check HEX -- a stupid filter that allows hexadecimal literals to be checked
3+
# for in LLVM IR FileCheck tests. It works by replacing occurrences of
4+
# strings matching the regex /< (i[0-9]+) \s+ (0x[0-9A-Fa-f]+) >/x with the
5+
# decimal literal equivalent that would really appear in printed LLVM IR.
6+
7+
from __future__ import print_function
8+
9+
import re
10+
import sys
11+
12+
hex = re.compile(r"""<(i([0-9]+)\s+)0x([0-9A-Fa-f_]+)>""")
13+
14+
15+
def hexReplace(match):
16+
# Integer type is match group 1
17+
ty = match.group(1)
18+
# Integer bit width is match group 2
19+
bits = int(match.group(2))
20+
# Hex value is match group 3
21+
value = int(match.group(3).replace("_", ""), base=16)
22+
# LLVM prints the decimal value as if it's two's-complement signed in
23+
# the given bitwidth, so the printed value will be negative if
24+
# greater than 2^(bits - 1)
25+
if value >= (1 << (bits - 1)):
26+
value -= 1 << bits
27+
return ty + str(value)
28+
29+
30+
for line in sys.stdin:
31+
print(re.sub(hex, hexReplace, line), end="")

0 commit comments

Comments
 (0)