guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] GNU Guile branch, master, updated. release_1-9-1-16-ge5d


From: Andy Wingo
Subject: [Guile-commits] GNU Guile branch, master, updated. release_1-9-1-16-ge5dc27b
Date: Sun, 26 Jul 2009 12:44:28 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Guile".

http://git.savannah.gnu.org/cgit/guile.git/commit/?id=e5dc27b86d0eaa470f92cdaa9f4ed2a961338c49

The branch, master has been updated
       via  e5dc27b86d0eaa470f92cdaa9f4ed2a961338c49 (commit)
       via  28b119ee3da0f4b14cb87e638794d22843778cda (commit)
       via  9efc2d1404aa7705f38aa1ceaebf4c4893e68b83 (commit)
       via  9557ecc6620c83a9254649e63248ce997d749cde (commit)
       via  cb8ab66c6657a61797399e5f63c7942ae7cd20e3 (commit)
      from  74deff3c431245b282903d46eb7e571ace8759f3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit e5dc27b86d0eaa470f92cdaa9f4ed2a961338c49
Author: Andy Wingo <address@hidden>
Date:   Sun Jul 26 14:01:56 2009 +0200

    increase range of relative jumps by aligning blocks to 8-byte boundaries
    
    * libguile/objcodes.c (OBJCODE_COOKIE): Bump again, as our jump offsets
      are now multiplied by 8.
    
    * libguile/vm-i-system.c (BR): Interpret the 16-bit offset as a relative
      jump to the nearest 8-byte-aligned block -- increasing relative jump
      range from +/-32K to +/-240K.
      (mvra): Do the same for the mvra jump.
    
    * libguile/vm.c (really_make_boot_program): Align the mvra.
    
    * module/language/assembly.scm (align-block): New export, for aligning
      blocks.
    
    * module/language/assembly/compile-bytecode.scm (write-bytecode): Emit
      jumps to the nearest 8-byte-aligned block. Effectively our range is 18
      bits in either direction. I would like to do this differently -- have
      long-br and long-br-if, and all the other br instructions go to 8 bits
      only. But the assembler doesn't have an appropriate representation to
      allow me to do this yet, so for now this is what we have.
    
    * module/language/assembly/decompile-bytecode.scm (decode-load-program):
      Decode the 19-bit jumps.

