Skip to content

Commit 79a620d

Browse files
committed
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.
1 parent 7043735 commit 79a620d

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

src/clang.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ pub const APValueKind = enum(c_int) {
6363
};
6464

6565
pub 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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2329,6 +2329,7 @@ static_assert((clang::UnaryExprOrTypeTrait)ZigClangUnaryExprOrTypeTrait_Kind::Zi
23292329
static_assert((clang::UnaryExprOrTypeTrait)ZigClangUnaryExprOrTypeTrait_Kind::ZigClangUnaryExprOrTypeTrait_KindOpenMPRequiredSimdAlign == clang::UnaryExprOrTypeTrait::UETT_OpenMPRequiredSimdAlign, "");
23302330

23312331
static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), "");
2332+
static_assert(alignof(ZigClangAPValue) == alignof(clang::APValue), "");
23322333

23332334
static_assert(sizeof(ZigClangSourceLocation) == sizeof(clang::SourceLocation), "");
23342335
static ZigClangSourceLocation bitcast(clang::SourceLocation src) {

src/zig_clang.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

68-
struct 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+
77+
struct 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

8083
struct ZigClangExprEvalResult {

0 commit comments

Comments
 (0)