From 08c04200fb73183bbc748dd9ec6b7bbc3df4cae7 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Sun, 3 Oct 2021 04:26:22 +0300 Subject: [PATCH] engine: use GCC provided offsetof implementation --- engine/client/mod_dbghulls.c | 8 ++++---- engine/common/net_encode.h | 2 -- engine/eiface.h | 6 +++++- engine/physint.h | 4 +++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/engine/client/mod_dbghulls.c b/engine/client/mod_dbghulls.c index 53f7b28f..e1c7e6f2 100644 --- a/engine/client/mod_dbghulls.c +++ b/engine/client/mod_dbghulls.c @@ -17,7 +17,7 @@ GNU General Public License for more details. #include "mod_local.h" #include "xash3d_mathlib.h" #include "world.h" - +#include "eiface.h" // offsetof #define MAX_CLIPNODE_DEPTH 256 // should never exceeds @@ -67,7 +67,7 @@ _inline void list_del( hullnode_t *entry ) static winding_t * winding_alloc( uint numpoints ) { - return (winding_t *)malloc( (int)((winding_t *)0)->p[numpoints] ); + return (winding_t *)malloc( offsetof( winding_t, p[numpoints] ) ); } static void free_winding( winding_t *w ) @@ -84,7 +84,7 @@ static winding_t *winding_copy( winding_t *w ) winding_t *neww; neww = winding_alloc( w->numpoints ); - memcpy( neww, w, (int)((winding_t *)0)->p[w->numpoints] ); + memcpy( neww, w, offsetof( winding_t, p[w->numpoints] ) ); return neww; } @@ -111,7 +111,7 @@ static void winding_reverse( winding_t *w ) static winding_t *winding_shrink( winding_t *w ) { winding_t *neww = winding_alloc( w->numpoints ); - memcpy( neww, w, (int)((winding_t *)0)->p[w->numpoints] ); + memcpy( neww, w, offsetof( winding_t, p[w->numpoints] )); free_winding( w ); return neww; diff --git a/engine/common/net_encode.h b/engine/common/net_encode.h index a00c9131..85d533c9 100644 --- a/engine/common/net_encode.h +++ b/engine/common/net_encode.h @@ -28,8 +28,6 @@ GNU General Public License for more details. #define DT_STRING BIT( 7 ) // A null terminated string, sent as 8 byte chars #define DT_SIGNED BIT( 8 ) // sign modificator -#undef offsetof -#define offsetof( s, m ) (size_t)&(((s *)0)->m) #define NUM_FIELDS( x ) ((sizeof( x ) / sizeof( x[0] )) - 1) // helper macroses diff --git a/engine/eiface.h b/engine/eiface.h index ddea7f96..87b21130 100644 --- a/engine/eiface.h +++ b/engine/eiface.h @@ -366,7 +366,11 @@ typedef enum _fieldtypes } FIELDTYPE; #ifndef offsetof -#define offsetof(s,m) (size_t)&(((s *)0)->m) +#ifdef __GNUC__ +#define offsetof(s,m) __builtin_offsetof(s,m) +#else +#define offsetof(s,m) (size_t)&(((s *)0)->m) +#endif #endif #define _FIELD(type,name,fieldtype,count,flags) { fieldtype, #name, offsetof(type, name), count, flags } diff --git a/engine/physint.h b/engine/physint.h index e1e15c42..9c246023 100644 --- a/engine/physint.h +++ b/engine/physint.h @@ -16,9 +16,11 @@ GNU General Public License for more details. #ifndef PHYSINT_H #define PHYSINT_H +#include "eiface.h" // offsetof + #define SV_PHYSICS_INTERFACE_VERSION 6 -#define STRUCT_FROM_LINK( l, t, m ) ((t *)((byte *)l - (int)&(((t *)0)->m))) +#define STRUCT_FROM_LINK( l, t, m ) ((t *)((byte *)l - offsetof(t, m))) #define EDICT_FROM_AREA( l ) STRUCT_FROM_LINK( l, edict_t, area ) // values that can be returned with pfnServerState