commit 28b119ee3da0f4b14cb87e638794d22843778cda
Author: Andy Wingo <address@hidden>
Date:   Sun Jul 26 12:56:11 2009 +0200

    make sure all programs are 8-byte aligned
    
    * libguile/objcodes.c (OBJCODE_COOKIE): Bump objcode cookie, as we added
      to struct scm_objcode.
    * libguile/objcodes.h (struct scm_objcode): Add a uint32 after metalen
      and before base, so that if the structure has 8-byte alignment, base
      will have 8-byte alignment too. (Before, base was 12 bytes from the
      start of the structure, now it's 16 bytes.)
    
    * libguile/vm-engine.h (ASSERT_ALIGNED_PROCEDURE): Add a check that can
      be turned on with VM_ENABLE_PARANOID_ASSERTIONS.
      (CACHE_PROGRAM): Call ASSERT_ALIGNED_PROCEDURE.
    
    * libguile/vm-i-system.c (long-local-ref): Add a missing semicolon.
    
    * libguile/vm.c (really_make_boot_program): Rework to operate directly
      on a malloc'd buffer, so that the program will be 8-byte aligned.
    
    * module/language/assembly.scm (*program-header-len*): Add another 4 for
      the padding.
      (object->assembly): Fix case in which we would return (make-int8 0)
      instead of (make-int8:0). This would throw off compile-assembly.scm's
      use of addr+.
    
    * module/language/assembly/compile-bytecode.scm (write-bytecode): Write
      out the padding int.
    
    * module/language/assembly/decompile-bytecode.scm (decode-load-program):
      And pop off the padding int too.
    
    * module/language/glil/compile-assembly.scm (glil->assembly): Don't pack
      the assembly, assume that assembly.scm has done it for us. If a
      program has a meta, pad out the program so that meta will be aligned.
    
    * test-suite/tests/asm-to-bytecode.test: Adapt to expect programs to
      have the extra 4-byte padding int.

commit 9efc2d1404aa7705f38aa1ceaebf4c4893e68b83
Author: Andy Wingo <address@hidden>
Date:   Sun Jul 26 11:54:05 2009 +0200

    fix alignment of subprograms of subprograms
    
    * module/language/glil/compile-assembly.scm (glil->assembly)
      (dump-object): Fix an exciting bug! Subprograms of subprograms were
      not being aligned correctly, because the code was generated too early.
      So instead delay dumping the object table until the proper time.

commit 9557ecc6620c83a9254649e63248ce997d749cde
Author: Andy Wingo <address@hidden>
Date:   Sun Jul 26 11:21:18 2009 +0200

    fix unused SCM_FRAME_SET_DYNAMIC_LINK macro
    
    * libguile/frames.h (SCM_FRAME_SET_DYNAMIC_LINK): Fix for new stack
      layout, though this macro is not used.

commit cb8ab66c6657a61797399e5f63c7942ae7cd20e3
Author: Andy Wingo <address@hidden>
Date:   Sun Jul 26 11:20:39 2009 +0200

    fix vmstack gdb macro for new stack frame layout
    
    * gdbinit (vmstack): No more external link.

-----------------------------------------------------------------------

Summary of changes:
 gdbinit                                         |    5 --
 libguile/frames.h                               |    2 +-
 libguile/objcodes.c                             |    2 +-
 libguile/objcodes.h                             |    1 +
 libguile/vm-engine.h                            |    4 ++
 libguile/vm-i-system.c                          |   22 ++++++-----
 libguile/vm.c                                   |   49 +++++++++--------------
 module/language/assembly.scm                    |   23 +++++++----
 module/language/assembly/compile-bytecode.scm   |   11 +++--
 module/language/assembly/decompile-bytecode.scm |    4 +-
 module/language/glil/compile-assembly.scm       |   43 ++++++++++++--------
 test-suite/tests/asm-to-bytecode.test           |   15 +++++--
 12 files changed, 100 insertions(+), 81 deletions(-)

diff --git a/gdbinit b/gdbinit
index 381cf84..b66e3e2 100644
--- a/gdbinit
+++ b/gdbinit
@@ -148,11 +148,6 @@ define nextframe
   output $vmdl
   newline
   set $vmsp=$vmsp-1
-  sputs "el:\t"
-  output $vmsp
-  sputs "\t"
-  gwrite *$vmsp
-  set $vmsp=$vmsp-1
   set $vmnlocs=(int)$vmbp->nlocs
   while $vmnlocs > 0
     sputs "loc #"
diff --git a/libguile/frames.h b/libguile/frames.h
index 1d8a30f..1b3153a 100644
--- a/libguile/frames.h
+++ b/libguile/frames.h
@@ -63,7 +63,7 @@
 #define SCM_FRAME_DYNAMIC_LINK(fp)                             \
   (SCM_FRAME_STACK_CAST (SCM_FRAME_DATA_ADDRESS (fp)[0]))
 #define SCM_FRAME_SET_DYNAMIC_LINK(fp, dl)             \
-  ((SCM_FRAME_DATA_ADDRESS (fp)[1])) = (SCM)(dl);
+  ((SCM_FRAME_DATA_ADDRESS (fp)[0])) = (SCM)(dl);
 #define SCM_FRAME_VARIABLE(fp,i)       fp[i]
 #define SCM_FRAME_PROGRAM(fp)          fp[-1]
 
diff --git a/libguile/objcodes.c b/libguile/objcodes.c
index 5a43edb..91691a7 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.9-" 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 d50f6dc..2bb4e60 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 15ebb53..c0f772f 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 c2c674d..726112c 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;
 }
@@ -426,7 +426,7 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set, 
"long-toplevel-set", 2, 1, 0)
  * branch and jump
  */
 
