Skip to content

Commit afca410

Browse files
hnrklssnjroelofs
authored andcommitted
[BoundsSafety] Fix BoundsSafety-legacy-checks/CodeGen tests
rdar://156406250
1 parent 6810a7c commit afca410

9 files changed

+1165
-1167
lines changed

clang/test/BoundsSafety-legacy-checks/CodeGen/counted-by-or-null-from-bidi-O0.c

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include <ptrcheck.h>
77

88
// 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]+]] {
1111
// CHECK-NEXT: entry:
1212
// CHECK-NEXT: [[P_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
1313
// 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) {
2727
return p;
2828
}
2929

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]] {
3232
// CHECK-NEXT: entry:
3333
// CHECK-NEXT: [[P_INDIRECT_ADDR:%.*]] = alloca ptr, align 8
3434
// 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) {
111111
// CHECK-NEXT: br label [[LAND_END39]], !annotation [[META2]]
112112
// CHECK: land.end39:
113113
// 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]]
115115
// CHECK: trap:
116116
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4:[0-9]+]], !annotation [[META2]]
117117
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -131,17 +131,17 @@ void foo_assign(int * __bidi_indexable p, int len) {
131131
int * __counted_by_or_null(size) p2 = p;
132132
}
133133

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]] {
136136
// CHECK-NEXT: entry:
137137
// CHECK-NEXT: [[P_ADDR:%.*]] = alloca ptr, align 8
138138
// CHECK-NEXT: [[LEN_ADDR:%.*]] = alloca i32, align 4
139139
// CHECK-NEXT: store ptr [[P]], ptr [[P_ADDR]], align 8
140140
// CHECK-NEXT: store i32 [[LEN]], ptr [[LEN_ADDR]], align 4
141141
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
142142
// 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]]
145145
// CHECK: boundscheck.notnull:
146146
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP1]] to i64
147147
// 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) {
167167
return p;
168168
}
169169

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]] {
172172
// CHECK-NEXT: entry:
173173
// CHECK-NEXT: [[P_ADDR:%.*]] = alloca ptr, align 8
174174
// 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) {
177177
// CHECK-NEXT: store i32 [[LEN]], ptr [[LEN_ADDR]], align 4
178178
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
179179
// 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]]
182182
// CHECK: boundscheck.notnull:
183183
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP1]] to i64
184184
// 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) {
204204
int * __bidi_indexable p2 = p;
205205
}
206206

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]] {
209209
// CHECK-NEXT: entry:
210210
// CHECK-NEXT: [[X:%.*]] = alloca i32, align 4
211211
// 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) {
302302
// CHECK-NEXT: br label [[LAND_END34]], !annotation [[META2]]
303303
// CHECK: land.end34:
304304
// 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]]
306306
// CHECK: trap:
307307
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4]], !annotation [[META2]]
308308
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -324,8 +324,8 @@ void ptr_oob(void) {
324324
int *__counted_by_or_null(4) q = p;
325325
}
326326

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]] {
329329
// CHECK-NEXT: entry:
330330
// CHECK-NEXT: [[P:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
331331
// CHECK-NEXT: [[COUNT:%.*]] = alloca i32, align 4
@@ -340,8 +340,8 @@ void ptr_oob(void) {
340340
// CHECK-NEXT: [[AGG_TEMP26:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
341341
// CHECK-NEXT: [[AGG_TEMP36:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
342342
// 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]]
345345
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TEMP]], ptr align 8 [[P]], i64 24, i1 false)
346346
// 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]]
347347
// 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) {
405405
// CHECK-NEXT: br label [[LAND_END35]], !annotation [[META2]]
406406
// CHECK: land.end35:
407407
// 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]]
409409
// CHECK: trap:
410410
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4]], !annotation [[META2]]
411411
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -421,8 +421,8 @@ void ptr_oob(void) {
421421
// CHECK-NEXT: store ptr [[WIDE_PTR_PTR38]], ptr [[Q]], align 8
422422
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[Q]], align 8
423423
// 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]]
426426
// CHECK: boundscheck.notnull:
427427
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP4]] to i64
428428
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDX_EXT]]
@@ -453,8 +453,8 @@ int *__bidi_indexable null_count_neg(void) {
453453
return q;
454454
}
455455

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]] {
458458
// CHECK-NEXT: entry:
459459
// CHECK-NEXT: [[P:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
460460
// CHECK-NEXT: [[COUNT:%.*]] = alloca i32, align 4
@@ -469,8 +469,8 @@ int *__bidi_indexable null_count_neg(void) {
469469
// CHECK-NEXT: [[AGG_TEMP26:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
470470
// CHECK-NEXT: [[AGG_TEMP36:%.*]] = alloca %"__bounds_safety::wide_ptr.bidi_indexable", align 8
471471
// 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]]
474474
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[AGG_TEMP]], ptr align 8 [[P]], i64 24, i1 false)
475475
// 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]]
476476
// 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) {
534534
// CHECK-NEXT: br label [[LAND_END35]], !annotation [[META2]]
535535
// CHECK: land.end35:
536536
// 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]]
538538
// CHECK: trap:
539539
// CHECK-NEXT: call void @llvm.ubsantrap(i8 25) #[[ATTR4]], !annotation [[META2]]
540540
// CHECK-NEXT: unreachable, !annotation [[META2]]
@@ -550,8 +550,8 @@ int *__bidi_indexable null_count_neg(void) {
550550
// CHECK-NEXT: store ptr [[WIDE_PTR_PTR38]], ptr [[Q]], align 8
551551
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[Q]], align 8
552552
// 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]]
555555
// CHECK: boundscheck.notnull:
556556
// CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[TMP4]] to i64
557557
// CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDX_EXT]]
@@ -582,8 +582,3 @@ int *__bidi_indexable null_count_too_big(void) {
582582
return q;
583583
}
584584

