This week's VM build problem...

Ian Piumarta ian.piumarta at inria.fr
Tue Mar 29 07:08:42 UTC 2005


On Mar 24, 2005, at 05:20, Alan Grimes wrote:

> Someone forgot to check in sqMemoryAccess.h?

I didn't think so, but here you go in case I did...

Ian

/* sqMemoryAccess.h -- memory accessors (and associated type 
definitions)
  *
  * Author: Ian.Piumarta at squeakland.org
  *
  * Last edited: 2005-03-28 23:02:04 by piumarta on emilia.local
  */

/* Systematic use of the macros defined in this file within the
  * Interpreter, ObjectMemory and plugins will permit all four
  * combinations of 32/64-bit image and 32/64-bit host to compile and
  * run correctly.  (Code that uses explicit casts and/or integer
  * constants in arithmetic on object pointers will invariably fail in
  * at least one of the four possible combinations.)
  */

#ifndef __sqMemoryAccess_h
#define __sqMemoryAccess_h

#include "config.h"

#if defined(HAVE_INTERP_H)
# include "interp.h"
#else
# define SQ_VI_BYTES_PER_WORD 4		/* build a 32-bit VM */
# warning
# warning ***************************************************
# warning *
# warning * interp.h not found -- defaulting to a 32-bit VM
# warning *
# warning * update your image-side VM sources to the latest
# warning * version to avoid this message
# warning *
# warning ***************************************************
# warning
#endif

#if (SQ_VI_BYTES_PER_WORD == 4)
# define SQ_IMAGE32 1
#else
# define SQ_IMAGE64 1
#endif

#if (SIZEOF_VOID_P == 4)
# define SQ_HOST32 1
#elif (SIZEOF_VOID_P == 8)
# define SQ_HOST64 1
#else
# error host is neither 32- nor 64-bit?
#endif

#if defined(SQ_IMAGE32)
   typedef int		sqInt;
   typedef unsigned int	usqInt;
#elif defined(SQ_HOST64)
   typedef long		sqInt;
   typedef unsigned long	usqInt;
#else
# if (SIZEOF_LONG_LONG != 8)
#   error long long integers are not 64-bits wide?
# endif
   typedef long long		sqInt;
   typedef unsigned long long	usqInt;
#endif

#if defined(SQ_HOST64) && defined(SQ_IMAGE32)
   extern char *sqMemoryBase;
# define SQ_FAKE_MEMORY_OFFSET	16 // (1*1024*1024)	/* nonzero to debug 
addr xlation */
#else
# define sqMemoryBase		((char *)0)
#endif

static inline sqInt byteAtPointer(char *ptr)			{ return 
(sqInt)(*((unsigned char *)ptr)); }
static inline sqInt byteAtPointerput(char *ptr, int val)	{ return 
(sqInt)(*((unsigned char *)ptr)= (unsigned char)val); }
static inline sqInt shortAtPointer(char *ptr)			{ return 
(sqInt)(*((short *)ptr)); }
static inline sqInt shortAtPointerput(char *ptr, int val)	{ return 
(sqInt)(*((short *)ptr)= (short)val); }
static inline sqInt intAtPointer(char *ptr)			{ return 
(sqInt)(*((unsigned int *)ptr)); }
static inline sqInt intAtPointerput(char *ptr, int val)		{ return 
(sqInt)(*((unsigned int *)ptr)= (int)val); }
static inline sqInt longAtPointer(char *ptr)			{ return 
(sqInt)(*((sqInt *)ptr)); }
static inline sqInt longAtPointerput(char *ptr, sqInt val)	{ return 
(sqInt)(*((sqInt *)ptr)= (sqInt)val); }
static inline sqInt oopAtPointer(char *ptr)			{ return (sqInt)(*((sqInt 
*)ptr)); }
static inline sqInt oopAtPointerput(char *ptr, sqInt val)	{ return 
(sqInt)(*((sqInt *)ptr)= (sqInt)val); }

static inline char *pointerForOop(sqInt oop)			{ return sqMemoryBase + 
oop; }
static inline sqInt oopForPointer(char *ptr)			{ return (sqInt)(ptr - 
sqMemoryBase); }

