[clang] [llvm] [Clang] Emit struct TBAA for llvm.errno.tbaa (PR #201375)
https://github.com/nikic auto_merge_enabled https://github.com/llvm/llvm-project/pull/201375 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [Clang] Emit struct TBAA for llvm.errno.tbaa (PR #201375)
https://github.com/antoniofrighetto approved this pull request. I think we are on the same page here, so LGTM. https://github.com/llvm/llvm-project/pull/201375 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [Clang] Emit struct TBAA for llvm.errno.tbaa (PR #201375)
@@ -232,13 +232,13 @@ int assign(void) {
return *p;
}
//.
-// C11-O2: [[INT_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
-// C11-O2: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}
+// C11-O2: [[META3:![0-9]+]] = !{!"int", [[META4:![0-9]+]], i64 0}
nikic wrote:
These are generated check lines, and this TBAA node is only referenced from
module metadata, which we don't check.
The test that checks the actually generated TBAA for llvm.errno.tbaa is
clang/test/CodeGen/errno-tbaa.c.
https://github.com/llvm/llvm-project/pull/201375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [Clang] Emit struct TBAA for llvm.errno.tbaa (PR #201375)
llvmorg-github-actions[bot] wrote:
@llvm/pr-subscribers-clang-codegen
Author: Nikita Popov (nikic)
Changes
For `!llvm.errno.tbaa`, emit TBAA for accessing the member of a virtual
`__libc_errno` struct. The purpose is to indicate that errno aliases with `int`
accesses, but not `int` member accesses in other structs.
This is an alternative to https://github.com/llvm/llvm-project/pull/200367.
---
Patch is 795.52 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/201375.diff
40 Files Affected:
- (modified) clang/lib/CodeGen/CodeGenModule.cpp (+16-3)
- (modified) clang/lib/CodeGen/CodeGenTBAA.h (+4-4)
- (modified) clang/test/C/C11/n1285_1.c (+36-36)
- (modified) clang/test/CodeGen/AArch64/ls64-inline-asm.c (+12-12)
- (modified) clang/test/CodeGen/PowerPC/builtins-ppc-amo.c (+32-32)
- (modified) clang/test/CodeGen/allow-ubsan-check.c (+28-28)
- (modified) clang/test/CodeGen/attr-counted-by.c (+374-374)
- (modified) clang/test/CodeGen/errno-tbaa.c (+9-1)
- (modified) clang/test/CodeGen/sanitize-metadata-ignorelist.c (+6-6)
- (modified) clang/test/CodeGen/sanitize-metadata-nosanitize.c (+31-29)
- (modified) clang/test/CodeGen/sanitize-type-globals.cpp (+2-1)
- (modified) clang/test/CodeGen/tbaa-class.cpp (+54-54)
- (modified) clang/test/CodeGen/tbaa-matrix.c (+44-44)
- (modified) clang/test/CodeGen/tbaa-ms-abi.cpp (+8-8)
- (modified) clang/test/CodeGen/tbaa-pointers.c (+276-160)
- (modified) clang/test/CodeGen/tbaa-struct-bitfield-endianness.cpp (+2-2)
- (modified) clang/test/CodeGen/tbaa-struct.cpp (+5-6)
- (modified) clang/test/CodeGen/tbaa.c (+220-53)
- (modified) clang/test/CodeGen/tbaa.cpp (+3-5)
- (modified) clang/test/CodeGen/union-tbaa1.c (+12-12)
- (modified) clang/test/CodeGen/wasm-fp16.c (+39-38)
- (modified) clang/test/CodeGenCXX/attr-likelihood-if-branch-weights.cpp (+4-4)
- (modified) clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp (+76-76)
- (modified) clang/test/CodeGenCXX/attr-likelihood-switch-branch-weights.cpp
(+53-53)
- (modified) clang/test/CodeGenCXX/load-reference-metadata.cpp (+21-21)
- (modified) clang/test/CodeGenCXX/std-byte.cpp (+42-15)
- (modified) clang/test/CodeGenOpenCL/amdgpu-cluster-dims.cl (+20-18)
- (modified) clang/test/CodeGenOpenCL/amdgpu-enqueue-kernel.cl (+132-130)
- (modified) clang/test/CodeGenOpenCL/amdgpu-printf.cl (+18-18)
- (modified) clang/test/CodeGenOpenCL/builtins-amdgcn-workgroup-size.cl
(+116-116)
- (modified)
clang/test/CodeGenOpenCL/implicit-addrspacecast-function-parameter.cl (+9-9)
- (modified) clang/test/CodeGenOpenCL/preserve_vec3.cl (+6-6)
- (modified) clang/test/Headers/__clang_hip_math.hip (+405-406)
- (modified) clang/test/Headers/amdhsa_abi.cl (+64-64)
- (modified) clang/test/OpenMP/bug54082.c (+24-24)
- (modified) clang/test/OpenMP/bug56913.c (+10-10)
- (modified)
clang/test/OpenMP/nvptx_target_parallel_reduction_codegen_tbaa_PR46146.cpp
(+263-263)
- (modified) clang/test/OpenMP/parallel_if_codegen_PR51349.cpp (+20-20)
- (modified) clang/test/OpenMP/taskloop_strictmodifier_codegen.cpp (+101-101)
- (modified) llvm/test/Transforms/InstCombine/may-alias-errno.ll (+31-10)
``diff
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp
b/clang/lib/CodeGen/CodeGenModule.cpp
index 50089f4a5016a..ff9940d444a23 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1795,10 +1795,23 @@ void CodeGenModule::Release() {
// for an int access. This allows LLVM to reason about what memory can be
// accessed by certain library calls that only touch errno.
if (TBAA) {
-TBAAAccessInfo TBAAInfo = getTBAAAccessInfo(Context.IntTy);
-if (llvm::MDNode *IntegerNode = getTBAAAccessTagInfo(TBAAInfo)) {
+if (llvm::MDNode *IntegerNode = getTBAATypeInfo(Context.IntTy)) {
+ // Pretend that errno is part of a __libc_errno struct, to indicate that
+ // it should alias with plain integer accesses, but not int member
+ // accesses in structs.
+ llvm::MDBuilder MDB(TheModule.getContext());
+ uint64_t Size = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
+ llvm::MDNode *StructNode =
+ CodeGenOpts.NewStructPathTBAA
+ ? MDB.createTBAATypeNode(TBAA->getChar(), Size,
+ MDB.createString("__libc_errno"),
+ {{0, Size, IntegerNode}})
+ : MDB.createTBAAStructTypeNode("__libc_errno",
+ {{IntegerNode, 0}});
+ TBAAAccessInfo Info(StructNode, IntegerNode, 0, Size);
+ llvm::MDNode *StructTagNode = getTBAAAccessTagInfo(Info);
auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(ErrnoTBAAMDName);
- ErrnoTBAAMD->addOperand(IntegerNode);
+ ErrnoTBAAMD->addOperand(StructTagNode);
}
}
}
diff --git a/clang/lib/CodeGen/CodeGenTBAA.h b/clang/lib/CodeGen/CodeGenTBAA.h
index f3345274c8f55..5e1221a129103 10064
[clang] [llvm] [Clang] Emit struct TBAA for llvm.errno.tbaa (PR #201375)
llvmorg-github-actions[bot] wrote:
@llvm/pr-subscribers-backend-amdgpu
Author: Nikita Popov (nikic)
Changes
For `!llvm.errno.tbaa`, emit TBAA for accessing the member of a virtual
`__libc_errno` struct. The purpose is to indicate that errno aliases with `int`
accesses, but not `int` member accesses in other structs.
This is an alternative to https://github.com/llvm/llvm-project/pull/200367.
---
Patch is 795.52 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/201375.diff
40 Files Affected:
- (modified) clang/lib/CodeGen/CodeGenModule.cpp (+16-3)
- (modified) clang/lib/CodeGen/CodeGenTBAA.h (+4-4)
- (modified) clang/test/C/C11/n1285_1.c (+36-36)
- (modified) clang/test/CodeGen/AArch64/ls64-inline-asm.c (+12-12)
- (modified) clang/test/CodeGen/PowerPC/builtins-ppc-amo.c (+32-32)
- (modified) clang/test/CodeGen/allow-ubsan-check.c (+28-28)
- (modified) clang/test/CodeGen/attr-counted-by.c (+374-374)
- (modified) clang/test/CodeGen/errno-tbaa.c (+9-1)
- (modified) clang/test/CodeGen/sanitize-metadata-ignorelist.c (+6-6)
- (modified) clang/test/CodeGen/sanitize-metadata-nosanitize.c (+31-29)
- (modified) clang/test/CodeGen/sanitize-type-globals.cpp (+2-1)
- (modified) clang/test/CodeGen/tbaa-class.cpp (+54-54)
- (modified) clang/test/CodeGen/tbaa-matrix.c (+44-44)
- (modified) clang/test/CodeGen/tbaa-ms-abi.cpp (+8-8)
- (modified) clang/test/CodeGen/tbaa-pointers.c (+276-160)
- (modified) clang/test/CodeGen/tbaa-struct-bitfield-endianness.cpp (+2-2)
- (modified) clang/test/CodeGen/tbaa-struct.cpp (+5-6)
- (modified) clang/test/CodeGen/tbaa.c (+220-53)
- (modified) clang/test/CodeGen/tbaa.cpp (+3-5)
- (modified) clang/test/CodeGen/union-tbaa1.c (+12-12)
- (modified) clang/test/CodeGen/wasm-fp16.c (+39-38)
- (modified) clang/test/CodeGenCXX/attr-likelihood-if-branch-weights.cpp (+4-4)
- (modified) clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp (+76-76)
- (modified) clang/test/CodeGenCXX/attr-likelihood-switch-branch-weights.cpp
(+53-53)
- (modified) clang/test/CodeGenCXX/load-reference-metadata.cpp (+21-21)
- (modified) clang/test/CodeGenCXX/std-byte.cpp (+42-15)
- (modified) clang/test/CodeGenOpenCL/amdgpu-cluster-dims.cl (+20-18)
- (modified) clang/test/CodeGenOpenCL/amdgpu-enqueue-kernel.cl (+132-130)
- (modified) clang/test/CodeGenOpenCL/amdgpu-printf.cl (+18-18)
- (modified) clang/test/CodeGenOpenCL/builtins-amdgcn-workgroup-size.cl
(+116-116)
- (modified)
clang/test/CodeGenOpenCL/implicit-addrspacecast-function-parameter.cl (+9-9)
- (modified) clang/test/CodeGenOpenCL/preserve_vec3.cl (+6-6)
- (modified) clang/test/Headers/__clang_hip_math.hip (+405-406)
- (modified) clang/test/Headers/amdhsa_abi.cl (+64-64)
- (modified) clang/test/OpenMP/bug54082.c (+24-24)
- (modified) clang/test/OpenMP/bug56913.c (+10-10)
- (modified)
clang/test/OpenMP/nvptx_target_parallel_reduction_codegen_tbaa_PR46146.cpp
(+263-263)
- (modified) clang/test/OpenMP/parallel_if_codegen_PR51349.cpp (+20-20)
- (modified) clang/test/OpenMP/taskloop_strictmodifier_codegen.cpp (+101-101)
- (modified) llvm/test/Transforms/InstCombine/may-alias-errno.ll (+31-10)
``diff
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp
b/clang/lib/CodeGen/CodeGenModule.cpp
index 50089f4a5016a..ff9940d444a23 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1795,10 +1795,23 @@ void CodeGenModule::Release() {
// for an int access. This allows LLVM to reason about what memory can be
// accessed by certain library calls that only touch errno.
if (TBAA) {
-TBAAAccessInfo TBAAInfo = getTBAAAccessInfo(Context.IntTy);
-if (llvm::MDNode *IntegerNode = getTBAAAccessTagInfo(TBAAInfo)) {
+if (llvm::MDNode *IntegerNode = getTBAATypeInfo(Context.IntTy)) {
+ // Pretend that errno is part of a __libc_errno struct, to indicate that
+ // it should alias with plain integer accesses, but not int member
+ // accesses in structs.
+ llvm::MDBuilder MDB(TheModule.getContext());
+ uint64_t Size = Context.getTypeSizeInChars(Context.IntTy).getQuantity();
+ llvm::MDNode *StructNode =
+ CodeGenOpts.NewStructPathTBAA
+ ? MDB.createTBAATypeNode(TBAA->getChar(), Size,
+ MDB.createString("__libc_errno"),
+ {{0, Size, IntegerNode}})
+ : MDB.createTBAAStructTypeNode("__libc_errno",
+ {{IntegerNode, 0}});
+ TBAAAccessInfo Info(StructNode, IntegerNode, 0, Size);
+ llvm::MDNode *StructTagNode = getTBAAAccessTagInfo(Info);
auto *ErrnoTBAAMD = TheModule.getOrInsertNamedMetadata(ErrnoTBAAMDName);
- ErrnoTBAAMD->addOperand(IntegerNode);
+ ErrnoTBAAMD->addOperand(StructTagNode);
}
}
}
diff --git a/clang/lib/CodeGen/CodeGenTBAA.h b/clang/lib/CodeGen/CodeGenTBAA.h
index f3345274c8f55..5e1221a129103 1006
