Skip to content

Commit 08312d0

Browse files
authored
Merge pull request #10508 from jckarter/chex
Add a utility script for checking for hex constants in IR tests.
2 parents 9ae6372 + 5b7e529 commit 08312d0

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)