|
From: <sv...@va...> - 2013-01-18 06:17:07
|
philippe 2013-01-18 06:15:44 +0000 (Fri, 18 Jan 2013)
New Revision: 2643
Log:
Add a vg_alignof macro
Note that this macro behaves slightly differently for some types
from the gcc __alignof__ and from the equivalent (new) standardised
alignof.
vg_alignof macro is needed for the "perm_malloc" callers (next commit)
to determine the alignment of small blocks, but might be useful
for other purposes => placed in libvex_basictypes.h, close to offsetof.
Modified files:
trunk/pub/libvex_basictypes.h
Modified: trunk/pub/libvex_basictypes.h (+24 -0)
===================================================================
--- trunk/pub/libvex_basictypes.h 2013-01-17 14:23:53 +00:00 (rev 2642)
+++ trunk/pub/libvex_basictypes.h 2013-01-18 06:15:44 +00:00 (rev 2643)
@@ -127,8 +127,32 @@
#if !defined(offsetof)
# define offsetof(type,memb) ((Int)(HWord)&((type*)0)->memb)
#endif
+/* Our definition of offsetof is giving the same result as
+ the standard/predefined offsetof. So, we use the same name.
+ We use a prefix vg_ for vg_alignof as its behaviour slightly
+ differs from the standard alignof/gcc defined __alignof__
+*/
+#define vg_alignof(_type) (sizeof(struct {char c;_type _t;})-sizeof(_type))
+/* vg_alignof returns a "safe" alignement.
+ "safe" is defined as the alignment chosen by the compiler in
+ a struct made of a char followed by this type.
+ Note that this is not necessarily the "preferred" alignment
+ for a platform. This preferred alignment is returned by the gcc
+ __alignof__ and by the standard (in recent standard) alignof.
+ Compared to __alignof__, vg_alignof gives on some platforms (e.g.
+ amd64, ppc32, ppc64) a bigger alignment for long double (16 bytes
+ instead of 8).
+ On some platforms (e.g. x86), vg_alignof gives a smaller alignment
+ than __alignof__ for long long and double (4 bytes instead of 8).
+ If we want to have the "preferred" alignment for the basic types,
+ then either we need to depend on gcc __alignof__, or on a (too)
+ recent standard and compiler (implementing <stdalign.h>).
+*/
+
+
+
/* We need to know the host word size in order to write Ptr_to_ULong
and ULong_to_Ptr in a way that doesn't cause compilers to complain.
These functions allow us to cast pointers to and from 64-bit
|