-/* offset must be a signed short!!! */
+/* offset must be a signed 16 bit int!!! */
 #define FETCH_OFFSET(offset)                    \
 {                                              \
   int h = FETCH ();                            \
@@ -436,10 +436,10 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set, 
"long-toplevel-set", 2, 1, 0)
 
 #define BR(p)                                  \
 {                                              \
-  signed short offset;                          \
+  scm_t_int16 offset;                           \
   FETCH_OFFSET (offset);                        \
   if (p)                                       \
-    ip += offset;                              \
+    ip += ((scm_t_ptrdiff)offset) * 8 - (((unsigned long)ip) % 8);      \
   NULLSTACK (1);                               \
   DROP ();                                     \
   NEXT;                                                \
@@ -447,9 +447,9 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set, 
"long-toplevel-set", 2, 1, 0)
 
 VM_DEFINE_INSTRUCTION (35, br, "br", 2, 0, 0)
 {
-  int h = FETCH ();
-  int l = FETCH ();
-  ip += (signed short) (h << 8) + l;
+  scm_t_int16 offset;
+  FETCH_OFFSET (offset);
+  ip += ((scm_t_ptrdiff)offset) * 8 - (((unsigned long)ip) % 8);
   NEXT;
 }
 
@@ -812,10 +812,12 @@ VM_DEFINE_INSTRUCTION (46, call_nargs, "call/nargs", 0, 
0, 1)
 VM_DEFINE_INSTRUCTION (47, mv_call, "mv-call", 3, -1, 1)
 {
   SCM x;
-  signed short offset;
+  scm_t_int16 offset;
+  scm_t_uint8 *mvra;
   
   nargs = FETCH ();
   FETCH_OFFSET (offset);
+  mvra = ip + ((scm_t_ptrdiff)offset) * 8 - ((unsigned long)ip) % 8;
 
   x = sp[-nargs];
 
@@ -828,7 +830,7 @@ VM_DEFINE_INSTRUCTION (47, mv_call, "mv-call", 3, -1, 1)
       CACHE_PROGRAM ();
       INIT_ARGS ();
       NEW_FRAME ();
-      SCM_FRAME_DATA_ADDRESS (fp)[1] = (SCM)(SCM_FRAME_RETURN_ADDRESS (fp) + 
offset);
+      SCM_FRAME_DATA_ADDRESS (fp)[1] = (SCM)mvra;
       ENTER_HOOK ();
       APPLY_HOOK ();
       NEXT;
@@ -853,7 +855,7 @@ VM_DEFINE_INSTRUCTION (47, mv_call, "mv-call", 3, -1, 1)
           len = scm_length (values);
           PUSH_LIST (values, SCM_NULLP);
           PUSH (len);
-          ip += offset;
+          ip = mvra;
         }
       NEXT;
     }
diff --git a/libguile/vm.c b/libguile/vm.c
index 41eacd7..cc5e4f9 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_nop, scm_op_nop, 
scm_op_nop,
+                         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);
diff --git a/module/language/assembly.scm b/module/language/assembly.scm
index 0ad94be..e7308ac 100644
--- a/module/language/assembly.scm
+++ b/module/language/assembly.scm
@@ -24,12 +24,12 @@
   #:use-module (system vm instruction)
   #:use-module ((srfi srfi-1) #:select (fold))
   #:export (byte-length
-            addr+ align-program align-code
+            addr+ align-program align-code align-block
             assembly-pack assembly-unpack
             object->assembly assembly->object))
 
-;; nargs, nrest, nlocs, <unused>, len, metalen
-(define *program-header-len* (+ 1 1 1 1 4 4))
+;; nargs, nrest, nlocs, len, metalen, padding
+(define *program-header-len* (+ 1 1 2 4 4 4))
 
 ;; lengths are encoded in 3 bytes
 (define *len-len* 3)
@@ -63,17 +63,24 @@
 
 (define *program-alignment* 8)
 
+(define *block-alignment* 8)
+
 (define (addr+ addr code)
   (fold (lambda (x len) (+ (byte-length x) len))
         addr
         code))
 
