zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 79a620d617aaadbdf39a2536f3ac85ef1f6fb53e (tree)
parent 70437354c02125f6a6dd36d53b5edb8f5cd193c2
Author: Alex Rønne Petersen <alex@alexrp.com>
Date:   Mon,  7 Apr 2025 20:36:26 +0200

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.

Diffstat:
Msrc/clang.zig | 4++--
Msrc/zig_clang.cpp | 1+
Msrc/zig_clang.h | 19+++++++++++--------
3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/clang.zig b/src/clang.zig @@ -63,8 +63,8 @@ pub const APValueKind = enum(c_int) { }; pub const APValue = extern struct { - Kind: APValueKind, - Data: if (builtin.os.tag == .windows and (builtin.abi == .msvc or builtin.abi == .itanium)) [52]u8 else [68]u8, + Kind: APValueKind align(if (builtin.cpu.arch == .x86 and builtin.os.tag != .windows) 4 else 8), + Data: if (builtin.cpu.arch == .x86 and builtin.os.tag != .windows) [44]u8 else [52]u8, pub const getKind = ZigClangAPValue_getKind; extern fn ZigClangAPValue_getKind(*const APValue) APValueKind; diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp @@ -2329,6 +2329,7 @@ static_assert((clang::UnaryExprOrTypeTrait)ZigClangUnaryExprOrTypeTrait_Kind::Zi static_assert((clang::UnaryExprOrTypeTrait)ZigClangUnaryExprOrTypeTrait_Kind::ZigClangUnaryExprOrTypeTrait_KindOpenMPRequiredSimdAlign == clang::UnaryExprOrTypeTrait::UETT_OpenMPRequiredSimdAlign, ""); static_assert(sizeof(ZigClangAPValue) == sizeof(clang::APValue), ""); +static_assert(alignof(ZigClangAPValue) == alignof(clang::APValue), ""); static_assert(sizeof(ZigClangSourceLocation) == sizeof(clang::SourceLocation), ""); static ZigClangSourceLocation bitcast(clang::SourceLocation src) { diff --git a/src/zig_clang.h b/src/zig_clang.h @@ -9,6 +9,7 @@ #define ZIG_ZIG_CLANG_H #include <inttypes.h> +#include <stdalign.h> #include <stdbool.h> #include <stddef.h> @@ -65,16 +66,18 @@ enum ZigClangAPValueKind { ZigClangAPValueAddrLabelDiff, }; -struct ZigClangAPValue { - enum ZigClangAPValueKind Kind; - // experimentally-derived size of clang::APValue::DataType -#if defined(_WIN32) && defined(_MSC_VER) - char Data[52]; -#elif defined(__i386__) && !defined(_WIN32) - char Data[44]; +#if defined(__i386__) && !defined(_WIN32) +# define ZIG_CLANG_APVALUE_SIZE 44 +# define ZIG_CLANG_APVALUE_ALIGN 4 #else - char Data[52]; +# define ZIG_CLANG_APVALUE_SIZE 52 +# define ZIG_CLANG_APVALUE_ALIGN 8 #endif + +struct alignas(ZIG_CLANG_APVALUE_ALIGN) ZigClangAPValue { + enum ZigClangAPValueKind Kind; + // experimentally-derived size of clang::APValue::DataType + char Data[ZIG_CLANG_APVALUE_SIZE]; }; struct ZigClangExprEvalResult {