From 6f78702819e355180a71de6902766cdecfa84755 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Fri, 30 Jan 2009 10:20:08 +0100 Subject: [PATCH] add new language between assembly and objcode: bytecode * module/language/bytecode/Makefile.am: * module/language/bytecode/spec.scm: Add another language to the stack, bytecode. Bytecode is the u8vector form of object code.. * configure.in: * module/language/Makefile.am: * module/language/assembly/Makefile.am: * test-suite/tests/asm-to-bytecode.test: * module/language/assembly/spec.scm: * module/language/assembly/compile-bytecode.scm: Update to include the new pass. --- configure.in | 1 + module/language/Makefile.am | 2 +- module/language/assembly/Makefile.am | 2 +- ...mpile-objcode.scm => compile-bytecode.scm} | 18 ++++----- module/language/assembly/spec.scm | 9 ++--- module/language/bytecode/Makefile.am | 3 ++ module/language/bytecode/spec.scm | 37 +++++++++++++++++++ test-suite/tests/asm-to-bytecode.test | 4 +- 8 files changed, 56 insertions(+), 20 deletions(-) rename module/language/assembly/{compile-objcode.scm => compile-bytecode.scm} (89%) create mode 100644 module/language/bytecode/Makefile.am create mode 100644 module/language/bytecode/spec.scm diff --git a/configure.in b/configure.in index 9af1090de..42e412db1 100644 --- a/configure.in +++ b/configure.in @@ -1559,6 +1559,7 @@ AC_CONFIG_FILES([ module/language/ghil/Makefile module/language/glil/Makefile module/language/assembly/Makefile + module/language/bytecode/Makefile module/language/objcode/Makefile module/language/value/Makefile module/ice-9/Makefile diff --git a/module/language/Makefile.am b/module/language/Makefile.am index 33943acc5..ebaeb98bc 100644 --- a/module/language/Makefile.am +++ b/module/language/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS=scheme ghil glil assembly objcode value +SUBDIRS=scheme ghil glil assembly bytecode objcode value SOURCES=ghil.scm glil.scm assembly.scm modpath = language include $(top_srcdir)/am/guilec diff --git a/module/language/assembly/Makefile.am b/module/language/assembly/Makefile.am index ed3c1604d..16cf27ec1 100644 --- a/module/language/assembly/Makefile.am +++ b/module/language/assembly/Makefile.am @@ -1,3 +1,3 @@ -SOURCES = spec.scm compile-objcode.scm +SOURCES = spec.scm compile-bytecode.scm modpath = language/assembly include $(top_srcdir)/am/guilec diff --git a/module/language/assembly/compile-objcode.scm b/module/language/assembly/compile-bytecode.scm similarity index 89% rename from module/language/assembly/compile-objcode.scm rename to module/language/assembly/compile-bytecode.scm index 1f7ad4d66..e0d0af923 100644 --- a/module/language/assembly/compile-objcode.scm +++ b/module/language/assembly/compile-bytecode.scm @@ -19,18 +19,16 @@ ;;; Code: -(define-module (language assembly compile-objcode) +(define-module (language assembly compile-bytecode) #:use-module (system base pmatch) #:use-module (system vm instruction) - #:use-module (system vm objcode) - #:use-module (language objcode) #:use-module (srfi srfi-4) #:use-module ((srfi srfi-1) #:select (fold)) - #:export (compile-objcode fill-objcode)) + #:export (compile-bytecode write-bytecode)) (define *program-header-len* 8) -(define (compile-objcode assembly env . opts) +(define (compile-bytecode assembly env . opts) (pmatch assembly ((load-program ,nargs ,nrest ,nlocs ,nexts ,labels ,len . ,code) (letrec ((v (make-u8vector (+ *program-header-len* len))) @@ -40,13 +38,13 @@ (if (>= i 0) (u8vector-set! v i b)) (set! i (1+ i)))) (get-addr (lambda () i))) - (fill-objcode assembly write-byte get-addr '()) + (write-bytecode assembly write-byte get-addr '()) (if (not (= i (u8vector-length v))) - (error "incorrect length in assembly" i len) - (bytecode->objcode v)))) + (error "incorrect length in assembly" i len)) + (values v env))) (else (error "bad assembly" assembly)))) -(define (fill-objcode asm write-byte get-addr labels) +(define (write-bytecode asm write-byte get-addr labels) (define (write-char c) (write-byte (char->integer c))) (define (write-string s) @@ -94,7 +92,7 @@ (write (lambda (x) (set! i (1+ i)) (write-byte x))) (get-addr (lambda () i))) (for-each (lambda (asm) - (fill-objcode asm write get-addr labels)) + (write-bytecode asm write get-addr labels)) code))) ((load-integer ,str) (write-loader str)) ((load-number ,str) (write-loader str)) diff --git a/module/language/assembly/spec.scm b/module/language/assembly/spec.scm index fae551034..c7f1a14bd 100644 --- a/module/language/assembly/spec.scm +++ b/module/language/assembly/spec.scm @@ -21,18 +21,15 @@ (define-module (language assembly spec) #:use-module (system base language) - #:use-module (language objcode spec) - #:use-module (language assembly compile-objcode) + #:use-module (language bytecode spec) + #:use-module (language assembly compile-bytecode) #:export (assembly)) -(define (compile x e opts) - (values (compile-objcode x e) e)) - (define-language assembly #:title "Guile Virtual Machine Assembly Language" #:version "2.0" #:reader read #:printer write #:parser read ;; fixme: make a verifier? - #:compilers `((,objcode . ,compile)) + #:compilers `((,bytecode . ,compile-bytecode)) ) diff --git a/module/language/bytecode/Makefile.am b/module/language/bytecode/Makefile.am new file mode 100644 index 000000000..d0ee6a656 --- /dev/null +++ b/module/language/bytecode/Makefile.am @@ -0,0 +1,3 @@ +SOURCES = spec.scm +modpath = language/bytecode +include $(top_srcdir)/am/guilec diff --git a/module/language/bytecode/spec.scm b/module/language/bytecode/spec.scm new file mode 100644 index 000000000..0fc38965b --- /dev/null +++ b/module/language/bytecode/spec.scm @@ -0,0 +1,37 @@ +;;; Guile Lowlevel Intermediate Language + +;; Copyright (C) 2001 Free Software Foundation, Inc. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(define-module (language bytecode spec) + #:use-module (system base language) + #:use-module (language objcode spec) + #:use-module (system vm objcode) + #:export (bytecode)) + +(define (compile-objcode x e opts) + (values (bytecode->objcode x) e)) + +(define-language bytecode + #:title "Guile Bytecode Vectors" + #:version "0.3" + #:reader read + #:printer write + #:compilers `((,objcode . ,compile-objcode)) + ) diff --git a/test-suite/tests/asm-to-bytecode.test b/test-suite/tests/asm-to-bytecode.test index 7be935dd9..daad0b339 100644 --- a/test-suite/tests/asm-to-bytecode.test +++ b/test-suite/tests/asm-to-bytecode.test @@ -17,7 +17,7 @@ (define-module (test-suite tests asm-to-bytecode) #:use-module (test-suite lib) #:use-module (system vm instruction) - #:use-module (language assembly compile-objcode)) + #:use-module (language assembly compile-bytecode)) (define (munge-bytecode v) (let ((newv (make-u8vector (vector-length v)))) @@ -39,7 +39,7 @@ (define (get-addr) i) (run-test `(length ,x) #t (lambda () - (fill-objcode x write-byte get-addr '()) + (write-bytecode x write-byte get-addr '()) (= i len))) (run-test `(compile-equal? ,x ,y) #t (lambda ()