Skip to content

Commit 49a24b3

Browse files
authored
[CodeGen][counted_by] Support use of the comma operator (#151776)
Writing something like this: __builtin_dynamic_object_size((0, p->array), 0) is equivalent to writing this: __builtin_dynamic_object_size(p->array, 0) though the former will give a warning about the first value being unused.
1 parent 99cd1d8 commit 49a24b3

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,9 @@ class StructFieldAccess
973973
AddrOfSeen = false;
974974
return Visit(E->getSubExpr());
975975
}
976+
const Expr *VisitBinaryOperator(const clang::BinaryOperator *Op) {
977+
return Op->isCommaOp() ? Visit(Op->getRHS()) : nullptr;
978+
}
976979
};
977980

978981
} // end anonymous namespace

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2445,3 +2445,39 @@ struct {
24452445
size_t test36() {
24462446
return __builtin_dynamic_object_size(&x.dev_addr[4], 1);
24472447
}
2448+
2449+
// SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -8589934592, 8589934589) i64 @test37(
2450+
// SANITIZE-WITH-ATTR-SAME: ptr noundef [[PTR:%.*]]) local_unnamed_addr #[[ATTR0]] {
2451+
// SANITIZE-WITH-ATTR-NEXT: entry:
2452+
// SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR]], i64 8
2453+
// SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i32, ptr [[COUNTED_BY_GEP]], align 4
2454+
// SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i32 [[COUNTED_BY_LOAD]] to i64
2455+
// SANITIZE-WITH-ATTR-NEXT: [[FLEXIBLE_ARRAY_MEMBER_SIZE:%.*]] = shl nsw i64 [[COUNT]], 2
2456+
// SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[COUNTED_BY_LOAD]], -1
2457+
// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[FLEXIBLE_ARRAY_MEMBER_SIZE]], i64 0
2458+
// SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
2459+
//
2460+
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local range(i64 -8589934592, 8589934589) i64 @test37(
2461+
// NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readonly captures(none) [[PTR:%.*]]) local_unnamed_addr #[[ATTR2]] {
2462+
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
2463+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR]], i64 8
2464+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNTED_BY_LOAD:%.*]] = load i32, ptr [[COUNTED_BY_GEP]], align 4
2465+
// NO-SANITIZE-WITH-ATTR-NEXT: [[COUNT:%.*]] = sext i32 [[COUNTED_BY_LOAD]] to i64
2466+
// NO-SANITIZE-WITH-ATTR-NEXT: [[FLEXIBLE_ARRAY_MEMBER_SIZE:%.*]] = shl nsw i64 [[COUNT]], 2
2467+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[COUNTED_BY_LOAD]], -1
2468+
// NO-SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = select i1 [[TMP0]], i64 [[FLEXIBLE_ARRAY_MEMBER_SIZE]], i64 0
2469+
// NO-SANITIZE-WITH-ATTR-NEXT: ret i64 [[TMP1]]
2470+
//
2471+
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i64 @test37(
2472+
// SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[PTR:%.*]]) local_unnamed_addr #[[ATTR0]] {
2473+
// SANITIZE-WITHOUT-ATTR-NEXT: entry:
2474+
// SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -1
2475+
//
2476+
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i64 @test37(
2477+
// NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readnone [[PTR:%.*]]) local_unnamed_addr #[[ATTR1]] {
2478+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2479+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -1
2480+
//
2481+
size_t test37(struct annotated *ptr) {
2482+
return __builtin_dynamic_object_size((1, 2, (4, 5, (7, 8, 9, (10, ptr->array)))), 1);
2483+
}

0 commit comments

Comments
 (0)