Skip to content

Commit 5a3404c

Browse files
[clang][CodeGen][AA] Add !llvm.errno.tbaa listing int-compatible TBAA nodes
Model integer accesses through an ad-hoc TBAA module-level metadata, so as to disambiguate integer accesses from non-integer ones. This is purposefully as part of representing `errno`, which is guaranteed to be accessed with integer-compatible TBAA. Ensure `AA::getModRefInfo` masks out `errnomem` when TBAA proves there is no alias with errno.
1 parent 6c9a9d9 commit 5a3404c

29 files changed

+939
-791
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ static llvm::cl::opt<bool> LimitedCoverage(
8383
llvm::cl::desc("Emit limited coverage mapping information (experimental)"));
8484

8585
static const char AnnotationSection[] = "llvm.metadata";
86+
static constexpr auto ErrnoTBAAMDName = "llvm.errno.tbaa";
8687

8788
static CGCXXABI *createCXXABI(CodeGenModule &CGM) {
8889
switch (CGM.getContext().getCXXABIKind()) {
@@ -1458,6 +1459,17 @@ void CodeGenModule::Release() {
14581459
}
14591460
}
14601461
}
1462+
1463+
// Emit `!llvm.errno.tbaa`, a module-level metadata that specifies the TBAA
1464+
// for an integer access.
1465+
if (TBAA) {
1466+
TBAAAccessInfo TBAAInfo = getTBAAAccessInfo(Context.IntTy);
1467+
llvm::MDNode *IntegerNode = getTBAAAccessTagInfo(TBAAInfo);
1468+
if (IntegerNode) {
1469+
auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(ErrnoTBAAMDName);
1470+
ErrnoTBAAMD->addOperand(IntegerNode);
1471+
}
1472+
}
14611473
}
14621474

