[clang] [WIP] [clang] Align cleanup structs to prevent SIGBUS on sparc32 (PR #152866)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 9 09:39:05 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Koakuma (koachan)
<details>
<summary>Changes</summary>
The cleanup structs expect that pointers and (u)int64_t have the same alignment requirements, which isn't true on sparc32, which causes SIGBUSes.
See also: https://github.com/llvm/llvm-project/issues/66620
---
Full diff: https://github.com/llvm/llvm-project/pull/152866.diff
3 Files Affected:
- (modified) clang/include/clang/AST/APValue.h (+1-1)
- (modified) clang/lib/CodeGen/CodeGenFunction.h (+3-2)
- (modified) clang/lib/CodeGen/EHScopeStack.h (+1-1)
``````````diff
diff --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h
index 9999a30c51ade..167fa7078d028 100644
--- a/clang/include/clang/AST/APValue.h
+++ b/clang/include/clang/AST/APValue.h
@@ -143,7 +143,7 @@ class APValue {
AddrLabelDiff
};
- class LValueBase {
+ class alignas(8) LValueBase {
typedef llvm::PointerUnion<const ValueDecl *, const Expr *, TypeInfoLValue,
DynamicAllocLValue>
PtrTy;
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index bf16d727bac04..393c5161177df 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -725,7 +725,7 @@ class CodeGenFunction : public CodeGenTypeCache {
};
/// Header for data within LifetimeExtendedCleanupStack.
- struct LifetimeExtendedCleanupHeader {
+ struct alignas(8) LifetimeExtendedCleanupHeader {
/// The size of the following cleanup object.
unsigned Size;
/// The kind of cleanup to push.
@@ -947,7 +947,8 @@ class CodeGenFunction : public CodeGenTypeCache {
LifetimeExtendedCleanupStack.size() + sizeof(Header) + Header.Size +
(Header.IsConditional ? sizeof(ActiveFlag) : 0));
- static_assert(sizeof(Header) % alignof(T) == 0,
+ static_assert((alignof(LifetimeExtendedCleanupHeader) == alignof(T)) &&
+ (alignof(T) == alignof(RawAddress)),
"Cleanup will be allocated on misaligned address");
char *Buffer = &LifetimeExtendedCleanupStack[OldSize];
new (Buffer) LifetimeExtendedCleanupHeader(Header);
diff --git a/clang/lib/CodeGen/EHScopeStack.h b/clang/lib/CodeGen/EHScopeStack.h
index ed11dc2bb05d7..1a9cff48ad852 100644
--- a/clang/lib/CodeGen/EHScopeStack.h
+++ b/clang/lib/CodeGen/EHScopeStack.h
@@ -143,7 +143,7 @@ class EHScopeStack {
///
/// Cleanup implementations should generally be declared in an
/// anonymous namespace.
- class Cleanup {
+ class alignas(8) Cleanup {
// Anchor the construction vtable.
virtual void anchor();
``````````
</details>
https://github.com/llvm/llvm-project/pull/152866
More information about the cfe-commits
mailing list