6
6
#include <ptrcheck.h>
7
7
8
8
// TODO: rdar://114446928
9
- // CHECK-LABEL: define dso_local ptr @foo
10
- // CHECK-SAME: ( ptr noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0:[0-9]+]] {
9
+ // CHECK-LABEL: define dso_local ptr @foo(
10
+ // CHECK-SAME: ptr dead_on_return noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0:[0-9]+]] {
11
11
// CHECK-NEXT: entry:
12
12
// CHECK-NEXT: [[P_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
13
13
// CHECK-NEXT: [[LEN_ADDR:%.*]] = alloca i32, align 4
@@ -27,8 +27,8 @@ int * __counted_by_or_null(len) foo(int * __bidi_indexable p, int len) {
27
27
return p ;
28
28
}
29
29
30
- // CHECK-LABEL: define dso_local void @foo_assign
31
- // CHECK-SAME: ( ptr noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0]] {
30
+ // CHECK-LABEL: define dso_local void @foo_assign(
31
+ // CHECK-SAME: ptr dead_on_return noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0]] {
32
32
// CHECK-NEXT: entry:
33
33
// CHECK-NEXT: [[P_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
34
34
// CHECK-NEXT: [[LEN_ADDR:%.*]] = alloca i32, align 4
@@ -111,7 +111,7 @@ int * __counted_by_or_null(len) foo(int * __bidi_indexable p, int len) {
111
111
// CHECK-NEXT: br label [[LAND_END39]], !annotation [[META2]]
112
112
// CHECK: land.end39:
113
113
// CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ false, [[LAND_LHS_TRUE]] ], [ false, [[ENTRY:%.*]] ], [ [[TMP3]], [[LOR_END]] ], !annotation [[META2]]
114
- // CHECK-NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[TRAP:%.*]], !annotation [[META2]]
114
+ // CHECK-NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[TRAP:%.*]], !prof [[PROF3:![0-9]+]], ! annotation [[META2]]
115
115
// CHECK: trap:
116
116
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4:[0-9]+]], !annotation [[META2]]
117
117
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -131,17 +131,17 @@ void foo_assign(int * __bidi_indexable p, int len) {
131
131
int * __counted_by_or_null (size ) p2 = p ;
132
132
}
133
133
134
- // CHECK-LABEL: define dso_local void @bar
135
- // CHECK-SAME: ( ptr dead_on_unwind noalias writable sret(%"__bounds_safety::wide_ptr.bidi_indexable") align 8 [[AGG_RESULT:%.*]], ptr noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0]] {
134
+ // CHECK-LABEL: define dso_local void @bar(
135
+ // CHECK-SAME: ptr dead_on_unwind noalias writable sret(%"__bounds_safety::wide_ptr.bidi_indexable") align 8 [[AGG_RESULT:%.*]], ptr noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0]] {
136
136
// CHECK-NEXT: entry:
137
137
// CHECK-NEXT: [[P_ADDR:%.*]] = alloca ptr, align 8
138
138
// CHECK-NEXT: [[LEN_ADDR:%.*]] = alloca i32, align 4
139
139
// CHECK-NEXT: store ptr [[P]], ptr [[P_ADDR]], align 8
140
140
// CHECK-NEXT: store i32 [[LEN]], ptr [[LEN_ADDR]], align 4
141
141
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
142
142
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[LEN_ADDR]], align 4
143
- // CHECK-NEXT: [[TMP2:%.*]] = icmp ne ptr [[TMP0]], null, !annotation [[META3 :![0-9]+]]
144
- // CHECK-NEXT: br i1 [[TMP2]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META3 ]]
143
+ // CHECK-NEXT: [[TMP2:%.*]] = icmp ne ptr [[TMP0]], null, !annotation [[META4 :![0-9]+]]
144
+ // CHECK-NEXT: br i1 [[TMP2]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META4 ]]
145
145
// CHECK: boundscheck.notnull:
146
146
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP1]] to i64
147
147
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[IDX_EXT]]
@@ -167,8 +167,8 @@ int * __bidi_indexable bar(int * __counted_by_or_null(len) p, int len) {
167
167
return p ;
168
168
}
169
169
170
- // CHECK-LABEL: define dso_local void @bar_assign
171
- // CHECK-SAME: ( ptr noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0]] {
170
+ // CHECK-LABEL: define dso_local void @bar_assign(
171
+ // CHECK-SAME: ptr noundef [[P:%.*]], i32 noundef [[LEN:%.*]]) #[[ATTR0]] {
172
172
// CHECK-NEXT: entry:
173
173
// CHECK-NEXT: [[P_ADDR:%.*]] = alloca ptr, align 8
174
174
// CHECK-NEXT: [[LEN_ADDR:%.*]] = alloca i32, align 4
@@ -177,8 +177,8 @@ int * __bidi_indexable bar(int * __counted_by_or_null(len) p, int len) {
177
177
// CHECK-NEXT: store i32 [[LEN]], ptr [[LEN_ADDR]], align 4
178
178
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
179
179
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[LEN_ADDR]], align 4
180
- // CHECK-NEXT: [[TMP2:%.*]] = icmp ne ptr [[TMP0]], null, !annotation [[META3 ]]
181
- // CHECK-NEXT: br i1 [[TMP2]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META3 ]]
180
+ // CHECK-NEXT: [[TMP2:%.*]] = icmp ne ptr [[TMP0]], null, !annotation [[META4 ]]
181
+ // CHECK-NEXT: br i1 [[TMP2]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META4 ]]
182
182
// CHECK: boundscheck.notnull:
183
183
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP1]] to i64
184
184
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[IDX_EXT]]
@@ -204,8 +204,8 @@ void bar_assign(int * __counted_by_or_null(len) p, int len) {
204
204
int * __bidi_indexable p2 = p ;
205
205
}
206
206
207
- // CHECK-LABEL: define dso_local void @ptr_oob
208
- // CHECK-SAME: ( ) #[[ATTR0]] {
207
+ // CHECK-LABEL: define dso_local void @ptr_oob(
208
+ // CHECK-SAME: ) #[[ATTR0]] {
209
209
// CHECK-NEXT: entry:
210
210
// CHECK-NEXT: [[X:%.*]] = alloca i32, align 4
211
211
// CHECK-NEXT: [[P:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
@@ -302,7 +302,7 @@ void bar_assign(int * __counted_by_or_null(len) p, int len) {
302
302
// CHECK-NEXT: br label [[LAND_END34]], !annotation [[META2]]
303
303
// CHECK: land.end34:
304
304
// CHECK-NEXT: [[TMP15:%.*]] = phi i1 [ false, [[LAND_LHS_TRUE]] ], [ false, [[ENTRY:%.*]] ], [ [[TMP14]], [[LOR_END]] ], !annotation [[META2]]
305
- // CHECK-NEXT: br i1 [[TMP15]], label [[CONT:%.*]], label [[TRAP:%.*]], !annotation [[META2]]
305
+ // CHECK-NEXT: br i1 [[TMP15]], label [[CONT:%.*]], label [[TRAP:%.*]], !prof [[PROF3]], ! annotation [[META2]]
306
306
// CHECK: trap:
307
307
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4]], !annotation [[META2]]
308
308
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -324,8 +324,8 @@ void ptr_oob(void) {
324
324
int * __counted_by_or_null (4 ) q = p ;
325
325
}
326
326
327
- // CHECK-LABEL: define dso_local void @null_count_neg
328
- // CHECK-SAME: ( ptr dead_on_unwind noalias writable sret(%"__bounds_safety::wide_ptr.bidi_indexable") align 8 [[AGG_RESULT:%.*]]) #[[ATTR0]] {
327
+ // CHECK-LABEL: define dso_local void @null_count_neg(
328
+ // CHECK-SAME: ptr dead_on_unwind noalias writable sret(%"__bounds_safety::wide_ptr.bidi_indexable") align 8 [[AGG_RESULT:%.*]]) #[[ATTR0]] {
329
329
// CHECK-NEXT: entry:
330
330
// CHECK-NEXT: [[P:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
331
331
// CHECK-NEXT: [[COUNT:%.*]] = alloca i32, align 4
@@ -340,8 +340,8 @@ void ptr_oob(void) {
340
340
// CHECK-NEXT: [[AGG_TEMP26:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
341
341
// CHECK-NEXT: [[AGG_TEMP36:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
342
342
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[P]], i8 0, i64 24, i1 false)
343
- // CHECK-NEXT: store i32 0, ptr [[COUNT]], align 4, !annotation [[META4 :![0-9]+]]
344
- // CHECK-NEXT: store ptr null, ptr [[Q]], align 8, !annotation [[META4 ]]
343
+ // CHECK-NEXT: store i32 0, ptr [[COUNT]], align 4, !annotation [[META5 :![0-9]+]]
344
+ // CHECK-NEXT: store ptr null, ptr [[Q]], align 8, !annotation [[META5 ]]
345
345
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TEMP]], ptr align 8 [[P]], i64 24, i1 false)
346
346
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TEMP1]], ptr align 8 [[AGG_TEMP]], i64 24, i1 false), !annotation [[META2]]
347
347
// CHECK-NEXT: [[WIDE_PTR_PTR_ADDR:%.*]] = getelementptr inbounds nuw %"__bounds_safety::wide_ptr.bidi_indexable", ptr [[AGG_TEMP1]], i32 0, i32 0, !annotation [[META2]]
@@ -405,7 +405,7 @@ void ptr_oob(void) {
405
405
// CHECK-NEXT: br label [[LAND_END35]], !annotation [[META2]]
406
406
// CHECK: land.end35:
407
407
// CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, [[LAND_LHS_TRUE]] ], [ false, [[ENTRY:%.*]] ], [ [[TMP1]], [[LOR_END]] ], !annotation [[META2]]
408
- // CHECK-NEXT: br i1 [[TMP2]], label [[CONT:%.*]], label [[TRAP:%.*]], !annotation [[META2]]
408
+ // CHECK-NEXT: br i1 [[TMP2]], label [[CONT:%.*]], label [[TRAP:%.*]], !prof [[PROF3]], ! annotation [[META2]]
409
409
// CHECK: trap:
410
410
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4]], !annotation [[META2]]
411
411
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -421,8 +421,8 @@ void ptr_oob(void) {
421
421
// CHECK-NEXT: store ptr [[WIDE_PTR_PTR38]], ptr [[Q]], align 8
422
422
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[Q]], align 8
423
423
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[COUNT]], align 4
424
- // CHECK-NEXT: [[TMP5:%.*]] = icmp ne ptr [[TMP3]], null, !annotation [[META3 ]]
425
- // CHECK-NEXT: br i1 [[TMP5]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META3 ]]
424
+ // CHECK-NEXT: [[TMP5:%.*]] = icmp ne ptr [[TMP3]], null, !annotation [[META4 ]]
425
+ // CHECK-NEXT: br i1 [[TMP5]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META4 ]]
426
426
// CHECK: boundscheck.notnull:
427
427
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP4]] to i64
428
428
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDX_EXT]]
@@ -453,8 +453,8 @@ int *__bidi_indexable null_count_neg(void) {
453
453
return q ;
454
454
}
455
455
456
- // CHECK-LABEL: define dso_local void @null_count_too_big
457
- // CHECK-SAME: ( ptr dead_on_unwind noalias writable sret(%"__bounds_safety::wide_ptr.bidi_indexable") align 8 [[AGG_RESULT:%.*]]) #[[ATTR0]] {
456
+ // CHECK-LABEL: define dso_local void @null_count_too_big(
457
+ // CHECK-SAME: ptr dead_on_unwind noalias writable sret(%"__bounds_safety::wide_ptr.bidi_indexable") align 8 [[AGG_RESULT:%.*]]) #[[ATTR0]] {
458
458
// CHECK-NEXT: entry:
459
459
// CHECK-NEXT: [[P:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
460
460
// CHECK-NEXT: [[COUNT:%.*]] = alloca i32, align 4
@@ -469,8 +469,8 @@ int *__bidi_indexable null_count_neg(void) {
469
469
// CHECK-NEXT: [[AGG_TEMP26:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
470
470
// CHECK-NEXT: [[AGG_TEMP36:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
471
471
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[P]], i8 0, i64 24, i1 false)
472
- // CHECK-NEXT: store i32 0, ptr [[COUNT]], align 4, !annotation [[META4 ]]
473
- // CHECK-NEXT: store ptr null, ptr [[Q]], align 8, !annotation [[META4 ]]
472
+ // CHECK-NEXT: store i32 0, ptr [[COUNT]], align 4, !annotation [[META5 ]]
473
+ // CHECK-NEXT: store ptr null, ptr [[Q]], align 8, !annotation [[META5 ]]
474
474
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TEMP]], ptr align 8 [[P]], i64 24, i1 false)
475
475
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TEMP1]], ptr align 8 [[AGG_TEMP]], i64 24, i1 false), !annotation [[META2]]
476
476
// CHECK-NEXT: [[WIDE_PTR_PTR_ADDR:%.*]] = getelementptr inbounds nuw %"__bounds_safety::wide_ptr.bidi_indexable", ptr [[AGG_TEMP1]], i32 0, i32 0, !annotation [[META2]]
@@ -534,7 +534,7 @@ int *__bidi_indexable null_count_neg(void) {
534
534
// CHECK-NEXT: br label [[LAND_END35]], !annotation [[META2]]
535
535
// CHECK: land.end35:
536
536
// CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, [[LAND_LHS_TRUE]] ], [ false, [[ENTRY:%.*]] ], [ [[TMP1]], [[LOR_END]] ], !annotation [[META2]]
537
- // CHECK-NEXT: br i1 [[TMP2]], label [[CONT:%.*]], label [[TRAP:%.*]], !annotation [[META2]]
537
+ // CHECK-NEXT: br i1 [[TMP2]], label [[CONT:%.*]], label [[TRAP:%.*]], !prof [[PROF3]], ! annotation [[META2]]
538
538
// CHECK: trap:
539
539
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4]], !annotation [[META2]]
540
540
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -550,8 +550,8 @@ int *__bidi_indexable null_count_neg(void) {
550
550
// CHECK-NEXT: store ptr [[WIDE_PTR_PTR38]], ptr [[Q]], align 8
551
551
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[Q]], align 8
552
552
// CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[COUNT]], align 4
553
- // CHECK-NEXT: [[TMP5:%.*]] = icmp ne ptr [[TMP3]], null, !annotation [[META3 ]]
554
- // CHECK-NEXT: br i1 [[TMP5]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META3 ]]
553
+ // CHECK-NEXT: [[TMP5:%.*]] = icmp ne ptr [[TMP3]], null, !annotation [[META4 ]]
554
+ // CHECK-NEXT: br i1 [[TMP5]], label [[BOUNDSCHECK_NOTNULL:%.*]], label [[BOUNDSCHECK_NULL:%.*]], !annotation [[META4 ]]
555
555
// CHECK: boundscheck.notnull:
556
556
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP4]] to i64
557
557
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDX_EXT]]
@@ -582,8 +582,3 @@ int *__bidi_indexable null_count_too_big(void) {
582
582
return q ;
583
583
}
584
584
585
- //.
586
- // CHECK: [[META2]] = !{!"bounds-safety-generic"}
587
- // CHECK: [[META3]] = !{!"bounds-safety-check-ptr-neq-null"}
588
- // CHECK: [[META4]] = !{!"bounds-safety-zero-init"}
589
- //.
0 commit comments