14631475
void CodeGenModule::EmitOpenCLMetadata() {

clang/test/CodeGen/LoongArch/inline-asm-operand-modifiers.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
// CHECK-LABEL: @test_z_zero(
88
// CHECK-NEXT: entry:
9-
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 asm sideeffect "add.w $0, $1, ${2:z}", "=r,r,ri"(i32 [[A:%.*]], i32 0) #[[ATTR1:[0-9]+]], !srcloc !2
9+
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 asm sideeffect "add.w $0, $1, ${2:z}", "=r,r,ri"(i32 [[A:%.*]], i32 0) #[[ATTR1:[0-9]+]], !srcloc [[META6:![0-9]+]]
1010
// CHECK-NEXT: ret void
1111
//
1212
void test_z_zero(int a) {
@@ -16,7 +16,7 @@ void test_z_zero(int a) {
1616

1717
// CHECK-LABEL: @test_z_nonzero(
1818
// CHECK-NEXT: entry:
19-
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 asm sideeffect "add.w $0, $1, ${2:z}", "=r,r,ri"(i32 [[A:%.*]], i32 1) #[[ATTR1]], !srcloc !3
19+
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 asm sideeffect "add.w $0, $1, ${2:z}", "=r,r,ri"(i32 [[A:%.*]], i32 1) #[[ATTR1]], !srcloc [[META7:![0-9]+]]
2020
// CHECK-NEXT: ret void
2121
//
2222
void test_z_nonzero(int a) {

clang/test/CodeGen/LoongArch/lasx/inline-asm-gcc-regs.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@
44
typedef signed char v32i8 __attribute__((vector_size(32), aligned(32)));
55

66
// CHECK-LABEL: @test_xr0(
7-
// CHECK: tail call void asm sideeffect "", "{$xr0}"(<32 x i8> undef) #[[ATTR1:[0-9]+]], !srcloc !2
7+
// CHECK: tail call void asm sideeffect "", "{$xr0}"(<32 x i8> undef) #[[ATTR1:[0-9]+]], !srcloc [[META6:![0-9]+]]
88
//
99
void test_xr0() {
1010
register v32i8 a asm ("$xr0");
1111
asm ("" :: "f"(a));
1212
}
1313

1414
// CHECK-LABEL: @test_xr7(
15-
// CHECK: tail call void asm sideeffect "", "{$xr7}"(<32 x i8> undef) #[[ATTR1]], !srcloc !3
15+
// CHECK: tail call void asm sideeffect "", "{$xr7}"(<32 x i8> undef) #[[ATTR1]], !srcloc [[META7:![0-9]+]]
1616
//
1717
void test_xr7() {
1818
register v32i8 a asm ("$xr7");
1919
asm ("" :: "f"(a));
2020
}
2121

2222
// CHECK-LABEL: @test_xr15(
23-
// CHECK: tail call void asm sideeffect "", "{$xr15}"(<32 x i8> undef) #[[ATTR1]], !srcloc !4
23+
// CHECK: tail call void asm sideeffect "", "{$xr15}"(<32 x i8> undef) #[[ATTR1]], !srcloc [[META8:![0-9]+]]
2424
//
2525
void test_xr15() {
2626
register v32i8 a asm ("$xr15");
2727
asm ("" :: "f"(a));
2828
}
2929

3030
// CHECK-LABEL: @test_xr31(
31-
// CHECK: tail call void asm sideeffect "", "{$xr31}"(<32 x i8> undef) #[[ATTR1]], !srcloc !5
31+
// CHECK: tail call void asm sideeffect "", "{$xr31}"(<32 x i8> undef) #[[ATTR1]], !srcloc [[META9:![0-9]+]]
3232
//
3333
void test_xr31() {
3434
register v32i8 a asm ("$xr31");

clang/test/CodeGen/LoongArch/lasx/inline-asm-operand-modifier.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ typedef long long v4i64 __attribute__ ((vector_size(32), aligned(32)));
66
// CHECK-LABEL: define dso_local void @test_u
77
// CHECK-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] {
88
// CHECK-NEXT: entry:
9-
// CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x i64> asm sideeffect "xvldi ${0:u}, 1", "=f"() #[[ATTR1:[0-9]+]], !srcloc !2
9+
// CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x i64> asm sideeffect "xvldi ${0:u}, 1", "=f"() #[[ATTR1:[0-9]+]], !srcloc [[META6:![0-9]+]]
1010
// CHECK-NEXT: ret void
1111
//
1212
void test_u() {

clang/test/CodeGen/LoongArch/lsx/inline-asm-gcc-regs.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,31 @@
44
typedef signed char v16i8 __attribute__((vector_size(16), aligned(16)));
55

66
// CHECK-LABEL: @test_vr0(
7-
// CHECK: tail call void asm sideeffect "", "{$vr0}"(<16 x i8> undef) #[[ATTR1:[0-9]+]], !srcloc !2
7+
// CHECK: tail call void asm sideeffect "", "{$vr0}"(<16 x i8> undef) #[[ATTR1:[0-9]+]], !srcloc [[META6:![0-9]+]]
88
//
99
void test_vr0() {
1010
register v16i8 a asm ("$vr0");
1111
asm ("" :: "f"(a));
1212
}
1313

1414
// CHECK-LABEL: @test_vr7(
15-
// CHECK: tail call void asm sideeffect "", "{$vr7}"(<16 x i8> undef) #[[ATTR1]], !srcloc !3
15+
// CHECK: tail call void asm sideeffect "", "{$vr7}"(<16 x i8> undef) #[[ATTR1]], !srcloc [[META7:![0-9]+]]
1616
//
1717
void test_vr7() {
1818
register v16i8 a asm ("$vr7");
1919
asm ("" :: "f"(a));
2020
}
2121

2222
// CHECK-LABEL: @test_vr15(
23-
// CHECK: tail call void asm sideeffect "", "{$vr15}"(<16 x i8> undef) #[[ATTR1]], !srcloc !4
23+
// CHECK: tail call void asm sideeffect "", "{$vr15}"(<16 x i8> undef) #[[ATTR1]], !srcloc [[META8:![0-9]+]]
2424
//
2525
void test_vr15() {
2626
register v16i8 a asm ("$vr15");
2727
asm ("" :: "f"(a));
2828
}
2929

3030
// CHECK-LABEL: @test_vr31(
31-
// CHECK: tail call void asm sideeffect "", "{$vr31}"(<16 x i8> undef) #[[ATTR1]], !srcloc !5
31+
// CHECK: tail call void asm sideeffect "", "{$vr31}"(<16 x i8> undef) #[[ATTR1]], !srcloc [[META9:![0-9]+]]
3232
//
3333
void test_vr31() {
3434
register v16i8 a asm ("$vr31");

clang/test/CodeGen/LoongArch/lsx/inline-asm-operand-modifier.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ typedef long long v2i64 __attribute__ ((vector_size(16), aligned(16)));
66
// CHECK-LABEL: define dso_local void @test_w
77
// CHECK-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] {
88
// CHECK-NEXT: entry:
9-
// CHECK-NEXT: [[TMP0:%.*]] = tail call <2 x i64> asm sideeffect "vldi ${0:w}, 1", "=f"() #[[ATTR1:[0-9]+]], !srcloc !2
9+
// CHECK-NEXT: [[TMP0:%.*]] = tail call <2 x i64> asm sideeffect "vldi ${0:w}, 1", "=f"() #[[ATTR1:[0-9]+]], !srcloc [[META6:![0-9]+]]
1010
// CHECK-NEXT: ret void
1111
//
1212
void test_w() {

0 commit comments

Comments
 (0)