Skip to content

Commit d1625da

Browse files
authored
Merge pull request #8375 from fhahn/tbaa-struct-union
Pick fixes for Unions & tbaa.struct
2 parents 5571918 + 890cbe9 commit d1625da

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

clang/lib/CodeGen/CodeGenTBAA.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,14 @@ CodeGenTBAA::CollectFields(uint64_t BaseOffset,
283283
/* Things not handled yet include: C++ base classes, bitfields, */
284284

285285
if (const RecordType *TTy = QTy->getAs<RecordType>()) {
286+
if (TTy->isUnionType()) {
287+
uint64_t Size = Context.getTypeSizeInChars(QTy).getQuantity();
288+
llvm::MDNode *TBAAType = getChar();
289+
llvm::MDNode *TBAATag = getAccessTagInfo(TBAAAccessInfo(TBAAType, Size));
290+
Fields.push_back(
291+
llvm::MDBuilder::TBAAStructField(BaseOffset, Size, TBAATag));
292+
return true;
293+
}
286294
const RecordDecl *RD = TTy->getDecl()->getDefinition();
287295
if (RD->hasFlexibleArrayMember())
288296
return false;
@@ -340,6 +348,9 @@ CodeGenTBAA::CollectFields(uint64_t BaseOffset,
340348

341349
llvm::MDNode *
342350
CodeGenTBAA::getTBAAStructInfo(QualType QTy) {
351+
if (CodeGenOpts.OptimizationLevel == 0 || CodeGenOpts.RelaxedAliasing)
352+
return nullptr;
353+
343354
const Type *Ty = Context.getCanonicalType(QTy).getTypePtr();
344355

345356
if (llvm::MDNode *N = StructMetadataCache[Ty])
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - -O1 -relaxed-aliasing -fsanitize=thread -disable-llvm-optzns %s | \
2+
// RUN: FileCheck %s
3+
// RUN: %clang_cc1 -triple x86_64-apple-darwin -new-struct-path-tbaa \
4+
// RUN: -emit-llvm -o - -O1 -relaxed-aliasing -fsanitize=thread -disable-llvm-optzns %s | \
5+
// RUN: FileCheck %s
6+
//
7+
// Check that we do not create tbaa for instructions generated for copies.
8+
9+
// CHECK-NOT: !tbaa
10+
11+
struct A {
12+
short s;
13+
int i;
14+
char c;
15+
int j;
16+
};
17+
18+
void copyStruct(A *a1, A *a2) {
19+
*a1 = *a2;
20+
}
21+
22+
void copyInt(int *a, int *b) {
23+
*a = *b;
24+
}

clang/test/CodeGen/tbaa-struct.cpp

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,38 @@ void copy10(NamedBitfields3 *a1, NamedBitfields3 *a2) {
151151
*a1 = *a2;
152152
}
153153

154+
union U2 {
155+
double d;
156+
float f;
157+
};
158+
159+
struct UnionMember1 {
160+
U2 u;
161+
int p;
162+
};
163+
164+
void copy11(UnionMember1 *a1, UnionMember1 *a2) {
165+
// CHECK-LABEL: _Z6copy11P12UnionMember1S0_
166+
// CHECK: tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %a1, ptr noundef nonnull align 8 dereferenceable(16) %a2, i64 16, i1 false),
167+
// CHECK-OLD-SAME: !tbaa.struct [[TS9:!.*]]
168+
// CHECK-NEW-SAME: !tbaa [[TAG_UnionMember1:!.+]], !tbaa.struct
169+
*a1 = *a2;
170+
}
171+
172+
struct UnionMember2 {
173+
int p;
174+
U2 u;
175+
};
176+
177+
void copy12(UnionMember2 *a1, UnionMember2 *a2) {
178+
// CHECK-LABEL: _Z6copy12P12UnionMember2S0_
179+
// CHECK: tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) %a1, ptr noundef nonnull align 8 dereferenceable(16) %a2, i64 16, i1 false),
180+
// CHECK-OLD-SAME: !tbaa.struct [[TS10:!.*]]
181+
// CHECK-NEW-SAME: !tbaa [[TAG_UnionMember2:!.+]], !tbaa.struct
182+
183+
*a1 = *a2;
184+
}
185+
154186
// CHECK-OLD: [[TS]] = !{i64 0, i64 2, !{{.*}}, i64 4, i64 4, !{{.*}}, i64 8, i64 1, !{{.*}}, i64 12, i64 4, !{{.*}}}
155187
// CHECK-OLD: [[CHAR:!.*]] = !{!"omnipotent char", !{{.*}}}
156188
// CHECK-OLD: [[TAG_INT:!.*]] = !{[[INT:!.*]], [[INT]], i64 0}
@@ -159,14 +191,16 @@ void copy10(NamedBitfields3 *a1, NamedBitfields3 *a2) {
159191
// (offset, size) = (0,1) char; (4,2) short; (8,4) int; (12,1) char; (16,4) int; (20,4) int
160192
// CHECK-OLD: [[TS2]] = !{i64 0, i64 1, !{{.*}}, i64 4, i64 2, !{{.*}}, i64 8, i64 4, !{{.*}}, i64 12, i64 1, !{{.*}}, i64 16, i64 4, {{.*}}, i64 20, i64 4, {{.*}}}
161193
// (offset, size) = (0,8) char; (0,2) char; (4,8) char
162-
// CHECK-OLD: [[TS3]] = !{i64 0, i64 8, !{{.*}}, i64 0, i64 2, !{{.*}}, i64 4, i64 8, !{{.*}}}
194+
// CHECK-OLD: [[TS3]] = !{i64 0, i64 12, [[TAG_CHAR]]}
163195
// CHECK-OLD: [[TS4]] = !{i64 0, i64 1, [[TAG_CHAR]], i64 1, i64 1, [[TAG_CHAR]], i64 2, i64 1, [[TAG_CHAR]]}
164196
// CHECK-OLD: [[TS5]] = !{i64 0, i64 1, [[TAG_CHAR]], i64 4, i64 1, [[TAG_CHAR]], i64 5, i64 1, [[TAG_CHAR]]}
165197
// CHECK-OLD: [[TS6]] = !{i64 0, i64 2, [[TAG_CHAR]], i64 2, i64 1, [[TAG_CHAR]], i64 8, i64 8, [[TAG_DOUBLE:!.+]]}
166198
// CHECK-OLD: [[TAG_DOUBLE]] = !{[[DOUBLE:!.+]], [[DOUBLE]], i64 0}
167199
// CHECK-OLD [[DOUBLE]] = !{!"double", [[CHAR]], i64 0}
168200
// CHECK-OLD: [[TS7]] = !{i64 0, i64 1, [[TAG_CHAR]], i64 1, i64 1, [[TAG_CHAR]], i64 2, i64 1, [[TAG_CHAR]], i64 3, i64 1, [[TAG_CHAR]], i64 4, i64 1, [[TAG_CHAR]], i64 8, i64 8, [[TAG_DOUBLE]], i64 16, i64 1, [[TAG_CHAR]]}
169201
// CHECK-OLD: [[TS8]] = !{i64 0, i64 4, [[TAG_CHAR]], i64 8, i64 8, [[TAG_DOUBLE]]}
202+
// CHECK-OLD: [[TS9]] = !{i64 0, i64 8, [[TAG_CHAR]], i64 8, i64 4, [[TAG_INT]]}
203+
// CHECK-OLD: [[TS10]] = !{i64 0, i64 4, [[TAG_INT]], i64 8, i64 8, [[TAG_CHAR]]}
170204

171205
// CHECK-NEW-DAG: [[TYPE_char:!.*]] = !{{{.*}}, i64 1, !"omnipotent char"}
172206
// CHECK-NEW-DAG: [[TAG_char]] = !{[[TYPE_char]], [[TYPE_char]], i64 0, i64 0}
@@ -188,3 +222,7 @@ void copy10(NamedBitfields3 *a1, NamedBitfields3 *a2) {
188222
// CHECK-NEW-DAG: [[TYPE_NamedBitfields2]] = !{[[TYPE_char]], i64 24, !"_ZTS15NamedBitfields2", [[TYPE_char]], i64 0, i64 1, [[TYPE_char]], i64 1, i64 1, [[TYPE_char]], i64 2, i64 1, [[TYPE_int]], i64 3, i64 4, [[TYPE_int]], i64 3, i64 4, [[TYPE_char]], i64 4, i64 1, [[TYPE_double]], i64 8, i64 8, [[TYPE_int]], i64 16, i64 4}
189223
// CHECK-NEW-DAG: [[TAG_NamedBitfields3]] = !{[[TYPE_NamedBitfields3:!.+]], [[TYPE_NamedBitfields3]], i64 0, i64 16}
190224
// CHECK-NEW-DAG: [[TYPE_NamedBitfields3]] = !{[[TYPE_char]], i64 16, !"_ZTS15NamedBitfields3", [[TYPE_int]], i64 1, i64 4, [[TYPE_int]], i64 2, i64 4, [[TYPE_double]], i64 8, i64 8}
225+
// CHECK-NEW-DAG: [[TAG_UnionMember1]] = !{[[TYPE_UnionMember1:!.+]], [[TYPE_UnionMember1]], i64 0, i64 16}
226+
// CHECK-NEW-DAG: [[TYPE_UnionMember1]] = !{[[TYPE_char]], i64 16, !"_ZTS12UnionMember1", [[TYPE_char]], i64 0, i64 8, [[TYPE_int]], i64 8, i64 4}
227+
// CHECK-NEW-DAG: [[TAG_UnionMember2]] = !{[[TYPE_UnionMember2:!.+]], [[TYPE_UnionMember2]], i64 0, i64 16}
228+
// CHECK-NEW-DAG: [[TYPE_UnionMember2]] = !{[[TYPE_char]], i64 16, !"_ZTS12UnionMember2", [[TYPE_int]], i64 0, i64 4, [[TYPE_char]], i64 8, i64 8}

0 commit comments

Comments
 (0)