Skip to content

Commit b3cd616

Browse files
committed
Multi-dimensional arrays aren't supported by GCC. We'll do the same here and default to llvm.objectsize().
1 parent 79f92df commit b3cd616

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,10 @@ class StructFieldAccess
10801080
}
10811081

10821082
const MemberExpr *VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
1083+
if (ASE)
1084+
// We don't support multiple subscripts.
1085+
return nullptr;
1086+
10831087
AddrOfSeen = false; // '&ptr->array[idx]' is okay.
10841088
ASE = E;
10851089
return Visit(E->getBase());

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,3 +2083,61 @@ size_t test33(struct annotated *ptr) {
20832083
// Don't handle '&ptr->array' like normal.
20842084
return __bdos(&*&*&*&ptr->array);
20852085
}
2086+
2087+
struct multi_subscripts {
2088+
unsigned long flags[42][42];
2089+
int count;
2090+
int array[] __counted_by(count);
2091+
};
2092+
2093+
// SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test34(
2094+
// SANITIZE-WITH-ATTR-SAME: ptr noundef [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR0]] {
2095+
// SANITIZE-WITH-ATTR-NEXT: entry:
2096+
// SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = icmp ult i32 [[IDX1]], 42
2097+
// SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP0]], label [[CONT1:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
2098+
// SANITIZE-WITH-ATTR: handler.out_of_bounds:
2099+
// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[IDX1]] to i64, !nosanitize [[META2]]
2100+
// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB51:[0-9]+]], i64 [[TMP1]]) #[[ATTR7]], !nosanitize [[META2]]
2101+
// SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]]
2102+
// SANITIZE-WITH-ATTR: cont1:
2103+
// SANITIZE-WITH-ATTR-NEXT: [[TMP2:%.*]] = icmp ult i32 [[IDX2]], 43
2104+
// SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP2]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS2:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
2105+
// SANITIZE-WITH-ATTR: handler.out_of_bounds2:
2106+
// SANITIZE-WITH-ATTR-NEXT: [[TMP3:%.*]] = zext i32 [[IDX2]] to i64
2107+
// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB52:[0-9]+]], i64 [[TMP3]]) #[[ATTR7]], !nosanitize [[META2]]
2108+
// SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]]
2109+
// SANITIZE-WITH-ATTR: cont3:
2110+
// SANITIZE-WITH-ATTR-NEXT: ret i64 -1
2111+
//
2112+
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local i64 @test34(
2113+
// NO-SANITIZE-WITH-ATTR-SAME: ptr noundef readnone [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR3]] {
2114+
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
2115+
// NO-SANITIZE-WITH-ATTR-NEXT: ret i64 -1
2116+
//
2117+
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i64 @test34(
2118+
// SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR0]] {
2119+
// SANITIZE-WITHOUT-ATTR-NEXT: entry:
2120+
// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP0:%.*]] = icmp ult i32 [[IDX1]], 42
2121+
// SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP0]], label [[CONT1:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF8]], !nosanitize [[META9]]
2122+
// SANITIZE-WITHOUT-ATTR: handler.out_of_bounds:
2123+
// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP1:%.*]] = zext i32 [[IDX1]] to i64, !nosanitize [[META9]]
2124+
// SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB20:[0-9]+]], i64 [[TMP1]]) #[[ATTR7]], !nosanitize [[META9]]
2125+
// SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]]
2126+
// SANITIZE-WITHOUT-ATTR: cont1:
2127+
// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP2:%.*]] = icmp ult i32 [[IDX2]], 43
2128+
// SANITIZE-WITHOUT-ATTR-NEXT: br i1 [[TMP2]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS2:%.*]], !prof [[PROF8]], !nosanitize [[META9]]
2129+
// SANITIZE-WITHOUT-ATTR: handler.out_of_bounds2:
2130+
// SANITIZE-WITHOUT-ATTR-NEXT: [[TMP3:%.*]] = zext i32 [[IDX2]] to i64
2131+
// SANITIZE-WITHOUT-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB21:[0-9]+]], i64 [[TMP3]]) #[[ATTR7]], !nosanitize [[META9]]
2132+
// SANITIZE-WITHOUT-ATTR-NEXT: unreachable, !nosanitize [[META9]]
2133+
// SANITIZE-WITHOUT-ATTR: cont3:
2134+
// SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -1
2135+
//
2136+
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local i64 @test34(
2137+
// NO-SANITIZE-WITHOUT-ATTR-SAME: ptr noundef readnone [[PTR:%.*]], i32 noundef [[IDX1:%.*]], i32 noundef [[IDX2:%.*]]) local_unnamed_addr #[[ATTR1]] {
2138+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2139+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 -1
2140+
//
2141+
size_t test34(struct multi_subscripts *ptr, int idx1, int idx2) {
2142+
return __bdos(&ptr->flags[idx1][idx2]);
2143+
}

0 commit comments

Comments
 (0)