Author: Jeffrey T Mott Date: 2021-01-07T12:34:07-08:00 New Revision: 275f30df8ad6de75e1f29e4b33eaeb67686caf0d
URL: https://github.com/llvm/llvm-project/commit/275f30df8ad6de75e1f29e4b33eaeb67686caf0d DIFF: https://github.com/llvm/llvm-project/commit/275f30df8ad6de75e1f29e4b33eaeb67686caf0d.diff LOG: [clang] Change builtin object size when subobject is invalid Motivating example: ``` struct { int v[10]; } t[10]; __builtin_object_size( &t[0].v[11], // access past end of subobject 1 // request remaining bytes of closest surrounding // subobject ); ``` In GCC, this returns 0. https://godbolt.org/z/7TeGs7 In current clang, however, this returns 356, the number of bytes remaining in the whole variable, as if the `type` was 0 instead of 1. https://godbolt.org/z/6Kffox This patch checks for the specific case where we're requesting a subobject's size (type 1) but the subobject is invalid. Differential Revision: https://reviews.llvm.org/D92892 Added: Modified: clang/lib/AST/ExprConstant.cpp clang/test/CodeGen/object-size.c Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 56181bbe1166..b153e22259f7 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11408,9 +11408,9 @@ static bool tryEvaluateBuiltinObjectSize(const Expr *E, unsigned Type, return false; } - // If we point to before the start of the object, there are no accessible - // bytes. - if (LVal.getLValueOffset().isNegative()) { + // If we point outside of the object, there are no accessible bytes. + if (LVal.getLValueOffset().isNegative() || + ((Type & 1) && !LVal.Designator.isValidSubobject())) { Size = 0; return true; } diff --git a/clang/test/CodeGen/object-size.c b/clang/test/CodeGen/object-size.c index ff54b11a0f04..dbf286138454 100644 --- a/clang/test/CodeGen/object-size.c +++ b/clang/test/CodeGen/object-size.c @@ -310,7 +310,7 @@ void test24() { void test25() { // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1 gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 0); - // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1 + // CHECK: store i32 0 gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 1); // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true, i1 true, i1 gi = OBJECT_SIZE_BUILTIN((void*)0x1000, 2); @@ -321,7 +321,7 @@ void test25() { // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1 gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 0); - // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 false, i1 true, i1 + // CHECK: store i32 0 gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 1); // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* {{.*}}, i1 true, i1 true, i1 gi = OBJECT_SIZE_BUILTIN((void*)0 + 0x1000, 2); @@ -337,7 +337,7 @@ void test26() { // CHECK: store i32 316 gi = OBJECT_SIZE_BUILTIN(&t[1].v[11], 0); - // CHECK: store i32 312 + // CHECK: store i32 0 gi = OBJECT_SIZE_BUILTIN(&t[1].v[12], 1); // CHECK: store i32 308 gi = OBJECT_SIZE_BUILTIN(&t[1].v[13], 2); @@ -433,7 +433,7 @@ void test29(struct DynStructVar *dv, struct DynStruct0 *d0, // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1 gi = OBJECT_SIZE_BUILTIN(d0->snd, 0); - // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1 + // CHECK: store i32 0 gi = OBJECT_SIZE_BUILTIN(d0->snd, 1); // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 true, i1 true, i1 gi = OBJECT_SIZE_BUILTIN(d0->snd, 2); @@ -518,7 +518,7 @@ void test31() { // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1 gi = OBJECT_SIZE_BUILTIN(&ds1[9].snd[0], 1); - // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1 + // CHECK: store i32 0 gi = OBJECT_SIZE_BUILTIN(&ds0[9].snd[0], 1); // CHECK: call i64 @llvm.objectsize.i64.p0i8(i8* %{{.*}}, i1 false, i1 true, i1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits