lebedev.ri created this revision. lebedev.ri added reviewers: erichkeane, aaron.ballman, hfinkel, rsmith, jdoerfert. lebedev.ri added a project: LLVM. Herald added a project: clang. Herald added a subscriber: cfe-commits. lebedev.ri added a parent revision: D72993: [NFC][Codegen] Use MaybeAlign + APInt::getLimitedValue() when creating Alignment attr.
For `__builtin_assume_aligned()`, we do validate that the alignment is not greater than `536870912` (D68824 <https://reviews.llvm.org/D68824>), but we don't do that for `__attribute__((assume_aligned(N)))` attribute. I suspect we should. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D72994 Files: clang/lib/Sema/SemaDeclAttr.cpp clang/test/Sema/builtin-assume-aligned.c Index: clang/test/Sema/builtin-assume-aligned.c =================================================================== --- clang/test/Sema/builtin-assume-aligned.c +++ clang/test/Sema/builtin-assume-aligned.c @@ -46,6 +46,7 @@ void test_void_assume_aligned(void) __attribute__((assume_aligned(32))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}} int test_int_assume_aligned(void) __attribute__((assume_aligned(16))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}} void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(64))); // no-warning +void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(1073741824))); // expected-warning {{requested alignment must be 536870912 bytes or smaller; maximum alignment assumed}} int j __attribute__((assume_aligned(8))); // expected-warning {{'assume_aligned' attribute only applies to Objective-C methods and functions}} void *test_no_fn_proto() __attribute__((assume_aligned(32))); // no-warning Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -1625,6 +1625,12 @@ << E->getSourceRange(); return; } + + // Alignment calculations can wrap around if it's greater than 2**29. + unsigned MaximumAlignment = 536870912; + if (I > MaximumAlignment) + Diag(CI.getLoc(), diag::warn_assume_aligned_too_great) + << CI.getRange() << MaximumAlignment; } if (OE) {
Index: clang/test/Sema/builtin-assume-aligned.c =================================================================== --- clang/test/Sema/builtin-assume-aligned.c +++ clang/test/Sema/builtin-assume-aligned.c @@ -46,6 +46,7 @@ void test_void_assume_aligned(void) __attribute__((assume_aligned(32))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}} int test_int_assume_aligned(void) __attribute__((assume_aligned(16))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}} void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(64))); // no-warning +void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(1073741824))); // expected-warning {{requested alignment must be 536870912 bytes or smaller; maximum alignment assumed}} int j __attribute__((assume_aligned(8))); // expected-warning {{'assume_aligned' attribute only applies to Objective-C methods and functions}} void *test_no_fn_proto() __attribute__((assume_aligned(32))); // no-warning Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -1625,6 +1625,12 @@ << E->getSourceRange(); return; } + + // Alignment calculations can wrap around if it's greater than 2**29. + unsigned MaximumAlignment = 536870912; + if (I > MaximumAlignment) + Diag(CI.getLoc(), diag::warn_assume_aligned_too_great) + << CI.getRange() << MaximumAlignment; } if (OE) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits