Skip to content

Commit

Permalink
[Sema] Try 2: Sanity-check alignment requested via `__attribute__((as…
Browse files Browse the repository at this point in the history
…sume_aligned(imm)))`

Summary:
For `__builtin_assume_aligned()`, we do validate that the alignment
is not greater than `536870912` (D68824), but we don't do that for
`__attribute__((assume_aligned(N)))` attribute.
I suspect we should.

This was initially committed in a4cfb15
but reverted in 210f088 due to
suspicious bot failures.

Reviewers: erichkeane, aaron.ballman, hfinkel, rsmith, jdoerfert

Reviewed By: erichkeane

Subscribers: cfe-commits, llvm-commits

Tags: #llvm, #clang

Differential Revision: https://reviews.llvm.org/D72994
  • Loading branch information
LebedevRI committed Jan 24, 2020
1 parent 5cee340 commit 0a002f6
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 0 deletions.
6 changes: 6 additions & 0 deletions clang/lib/Sema/SemaDeclAttr.cpp
Expand Up @@ -1625,6 +1625,12 @@ void Sema::AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E,
<< 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) {
Expand Down
1 change: 1 addition & 0 deletions clang/test/Sema/builtin-assume-aligned.c
Expand Up @@ -46,6 +46,7 @@ int test8(int *a, int j) {
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
Expand Down

0 comments on commit 0a002f6

Please sign in to comment.