+(define (code-alignment addr alignment header-len)
+  (make-list (modulo (- alignment
+                        (modulo (+ addr header-len) alignment))
+                     alignment)
+             '(nop)))
+
+(define (align-block addr)
+  (code-alignment addr *block-alignment* 0))
 
 (define (align-code code addr alignment header-len)
-  `(,@(make-list (modulo (- alignment
-                            (modulo (+ addr header-len) alignment))
-                         alignment)
-                 '(nop))
+  `(,@(code-alignment addr alignment header-len)
     ,code))
 
 (define (align-program prog addr)
@@ -109,7 +116,7 @@
        ((null? x) `(make-eol))
        ((and (integer? x) (exact? x))
         (cond ((and (<= -128 x) (< x 128))
-               `(make-int8 ,(modulo x 256)))
+               (assembly-pack `(make-int8 ,(modulo x 256))))
               ((and (<= -32768 x) (< x 32768))
                (let ((n (if (< x 0) (+ x 65536) x)))
                  `(make-int16 ,(quotient n 256) ,(modulo n 256))))
diff --git a/module/language/assembly/compile-bytecode.scm 
b/module/language/assembly/compile-bytecode.scm
index 80dee83..bf6c5f7 100644
--- a/module/language/assembly/compile-bytecode.scm
+++ b/module/language/assembly/compile-bytecode.scm
@@ -77,10 +77,12 @@
     ;; Ew!
     (for-each write-byte (bytevector->u8-list bv)))
   (define (write-break label)
-    (let ((offset (- (assq-ref labels label) (+ (get-addr) 2))))
-      (cond ((>= offset (ash 1 15)) (error "jump too big" offset))
-            ((< offset (- (ash 1 15))) (error "reverse jump too big" offset))
-            (else (write-uint16-be offset)))))
+    (let ((offset (- (assq-ref labels label)
+                     (logand (+ (get-addr) 2) (lognot #x7)))))
+      (cond ((not (= 0 (modulo offset 8))) (error "unaligned jump" offset))
+            ((>= offset (ash 1 18)) (error "jump too far forward" offset))
+            ((< offset (- (ash 1 18))) (error "jump too far backwards" offset))
+            (else (write-uint16-be (ash offset -3))))))
   
   (let ((inst (car asm))
         (args (cdr asm))
@@ -102,6 +104,7 @@
          (write-uint16 nlocs)
          (write-uint32 length)
          (write-uint32 (if meta (1- (byte-length meta)) 0))
+         (write-uint32 0) ; padding
          (letrec ((i 0)
                   (write (lambda (x) (set! i (1+ i)) (write-byte x)))
                   (get-addr (lambda () i)))
diff --git a/module/language/assembly/decompile-bytecode.scm 
b/module/language/assembly/decompile-bytecode.scm
index 231205d..0e34ab4 100644
--- a/module/language/assembly/decompile-bytecode.scm
+++ b/module/language/assembly/decompile-bytecode.scm
@@ -57,10 +57,12 @@
          (len (+ a (ash b 8) (ash c 16) (ash d 24)))
          (metalen (+ e (ash f 8) (ash g 16) (ash h 24)))
          (totlen (+ len metalen))
+         (pad0 (pop)) (pad1 (pop)) (pad2 (pop)) (pad3 (pop))
          (labels '())
          (i 0))
     (define (ensure-label rel1 rel2)
-      (let ((where (+ i (bytes->s16 rel1 rel2))))
+      (let ((where (+ (logand i (lognot #x7))
+                      (* (bytes->s16 rel1 rel2) 8))))
         (or (assv-ref labels where)
             (begin
               (let ((l (gensym ":L")))
diff --git a/module/language/glil/compile-assembly.scm 
b/module/language/glil/compile-assembly.scm
index 9a5cae0..fa58057 100644
--- a/module/language/glil/compile-assembly.scm
+++ b/module/language/glil/compile-assembly.scm
@@ -137,9 +137,9 @@
 (define (glil->assembly glil toplevel? bindings
                         source-alist label-alist object-alist addr)
   (define (emit-code x)
-    (values (map assembly-pack x) bindings source-alist label-alist 
object-alist))
+    (values x bindings source-alist label-alist object-alist))
   (define (emit-code/object x object-alist)
-    (values (map assembly-pack x) bindings source-alist label-alist 
object-alist))
+    (values x bindings source-alist label-alist object-alist))
 
   (record-case glil
     ((<glil-program> nargs nrest nlocs meta body)
@@ -164,10 +164,15 @@
 
      (receive (code bindings sources labels objects len)
          (process-body)
-       (let ((prog `(load-program ,nargs ,nrest ,nlocs ,labels
-                                  ,len
-                                  ,(make-meta bindings sources meta)
-                                  . ,code)))
+       (let* ((meta (make-meta bindings sources meta))
+              (meta-pad (if meta (modulo (- 8 (modulo len 8)) 8) 0))
+              (prog `(load-program ,nargs ,nrest ,nlocs ,labels
+                                  ,(+ len meta-pad)
+                                  ,meta
+                                  ,@code
+                                  ,@(if meta
+                                        (make-list meta-pad '(nop))
+                                        '()))))
          (cond
           (toplevel?
            ;; toplevel bytecode isn't loaded by the vm, no way to do
@@ -175,7 +180,7 @@
            ;; anyway)
            (emit-code (align-program prog addr)))
           (else
-           (let ((table (dump-object (make-object-table objects) addr)))
+           (let ((table (make-object-table objects)))
              (cond
               (object-alist
                ;; if we are being compiled from something with an object
@@ -190,8 +195,10 @@
                                    object-alist)))
               (else
                ;; otherwise emit a load directly
-               (emit-code `(,@table ,@(align-program prog (addr+ addr 
table))))))))))))
-    
+               (let ((table-code (dump-object table addr)))
+                 (emit-code
+                  `(,@table-code
+                    ,@(align-program prog (addr+ addr table-code)))))))))))))
     
     ((<glil-bind> vars)
      (values '()
@@ -333,11 +340,12 @@
           (error "unknown module var kind" op key)))))
 
     ((<glil-label> label)
-     (values '()
-             bindings
-             source-alist
-             (acons label addr label-alist)
-             object-alist))
+     (let ((code (align-block addr)))
+       (values code
+               bindings
+               source-alist
+               (acons label (addr+ addr code) label-alist)
+               object-alist)))
 
     ((<glil-branch> inst label)
      (emit-code `((,inst ,label))))
@@ -370,9 +378,10 @@
    ((object->assembly x) => list)
    ((variable-cache-cell? x) (dump-object (variable-cache-cell-key x) addr))
    ((subprogram? x)
-    `(,@(subprogram-table x)
-      ,@(align-program (subprogram-prog x)
-                       (addr+ addr (subprogram-table x)))))
+    (let ((table-code (dump-object (subprogram-table x) addr)))
+      `(,@table-code
+        ,@(align-program (subprogram-prog x)
+                         (addr+ addr table-code)))))
    ((number? x)
     `((load-number ,(number->string x))))
    ((string? x)
diff --git a/test-suite/tests/asm-to-bytecode.test 
b/test-suite/tests/asm-to-bytecode.test
index fb598a6..33a2a45 100644
--- a/test-suite/tests/asm-to-bytecode.test
+++ b/test-suite/tests/asm-to-bytecode.test
@@ -95,22 +95,29 @@
                  3 2 (uint16 1) ;; nargs, nrest, nlocs
                  (uint32 3)     ;; len
                  (uint32 0)     ;; metalen
+                 (uint32 0)     ;; padding
                  make-int8 3
                  return))
 
-    (comp-test '(load-program 3 2 1 () 3
+    ;; the nops are to pad meta to an 8-byte alignment. not strictly
+    ;; necessary for this test, but representative of the common case.
+    (comp-test '(load-program 3 2 1 () 8
                               (load-program 3 2 1 () 3
                                             #f
                                             (make-int8 3) (return))
-                              (make-int8 3) (return))
+                              (make-int8 3) (return)
+                              (nop) (nop) (nop) (nop) (nop))
                #(load-program
                  3 2 (uint16 1) ;; nargs, nrest, nlocs
-                 (uint32 3)     ;; len
-                 (uint32 15)    ;; metalen
+                 (uint32 8)     ;; len
+                 (uint32 19)    ;; metalen
+                 (uint32 0)     ;; padding
                  make-int8 3
                  return
+                 nop nop nop nop nop
                  3 2 (uint16 1) ;; nargs, nrest, nlocs
                  (uint32 3)     ;; len
                  (uint32 0)     ;; metalen
+                 (uint32 0)     ;; padding
                  make-int8 3
                  return))))


hooks/post-receive
-- 
GNU Guile




reply via email to

[Prev in Thread] Current Thread [Next in Thread]