From cddca68e972e316b06e21e04de431aa81beadb89 Mon Sep 17 00:00:00 2001 From: JCash Date: Fri, 12 Aug 2022 12:42:55 +0200 Subject: [PATCH 1/2] Add optional support for 16 byte alignment for user data structs --- src/lj_obj.h | 24 ++++++++++++++++++++++-- src/luaconf.h | 10 ++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/lj_obj.h b/src/lj_obj.h index 67e41181..c1a2097b 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -319,17 +319,37 @@ typedef struct GCstr { /* -- Userdata object ----------------------------------------------------- */ +#if defined(__GNUC__) + #define LUA_STRUCT_ALIGNED(a) __attribute__ ((aligned (a))) +#elif defined(_MSC_VER) + #define LUA_STRUCT_ALIGNED(a) __declspec(align(a)) +#else + #warning "No struct alignment for GCudata" + #define LUA_STRUCT_ALIGNED(a) +#endif + /* Userdata object. Payload follows. */ -typedef struct GCudata { +typedef struct LUA_STRUCT_ALIGNED(LUA_USERDATA_ALIGNMENT) GCudata { GCHeader; uint8_t udtype; /* Userdata type. */ uint8_t unused2; GCRef env; /* Should be at same offset in GCfunc. */ MSize len; /* Size of payload. */ GCRef metatable; /* Must be at same offset in GCtab. */ - uint32_t align1; /* To force 8 byte alignment of the payload. */ + + uint32_t align0; /* To force 8 byte alignment of the payload. */ +#if LUA_USERDATA_ALIGNMENT == 16 + #ifndef LJ_GC64 + uint64_t align1;/* To force 16 byte alignment of the payload. */ + #endif +#endif + } GCudata; +#undef LUA_STRUCT_ALIGNED + +LJ_STATIC_ASSERT((sizeof(GCudata) % LUA_USERDATA_ALIGNMENT) == 0); + /* Userdata types. */ enum { UDTYPE_USERDATA, /* Regular userdata. */ diff --git a/src/luaconf.h b/src/luaconf.h index e8790c1d..f676fa94 100644 --- a/src/luaconf.h +++ b/src/luaconf.h @@ -123,6 +123,16 @@ #define LUA_INTFRMLEN "l" #define LUA_INTFRM_T long +/* Allows for aligning the userdata struct. Valid values are 8 or 16. Default is 8. +*/ +#if !defined(LUA_USERDATA_ALIGNMENT) + #define LUA_USERDATA_ALIGNMENT 8 +#endif + +#if !(LUA_USERDATA_ALIGNMENT == 8 || LUA_USERDATA_ALIGNMENT == 16) +#error "Invalid LUA_USERDATA_ALIGNMENT (valid values are 8 or 16)" +#endif + /* Linkage of public API functions. */ #if defined(LUA_BUILD_AS_DLL) #if defined(LUA_CORE) || defined(LUA_LIB) From a37acfab443552a9b029caf34eda35a3f57dafae Mon Sep 17 00:00:00 2001 From: JCash Date: Fri, 12 Aug 2022 12:45:50 +0200 Subject: [PATCH 2/2] Use LJ_ALIGN instead --- src/lj_obj.h | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/lj_obj.h b/src/lj_obj.h index c1a2097b..c806e684 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -319,17 +319,8 @@ typedef struct GCstr { /* -- Userdata object ----------------------------------------------------- */ -#if defined(__GNUC__) - #define LUA_STRUCT_ALIGNED(a) __attribute__ ((aligned (a))) -#elif defined(_MSC_VER) - #define LUA_STRUCT_ALIGNED(a) __declspec(align(a)) -#else - #warning "No struct alignment for GCudata" - #define LUA_STRUCT_ALIGNED(a) -#endif - /* Userdata object. Payload follows. */ -typedef struct LUA_STRUCT_ALIGNED(LUA_USERDATA_ALIGNMENT) GCudata { +typedef struct LJ_ALIGN(LUA_USERDATA_ALIGNMENT) GCudata { GCHeader; uint8_t udtype; /* Userdata type. */ uint8_t unused2;