authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-07 20:36:26+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-09 11:53:24+02:00
log79a620d617aaadbdf39a2536f3ac85ef1f6fb53e
tree476f22613d3197645cabd7f70b2cf1b96bdb91c8
parent70437354c02125f6a6dd36d53b5edb8f5cd193c2

zig_clang: Fix ZigClangAPValue being underaligned vs clang::APValue.

Also add a static_assert to catch future alignment mismatches on this type, and reflect recent layout changes in the Zig bindings.

3 files changed, 14 insertions(+), 10 deletions(-)

src/clang.zig+2-2
......@@ -63,8 +63,8 @@ pub const APValueKind = enum(c_int) {
6363};
6464
6565pub const APValue = extern struct {
66 Kind: APValueKind,
67 Data: if (builtin.os.tag == .windows and (builtin.abi == .msvc or builtin.abi == .itanium)) [52]u8 else [68]u8,
66 Kind: APValueKind align(if (builtin.cpu.arch == .x86 and builtin.os.tag != .windows) 4 else 8),
67 Data: if (builtin.cpu.arch == .x86 and builtin.os.tag != .windows) [44]u8 else [52]u8,
6868
6969 pub const getKind = ZigClangAPValue_getKind;
7070 extern fn ZigClangAPValue_getKind(*const APValue) APValueKind;
src/zig_clang.cpp+1
......@@ -2329,6 +2329,7 @@ static_assert((clang::UnaryExprOrTypeTrait)ZigClangUnaryExprOrTypeTrait_Kind::Zi
23292329static_assert((clang::UnaryExprOrTypeTrait)ZigClangUnaryExprOrTypeTrait_Kind::ZigClangUnaryExprOrTypeTrait_KindOpenMPRequiredSimdAlign == clang::UnaryExprOrTypeTrait::UETT_OpenMPRequiredSimdAlign, "");
23302330
23312331static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");
2332static_assert(alignof(ZigClangAPValue) == alignof(clang::APValue), "");
23322333
23332334static_assert(sizeof(ZigClangSourceLocation) == sizeof(clang::SourceLocation), "");
23342335static ZigClangSourceLocation bitcast(clang::SourceLocation src) {
src/zig_clang.h+11-8
......@@ -9,6 +9,7 @@
99#define ZIG_ZIG_CLANG_H
1010
1111#include <inttypes.h>
12#include <stdalign.h>
1213#include <stdbool.h>
1314#include <stddef.h>
1415
......@@ -65,16 +66,18 @@ enum ZigClangAPValueKind {
6566 ZigClangAPValueAddrLabelDiff,
6667};
6768
68struct ZigClangAPValue {
69 enum ZigClangAPValueKind Kind;
70 // experimentally-derived size of clang::APValue::DataType
71#if defined(_WIN32) && defined(_MSC_VER)
72 char Data[52];
73#elif defined(__i386__) && !defined(_WIN32)
74 char Data[44];
69#if defined(__i386__) && !defined(_WIN32)
70# define ZIG_CLANG_APVALUE_SIZE 44
71# define ZIG_CLANG_APVALUE_ALIGN 4
7572#else
76 char Data[52];
73# define ZIG_CLANG_APVALUE_SIZE 52
74# define ZIG_CLANG_APVALUE_ALIGN 8
7775#endif
76
77struct alignas(ZIG_CLANG_APVALUE_ALIGN) ZigClangAPValue {
78 enum ZigClangAPValueKind Kind;
79 // experimentally-derived size of clang::APValue::DataType
80 char Data[ZIG_CLANG_APVALUE_SIZE];
7881};
7982
8083struct ZigClangExprEvalResult {