static inline sqInt byteAt(sqInt oop)				{ return 
byteAtPointer(pointerForOop(oop)); }
static inline sqInt byteAtput(sqInt oop, int val)		{ return 
byteAtPointerput(pointerForOop(oop), val); }
static inline sqInt shortAt(sqInt oop)				{ return 
shortAtPointer(pointerForOop(oop)); }
static inline sqInt shortAtput(sqInt oop, int val)		{ return 
shortAtPointerput(pointerForOop(oop), val); }
static inline sqInt intAt(sqInt oop)				{ return 
intAtPointer(pointerForOop(oop)); }
static inline sqInt intAtput(sqInt oop, int val)		{ return 
intAtPointerput(pointerForOop(oop), val); }
static inline sqInt longAt(sqInt oop)				{ return 
longAtPointer(pointerForOop(oop)); }
static inline sqInt longAtput(sqInt oop, sqInt val)		{ return 
longAtPointerput(pointerForOop(oop), val); }
static inline sqInt oopAt(sqInt oop)				{ return 
oopAtPointer(pointerForOop(oop)); }
static inline sqInt oopAtput(sqInt oop, sqInt val)		{ return 
oopAtPointerput(pointerForOop(oop), val); }

#define long32At	intAt
#define long32Atput	intAtput

/* platform-dependent float conversion macros */
/* Note: Second argument must be a variable name, not an expression! */
/* Note: Floats in image are always in PowerPC word order; change
    these macros to swap words if necessary. This costs no extra and
    obviates sometimes having to word-swap floats when reading an image.
*/
#if defined(DOUBLE_WORD_ALIGNMENT) || defined(DOUBLE_WORD_ORDER)
/* this is to allow strict aliasing assumption in the optimizer */
typedef union { double d; int i[sizeof(double) / sizeof(int)]; } 
_swapper;
# ifdef DOUBLE_WORD_ORDER
/* word-based copy with swapping for non-PowerPC order */
#   define storeFloatAtPointerfrom(intPointerToFloat, floatVarName) \
	*((int *)(intPointerToFloat) + 0) = ((_swapper 
*)(&floatVarName))->i[1]; \
	*((int *)(intPointerToFloat) + 1) = ((_swapper 
*)(&floatVarName))->i[0];
#   define fetchFloatAtPointerinto(intPointerToFloat, floatVarName) \
	((_swapper *)(&floatVarName))->i[1] = *((int *)(intPointerToFloat) + 
0); \
	((_swapper *)(&floatVarName))->i[0] = *((int *)(intPointerToFloat) + 
1);
# else /*!DOUBLE_WORD_ORDER*/
/* word-based copy for machines with alignment restrictions */
#   define storeFloatAtPointerfrom(intPointerToFloat, floatVarName) \
	*((int *)(intPointerToFloat) + 0) = ((_swapper 
*)(&floatVarName))->i[0]; \
	*((int *)(intPointerToFloat) + 1) = ((_swapper 
*)(&floatVarName))->i[1];
#   define fetchFloatAtPointerinto(intPointerToFloat, floatVarName) \
	((_swapper *)(&floatVarName))->i[0] = *((int *)(intPointerToFloat) + 
0); \
	((_swapper *)(&floatVarName))->i[1] = *((int *)(intPointerToFloat) + 
1);
# endif /*!DOUBLE_WORD_ORDER*/
#else /*!(DOUBLE_WORD_ORDER||DOUBLE_WORD_ALIGNMENT)*/
/* for machines that allow doubles to be on any word boundary */
# define storeFloatAtPointerfrom(i, floatVarName) \
	*((double *) (i)) = (floatVarName);
# define fetchFloatAtPointerinto(i, floatVarName) \
	(floatVarName) = *((double *) (i));
#endif

#define storeFloatAtfrom(i, 
floatVarName)	storeFloatAtPointerfrom(pointerForOop(i), floatVarName)
#define fetchFloatAtinto(i, 
floatVarName)	fetchFloatAtPointerinto(pointerForOop(i), floatVarName)


/* This doesn't belong here, but neither do 'self flag: ...'s belong in 
the image. */

static void inline flag(char *ignored) {}


#endif /* __sqMemoryAccess_h */




More information about the Vm-dev mailing list