File: ptrauth-value-witnesses.sil

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (110 lines) | stat: -rw-r--r-- 5,268 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls

// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios

import Builtin

struct S { var a, b, c: Builtin.NativeObject }
// CHECK: @"$s4test1SVwCP.ptrauth" = private constant {{.*}} i64 55882
// CHECK: @"$s4test1SVwxx.ptrauth" = private constant {{.*}} i64 1272
// CHECK: @"$s4test1SVwcp.ptrauth" = private constant {{.*}} i64 58298
// CHECK: @"$s4test1SVwca.ptrauth" = private constant {{.*}} i64 34641
// CHECK: @__swift_memcpy24_8.ptrauth = private constant {{.*}} i64 18648
// CHECK: @"$s4test1SVwta.ptrauth" = private constant {{.*}} i64 61402
// CHECK: @"$s4test1SVwet.ptrauth" = private constant {{.*}} i64 24816
// CHECK: @"$s4test1SVwst.ptrauth" = private constant {{.*}} i64 41169

sil @test_destroy : $@convention(thin) <T> (@in T) -> () {
bb0(%0 : $*T):
  destroy_addr %0 : $*T
  %result = tuple ()
  return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_destroy(
// CHECK:      [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
// CHECK-NEXT: call void [[T0]](ptr noalias %0, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void

sil @test_copy_init : $@convention(thin) <T> (@in_guaranteed T) -> (@out T) {
bb0(%0 : $*T, %1 : $*T):
  copy_addr %1 to [init] %0 : $*T
  %result = tuple ()
  return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_copy_init(
// CHECK:      [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 58298)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void

sil @test_take_init : $@convention(thin) <T> (@in T) -> (@out T) {
bb0(%0 : $*T, %1 : $*T):
  copy_addr [take] %1 to [init] %0 : $*T
  %result = tuple ()
  return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_take_init(
// CHECK:      [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 18648)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void

sil @test_copy_assign : $@convention(thin) <T> (@inout T, @in_guaranteed T) -> () {
bb0(%0 : $*T, %1 : $*T):
  copy_addr %1 to %0 : $*T
  %result = tuple ()
  return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_copy_assign(
// CHECK:      [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 34641)
// CHECK-NEXT: call ptr [[T0]](ptr %0, ptr %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void

sil @test_take_assign : $@convention(thin) <T> (@inout T, @in T) -> () {
bb0(%0 : $*T, %1 : $*T):
  copy_addr [take] %1 to %0 : $*T
  %result = tuple ()
  return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_take_assign(
// CHECK:      [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 61402)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void

// Make sure that the local-type-data caching mechanism sets things up right.
sil @test_destroy_twice : $@convention(thin) <T> (@in T, @in T) -> () {
bb0(%0 : $*T, %1 : $*T):
  destroy_addr %0 : $*T
  destroy_addr %1 : $*T
  %result = tuple ()
  return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_destroy_twice(
// CHECK:      [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
// CHECK-NEXT: call void [[T0]](ptr noalias %0, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: call void [[T0]](ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void