diff options
Diffstat (limited to 'test/CodeGen/pass-object-size.c')
-rw-r--r-- | test/CodeGen/pass-object-size.c | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/test/CodeGen/pass-object-size.c b/test/CodeGen/pass-object-size.c index f5c12317ec..80c0a75199 100644 --- a/test/CodeGen/pass-object-size.c +++ b/test/CodeGen/pass-object-size.c @@ -7,6 +7,7 @@ struct Foo { }; #define PS(N) __attribute__((pass_object_size(N))) +#define PDS(N) __attribute__((pass_dynamic_object_size(N))) int gi = 0; @@ -16,26 +17,52 @@ int ObjectSize0(void *const p PS(0)) { return __builtin_object_size(p, 0); } +// CHECK-LABEL: define i32 @DynamicObjectSize0(i8* %{{.*}}, i64) +int DynamicObjectSize0(void *const p PDS(0)) { + // CHECK-NOT: @llvm.objectsize + return __builtin_dynamic_object_size(p, 0); +} + // CHECK-LABEL: define i32 @ObjectSize1(i8* %{{.*}}, i64) int ObjectSize1(void *const p PS(1)) { // CHECK-NOT: @llvm.objectsize return __builtin_object_size(p, 1); } +// CHECK-LABEL: define i32 @DynamicObjectSize1(i8* %{{.*}}, i64) +int DynamicObjectSize1(void *const p PDS(1)) { + // CHECK-NOT: @llvm.objectsize + return __builtin_dynamic_object_size(p, 1); +} + // CHECK-LABEL: define i32 @ObjectSize2(i8* %{{.*}}, i64) int ObjectSize2(void *const p PS(2)) { // CHECK-NOT: @llvm.objectsize return __builtin_object_size(p, 2); } +// CHECK-LABEL: define i32 @DynamicObjectSize2(i8* %{{.*}}, i64) +int DynamicObjectSize2(void *const p PDS(2)) { + // CHECK-NOT: @llvm.objectsize + return __builtin_object_size(p, 2); +} + // CHECK-LABEL: define i32 @ObjectSize3(i8* %{{.*}}, i64) int ObjectSize3(void *const p PS(3)) { // CHECK-NOT: @llvm.objectsize return __builtin_object_size(p, 3); } +// CHECK-LABEL: define i32 @DynamicObjectSize3(i8* %{{.*}}, i64) +int DynamicObjectSize3(void *const p PDS(3)) { + // CHECK-NOT: @llvm.objectsize + return __builtin_object_size(p, 3); +} + +void *malloc(unsigned long) __attribute__((alloc_size(1))); + // CHECK-LABEL: define void @test1 -void test1() { +void test1(unsigned long sz) { struct Foo t[10]; // CHECK: call i32 @ObjectSize0(i8* %{{.*}}, i64 360) @@ -55,6 +82,21 @@ void test1() { gi = ObjectSize2(&t[1].t[1]); // CHECK: call i32 @ObjectSize3(i8* %{{.*}}, i64 36) gi = ObjectSize3(&t[1].t[1]); + + char *ptr = (char *)malloc(sz); + + // CHECK: [[REG:%.*]] = call i64 @llvm.objectsize.i64.p0i8({{.*}}, i1 false, i1 true, i1 true) + // CHECK: call i32 @DynamicObjectSize0(i8* %{{.*}}, i64 [[REG]]) + gi = DynamicObjectSize0(ptr); + + // CHECK: [[WITH_OFFSET:%.*]] = getelementptr + // CHECK: [[REG:%.*]] = call i64 @llvm.objectsize.i64.p0i8(i8* [[WITH_OFFSET]], i1 false, i1 true, i1 true) + // CHECK: call i32 @DynamicObjectSize0(i8* {{.*}}, i64 [[REG]]) + gi = DynamicObjectSize0(ptr+10); + + // CHECK: [[REG:%.*]] = call i64 @llvm.objectsize.i64.p0i8({{.*}}, i1 true, i1 true, i1 true) + // CHECK: call i32 @DynamicObjectSize2(i8* {{.*}}, i64 [[REG]]) + gi = DynamicObjectSize2(ptr); } // CHECK-LABEL: define void @test2 @@ -72,6 +114,13 @@ int NoViableOverloadObjectSize0(void *const p) __attribute__((overloadable)) { return __builtin_object_size(p, 0); } +// CHECK-LABEL: define i32 @_Z34NoViableOverloadDynamicObjectSize0Pv +int NoViableOverloadDynamicObjectSize0(void *const p) + __attribute__((overloadable)) { + // CHECK: @llvm.objectsize + return __builtin_object_size(p, 0); +} + // CHECK-LABEL: define i32 @_Z27NoViableOverloadObjectSize1Pv int NoViableOverloadObjectSize1(void *const p) __attribute__((overloadable)) { // CHECK: @llvm.objectsize @@ -97,6 +146,11 @@ int NoViableOverloadObjectSize0(void *const p PS(0)) return __builtin_object_size(p, 0); } +int NoViableOverloadDynamicObjectSize0(void *const p PDS(0)) + __attribute__((overloadable)) { + return __builtin_dynamic_object_size(p, 0); +} + int NoViableOverloadObjectSize1(void *const p PS(1)) __attribute__((overloadable)) { return __builtin_object_size(p, 1); @@ -154,6 +208,9 @@ void test3() { gi = NoViableOverloadObjectSize2(&t[1].t[1]); // CHECK: call i32 @_Z27NoViableOverloadObjectSize3PvU17pass_object_size3(i8* %{{.*}}, i64 36) gi = NoViableOverloadObjectSize3(&t[1].t[1]); + + // CHECK: call i32 @_Z34NoViableOverloadDynamicObjectSize0PvU25pass_dynamic_object_size0(i8* %{{.*}}, i64 360) + gi = NoViableOverloadDynamicObjectSize0(&t[1]); } // CHECK-LABEL: define void @test4 @@ -183,6 +240,9 @@ void test5() { int (*f)(void *) = &NoViableOverloadObjectSize0; gi = f(&t[1]); + + int (*g)(void *) = &NoViableOverloadDynamicObjectSize0; + gi = g(&t[1]); } // CHECK-LABEL: define i32 @IndirectObjectSize0 @@ -213,6 +273,12 @@ int IndirectObjectSize3(void *const p PS(3)) { return ObjectSize3(p); } +int IndirectDynamicObjectSize0(void *const p PDS(0)) { + // CHECK: call i32 @ObjectSize0(i8* %{{.*}}, i64 %{{.*}}) + // CHECK-NOT: @llvm.objectsize + return ObjectSize0(p); +} + int Overload0(void *, size_t, void *, size_t); int OverloadNoSize(void *, void *); @@ -418,3 +484,10 @@ void test17(char *C) { // CHECK: call i32 @ObjectSize0(i8* [[PTR]] ObjectSize0(C + ({ int a = 65535; a; })); } + +// CHECK-LABEL: define void @test18 +void test18(char *const p PDS(0)) { + // CHECK-NOT: llvm.objectsize + gi = __builtin_dynamic_object_size(p, 0); + gi = __builtin_object_size(p, 0); +} |