diff options
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/objcodes.c | 2 | ||||
-rw-r--r-- | libguile/objcodes.h | 1 | ||||
-rw-r--r-- | libguile/vm-engine.h | 4 | ||||
-rw-r--r-- | libguile/vm-i-system.c | 2 | ||||
-rw-r--r-- | libguile/vm.c | 49 |
5 files changed, 26 insertions, 32 deletions
diff --git a/libguile/objcodes.c b/libguile/objcodes.c index 5a43edb67..728dd8d13 100644 --- a/libguile/objcodes.c +++ b/libguile/objcodes.c @@ -50,7 +50,7 @@ /* The objcode magic header. */ #define OBJCODE_COOKIE \ - "GOOF-0.7-" OBJCODE_ENDIANNESS "-" OBJCODE_WORD_SIZE "---" + "GOOF-0.8-" OBJCODE_ENDIANNESS "-" OBJCODE_WORD_SIZE "---" /* The length of the header must be a multiple of 8 bytes. */ verify (((sizeof (OBJCODE_COOKIE) - 1) & 7) == 0); diff --git a/libguile/objcodes.h b/libguile/objcodes.h index d50f6dc94..2bb4e6040 100644 --- a/libguile/objcodes.h +++ b/libguile/objcodes.h @@ -29,6 +29,7 @@ struct scm_objcode { scm_t_uint32 len; /* the maximum index of base[] */ scm_t_uint32 metalen; /* well, i lie. this many bytes at the end of base[] for metadata */ + scm_t_uint32 unused; /* pad so that `base' is 8-byte aligned */ scm_t_uint8 base[0]; }; diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h index 15ebb539e..c0f772fb8 100644 --- a/libguile/vm-engine.h +++ b/libguile/vm-engine.h @@ -130,11 +130,14 @@ #ifdef VM_ENABLE_PARANOID_ASSERTIONS #define CHECK_IP() \ do { if (ip < bp->base || ip - bp->base > bp->len) abort (); } while (0) +#define ASSERT_ALIGNED_PROCEDURE() \ + do { if ((scm_t_bits)bp % 8) abort (); } while (0) #define ASSERT_BOUND(x) \ do { if ((x) == SCM_UNDEFINED) { SYNC_REGISTER (); abort(); } \ } while (0) #else #define CHECK_IP() +#define ASSERT_ALIGNED_PROCEDURE() #define ASSERT_BOUND(x) #endif @@ -143,6 +146,7 @@ { \ if (bp != SCM_PROGRAM_DATA (program)) { \ bp = SCM_PROGRAM_DATA (program); \ + ASSERT_ALIGNED_PROCEDURE (); \ if (SCM_I_IS_VECTOR (SCM_PROGRAM_OBJTABLE (program))) { \ objects = SCM_I_VECTOR_WELTS (SCM_PROGRAM_OBJTABLE (program)); \ object_count = SCM_I_VECTOR_LENGTH (SCM_PROGRAM_OBJTABLE (program)); \ diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index c2c674d27..b2cdca5be 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -283,7 +283,7 @@ VM_DEFINE_INSTRUCTION (26, long_local_ref, "long-local-ref", 2, 0, 1) unsigned int i = FETCH (); i <<= 8; i += FETCH (); - PUSH (LOCAL_REF (i)) + PUSH (LOCAL_REF (i)); ASSERT_BOUND (*sp); NEXT; } diff --git a/libguile/vm.c b/libguile/vm.c index 41eacd79f..527598b86 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -220,44 +220,33 @@ static SCM sym_vm_run; static SCM sym_vm_error; static SCM sym_debug; -static SCM make_u8vector (const scm_t_uint8 *bytes, size_t len) -{ - scm_t_uint8 *new_bytes = scm_gc_malloc (len, "make-u8vector"); - memcpy (new_bytes, bytes, len); - return scm_take_u8vector (new_bytes, len); -} - -/* Dummy structure to guarantee 32-bit alignment. */ -struct t_32bit_aligned -{ - scm_t_int32 dummy; - scm_t_uint8 bytes[18]; -}; - static SCM really_make_boot_program (long nargs) { SCM u8vec; - struct t_32bit_aligned bytes = - { - .dummy = 0, - .bytes = { 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - scm_op_mv_call, 0, 0, 1, - scm_op_make_int8_1, scm_op_halt } - }; - + /* Make sure "bytes" is 64-bit aligned. */ + scm_t_uint8 text[] = { scm_op_mv_call, 0, 0, 1, + scm_op_make_int8_1, + scm_op_halt }; + struct scm_objcode *bp; SCM ret; - /* Set length in current endianness, no meta. */ - ((scm_t_uint32 *) bytes.bytes)[1] = 6; - if (SCM_UNLIKELY (nargs > 255 || nargs < 0)) abort (); - bytes.bytes[13] = (scm_byte_t) nargs; - - u8vec = make_u8vector (bytes.bytes, sizeof (bytes.bytes)); + text[1] = (scm_t_uint8)nargs; + + bp = scm_gc_malloc (sizeof (struct scm_objcode) + sizeof (text), + "make-u8vector"); + memcpy (bp->base, text, sizeof (text)); + bp->nargs = 0; + bp->nrest = 0; + bp->nlocs = 0; + bp->len = sizeof(text); + bp->metalen = 0; + bp->unused = 0; + + u8vec = scm_take_u8vector ((scm_t_uint8*)bp, + sizeof (struct scm_objcode) + sizeof (text)); ret = scm_make_program (scm_bytecode_to_objcode (u8vec), SCM_BOOL_F, SCM_BOOL_F); SCM_SET_SMOB_FLAGS (ret, SCM_F_PROGRAM_IS_BOOT); |