Skip to content

Commit 254b90f

Browse files
authored
[CodeGen][counted_by] See past parentheses and no-op casts (#151266)
Parentheses and no-op casts don't change the value. Skip past them to get to a MemberExpr. Fixes #151236
1 parent 6f2029d commit 254b90f

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1148,7 +1148,8 @@ llvm::Value *CodeGenFunction::emitCountedByPointerSize(
11481148
assert(E->getCastKind() == CK_LValueToRValue &&
11491149
"must be an LValue to RValue cast");
11501150

1151-
const MemberExpr *ME = dyn_cast<MemberExpr>(E->getSubExpr());
1151+
const MemberExpr *ME =
1152+
dyn_cast<MemberExpr>(E->getSubExpr()->IgnoreParenNoopCasts(getContext()));
11521153
if (!ME)
11531154
return nullptr;
11541155

clang/test/CodeGen/attr-counted-by-for-pointers.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,3 +471,80 @@ size_t test9(struct annotated_sized_ptr *p, int index) {
471471
size_t test10(struct annotated_sized_ptr *p, int index) {
472472
return __bdos(&((unsigned int *) p->buf)[index]);
473473
}
474+
475+
struct pr151236_struct {
476+
int *a __counted_by(a_count);
477+
short a_count;
478+
};
479+
480+
// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test11(
481+
// SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
482+
// SANITIZE-WITH-ATTR-NEXT: entry:
483+
// SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
484+
// SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
485+
// SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
486+
// SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
487+
// SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
488+
// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
489+
// SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
490+
//
491+
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test11(
492+
// NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
493+
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
494+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
495+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
496+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
497+
// NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
498+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
499+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
500+
// NO-SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
501+
//
502+
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test11(
503+
// SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
504+
// SANITIZE-WITHOUT-ATTR-NEXT: entry:
505+
// SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
506+
//
507+
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test11(
508+
// NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
509+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
510+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
511+
//
512+
size_t test11(struct pr151236_struct *p) {
513+
return __bdos(p->a) + __bdos((p->a));
514+
}
515+
516+
// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test12(
517+
// SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
518+
// SANITIZE-WITH-ATTR-NEXT: entry:
519+
// SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
520+
// SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
521+
// SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
522+
// SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
523+
// SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
524+
// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
525+
// SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
526+
//
527+
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -262144, 262137) i64 @test12(
528+
// NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
529+
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
530+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
531+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i16, ptr [[COUNTED_BY_GEP]], align 4
532+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i16 [[COUNTED_BY_LOAD]] to i64
533+
// NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAY_SIZE:%.*]] = shl nsw i64 [[COUNT]], 3
534+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i16 [[COUNTED_BY_LOAD]], -1
535+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[ARRAY_SIZE]], i64 0
536+
// NO-SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
537+
//
538+
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test12(
539+
// SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] {
540+
// SANITIZE-WITHOUT-ATTR-NEXT: entry:
541+
// SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
542+
//
543+
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local range(i64 0, -1) i64 @test12(
544+
// NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readonly captures(none) [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
545+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
546+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -2
547+
//
548+
size_t test12(struct pr151236_struct *p) {
549+
return __bdos(p->a) + __bdos(((int *)p->a));
550+
}

0 commit comments

Comments
 (0)