diff --git a/test/IRGen/keypaths.sil b/test/IRGen/keypaths.sil index 977131856e2..4b638ebde3b 100644 --- a/test/IRGen/keypaths.sil +++ b/test/IRGen/keypaths.sil @@ -1,4 +1,7 @@ -// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize +// RUN: rm -rf %t && mkdir -p %t +// -- Convert constants to decimal constants that LLVM will print +// RUN: %utils/chex.py < %s > %t/keypaths.sil +// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %t/keypaths.sil --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize sil_stage canonical import Swift @@ -27,8 +30,8 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0004 - instantiable in-line, size 4 -// CHECK-SAME: i32 -2147483644, +// -- instantiable in-line, size 4 +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- offset of S.x // CHECK-SAME: i32 0 }> @@ -38,8 +41,8 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0004 - instantiable in-line, size 4 -// CHECK-SAME: i32 -2147483644, +// -- instantiable in-line, size 4 +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- offset of S.y // CHECK-32-SAME: i32 4 }> @@ -50,8 +53,8 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0004 - instantiable in-line, size 4 -// CHECK-SAME: i32 -2147483644, +// -- instantiable in-line, size 4 +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- offset of S.z // CHECK-32-SAME: i32 16 }> @@ -62,46 +65,46 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0004 - instantiable in-line, size 4 -// CHECK-SAME: i32 -2147483644, +// -- instantiable in-line, size 4 +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- 0x4000_0000 (class) + offset of C.x -// CHECK-32-SAME: i32 1073741836 }> -// CHECK-64-SAME: i32 1073741840 }> +// CHECK-32-SAME: }> +// CHECK-64-SAME: }> // -- %e: C.y // CHECK: [[KP_E:@keypath.*]] = private global <{ {{.*}} }> <{ // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0004 - instantiable in-line, size 4 -// CHECK-SAME: i32 -2147483644, +// -- instantiable in-line, size 4 +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- 0x4000_0000 (class) + offset of C.y -// CHECK-32-SAME: i32 1073741840 }> -// CHECK-64-SAME: i32 1073741848 }> +// CHECK-32-SAME: }> +// CHECK-64-SAME: }> // -- %f: C.z // CHECK: [[KP_F:@keypath.*]] = private global <{ {{.*}} }> <{ // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0004 - instantiable in-line, size 4 -// CHECK-SAME: i32 -2147483644, +// -- instantiable in-line, size 4 +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- 0x4000_0000 (class) + offset of C.z -// CHECK-32-SAME: i32 1073741852 }> -// CHECK-64-SAME: i32 1073741872 }> +// CHECK-32-SAME: }> +// CHECK-64-SAME: }> // -- %g: S.z.x // CHECK: [[KP_G:@keypath.*]] = private global <{ {{.*}} }> <{ // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_000c - instantiable in-line, size 12 -// CHECK-32-SAME: i32 -2147483636, -// -- 0x8000_0014 - instantiable in-line, size 16 -// CHECK-64-SAME: i32 -2147483628, +// -- instantiable in-line, size 12 +// CHECK-32-SAME: , +// -- instantiable in-line, size 20 +// CHECK-64-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- offset of S.z // CHECK-32-SAME: i32 16, @@ -109,22 +112,22 @@ sil_vtable C {} // CHECK-64-SAME: [4 x i8] zeroinitializer, // CHECK: %swift.type* (i8*)* // -- 0x4000_0000 (class) + offset of C.x -// CHECK-32-SAME: i32 1073741836 }> -// CHECK-64-SAME: i32 1073741840 }> +// CHECK-32-SAME: }> +// CHECK-64-SAME: }> // -- %h: C.z.x // CHECK: [[KP_H:@keypath.*]] = private global <{ {{.*}} }> <{ // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_000c - instantiable in-line, size 12 -// CHECK-32-SAME: i32 -2147483636, -// -- 0x8000_0014 - instantiable in-line, size 16 -// CHECK-64-SAME: i32 -2147483628, +// -- instantiable in-line, size 12 +// CHECK-32-SAME: , +// -- instantiable in-line, size 20 +// CHECK-64-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // -- 0x4000_0000 (class) + offset of C.z -// CHECK-32-SAME: i32 1073741852, -// CHECK-64-SAME: i32 1073741872, +// CHECK-32-SAME: , +// CHECK-64-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // CHECK: %swift.type* (i8*)* // -- offset of S.x @@ -135,13 +138,13 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0018 - instantiable in-line, size 24 -// CHECK-64-SAME: i32 -2147483624, +// -- instantiable in-line, size 24 +// CHECK-64-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, -// -- 0x8000_000c - instantiable in-line, size 12 -// CHECK-32-SAME: i32 -2147483636, -// -- 0x2000_0000 - computed, get-only, identified by function pointer, no args -// CHECK-SAME: i32 536870912, +// -- instantiable in-line, size 12 +// CHECK-32-SAME: , +// -- computed, get-only, identified by function pointer, no args +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // CHECK-SAME: void ()* @k_id, // CHECK-SAME: void (%TSi*, %T8keypaths1SV*)* @k_get }> @@ -151,13 +154,13 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0020 - instantiable in-line, size 32 -// CHECK-64-SAME: i32 -2147483616, +// -- instantiable in-line, size 32 +// CHECK-64-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, -// -- 0x8000_0010 - instantiable in-line, size 16 -// CHECK-32-SAME: i32 -2147483632, -// -- 0x2a00_0000 - computed, settable, nonmutating, identified by vtable, no args -// CHECK-SAME: i32 704643072, +// -- instantiable in-line, size 16 +// CHECK-32-SAME: , +// -- computed, settable, nonmutating, identified by vtable, no args +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // CHECK-SAME: [[WORD]] // CHECK-SAME: void (%TSi*, %T8keypaths1CC**)* @l_get, @@ -168,13 +171,13 @@ sil_vtable C {} // CHECK-SAME: [[WORD]] 0, // CHECK-SAME: %swift.type* (i8*)* // CHECK-SAME: %swift.type* (i8*)* -// -- 0x8000_0020 - instantiable in-line, size 32 -// CHECK-64-SAME: i32 -2147483616, +// -- instantiable in-line, size 32 +// CHECK-64-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, -// -- 0x8000_0010 - instantiable in-line, size 16 -// CHECK-32-SAME: i32 -2147483632, -// -- 0x3c00_0000 - computed, settable, nonmutating, identified by property offset, no args -// CHECK-SAME: i32 1006632960, +// -- instantiable in-line, size 16 +// CHECK-32-SAME: , +// -- computed, settable, nonmutating, identified by property offset, no args +// CHECK-SAME: , // CHECK-64-SAME: [4 x i8] zeroinitializer, // CHECK-SAME: [[WORD]] // CHECK-SAME: void (%swift.function*, %T8keypaths1SV*)* @m_get, @@ -189,8 +192,8 @@ sil_vtable C {} // -- size 8 // CHECK-SAME: i32 8, // CHECK-64-SAME: [4 x i8] zeroinitializer, -// -- 0x1ffffffe - struct with runtime-resolved offset -// CHECK-SAME: i32 536870910, +// -- struct with runtime-resolved offset +// CHECK-SAME: , // CHECK-32-SAME: i32 12 }> // CHECK-64-SAME: i32 24 }> @@ -202,8 +205,8 @@ sil_vtable C {} // -- size 8 // CHECK-SAME: i32 8, // CHECK-64-SAME: [4 x i8] zeroinitializer, -// -- 0x1ffffffe - struct with runtime-resolved offset -// CHECK-SAME: i32 536870910, +// -- struct with runtime-resolved offset +// CHECK-SAME: , // CHECK-32-SAME: i32 16 }> // CHECK-64-SAME: i32 32 }> diff --git a/utils/chex.py b/utils/chex.py new file mode 100755 index 00000000000..e84b1fa10e5 --- /dev/null +++ b/utils/chex.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# Check HEX -- a stupid filter that allows hexadecimal literals to be checked +# for in LLVM IR FileCheck tests. It works by replacing occurrences of +# strings matching the regex /< (i[0-9]+) \s+ (0x[0-9A-Fa-f]+) >/x with the +# decimal literal equivalent that would really appear in printed LLVM IR. + +from __future__ import print_function + +import re +import sys + +hex = re.compile(r"""<(i([0-9]+)\s+)0x([0-9A-Fa-f_]+)>""") + + +def hexReplace(match): + # Integer type is match group 1 + ty = match.group(1) + # Integer bit width is match group 2 + bits = int(match.group(2)) + # Hex value is match group 3 + value = int(match.group(3).replace("_", ""), base=16) + # LLVM prints the decimal value as if it's two's-complement signed in + # the given bitwidth, so the printed value will be negative if + # greater than 2^(bits - 1) + if value >= (1 << (bits - 1)): + value -= 1 << bits + return ty + str(value) + + +for line in sys.stdin: + print(re.sub(hex, hexReplace, line), end="")