[clang] [llvm] [Clang] Emit struct TBAA for llvm.errno.tbaa (PR #201375)

2026-06-30 Thread Nikita Popov via cfe-commits

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)

2026-06-29 Thread Antonio Frighetto via cfe-commits

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)

2026-06-27 Thread Nikita Popov via cfe-commits


@@ -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)

2026-06-03 Thread via cfe-commits

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)

2026-06-03 Thread via cfe-commits

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