585-
//.
586-
// CHECK: [[META2]] = !{!"bounds-safety-generic"}
587-
// CHECK: [[META3]] = !{!"bounds-safety-check-ptr-neq-null"}
588-
// CHECK: [[META4]] = !{!"bounds-safety-zero-init"}
589-
//.

clang/test/BoundsSafety-legacy-checks/CodeGen/counted-by-or-null-from-bidi-O2.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
// TODO: rdar://114446928
99
// CHECK-LABEL: define dso_local ptr @foo(
10-
// CHECK-SAME: ptr noundef readonly captures(none) [[P:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
10+
// CHECK-SAME: ptr dead_on_return noundef readonly captures(none) [[P:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
1111
// CHECK-NEXT: [[ENTRY:.*:]]
1212
// CHECK-NEXT: [[AGG_TEMP_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[P]], align 8
1313
// CHECK-NEXT: ret ptr [[AGG_TEMP_SROA_0_0_COPYLOAD]]
@@ -17,7 +17,7 @@ int * __counted_by_or_null(len) foo(int * __bidi_indexable p, int len) {
1717
}
1818

1919
// CHECK-LABEL: define dso_local void @foo_assign(
20-
// CHECK-SAME: ptr noundef readonly captures(none) [[P:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
20+
// CHECK-SAME: ptr dead_on_return noundef readonly captures(none) [[P:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
2121
// CHECK-NEXT: [[ENTRY:.*:]]
2222
// CHECK-NEXT: [[CONV:%.*]] = sext i32 [[LEN]] to i64
2323
// CHECK-NEXT: [[AGG_TEMP_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[P]], align 8

clang/test/BoundsSafety-legacy-checks/CodeGen/counted_by_or_null_call-O2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ void caller_6(int *__counted_by(len) p, int len) {
8585
}
8686

8787
// CHECK-LABEL: define dso_local void @caller_7(
88-
// CHECK-SAME: ptr noundef readonly captures(none) [[P:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR0]] {
88+
// CHECK-SAME: ptr dead_on_return noundef readonly captures(none) [[P:%.*]], i32 noundef [[LEN:%.*]]) local_unnamed_addr #[[ATTR0]] {
8989
// CHECK-NEXT: entry:
9090
// CHECK-NEXT: [[AGG_TEMP_SROA_0_0_COPYLOAD:%.*]] = load ptr, ptr [[P]], align 8
9191
// CHECK-NEXT: [[AGG_TEMP_SROA_9_0_P_SROA_IDX:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8

0 commit comments

Comments
 (0)