;;; Guile Low 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 glil) #:use-module (system base syntax) #:use-module (system base pmatch) #:use-module ((srfi srfi-1) #:select (fold)) #:export ( make-glil-program glil-program? glil-program-nargs glil-program-nrest glil-program-nlocs glil-program-nexts glil-program-meta glil-program-body glil-program-closure-level make-glil-bind glil-bind? glil-bind-vars make-glil-mv-bind glil-mv-bind? glil-mv-bind-vars glil-mv-bind-rest make-glil-unbind glil-unbind? make-glil-source glil-source? glil-source-props make-glil-void glil-void? make-glil-const glil-const? glil-const-obj make-glil-argument glil-argument? glil-argument-op glil-argument-index make-glil-local glil-local? glil-local-op glil-local-index make-glil-external glil-external? glil-external-op glil-external-depth glil-external-index make-glil-toplevel glil-toplevel? glil-toplevel-op glil-toplevel-name make-glil-module glil-module? glil-module-op glil-module-mod glil-module-name glil-module-public? make-glil-label glil-label? glil-label-label make-glil-branch glil-branch? glil-branch-inst glil-branch-label make-glil-call glil-call? glil-call-inst glil-call-nargs make-glil-mv-call glil-mv-call? glil-mv-call-nargs glil-mv-call-ra parse-glil unparse-glil)) (define (print-glil x port) (format port "#" (unparse-glil x))) (define-type ( #:printer print-glil) ;; Meta operations ( nargs nrest nlocs nexts meta body (closure-level #f)) ( vars) ( vars rest) () ( props) ;; Objects () ( obj) ;; Variables ( op index) ( op index) ( op depth index) ( op name) ( op mod name public?) ;; Controls ( label) ( inst label) ( inst nargs) ( nargs ra)) (define (compute-closure-level body) (fold (lambda (x ret) (record-case x (( closure-level) (max ret closure-level)) (( depth) (max ret depth)) (else ret))) 0 body)) (define %make-glil-program make-glil-program) (define (make-glil-program . args) (let ((prog (apply %make-glil-program args))) (if (not (glil-program-closure-level prog)) (set! (glil-program-closure-level prog) (compute-closure-level (glil-program-body prog)))) prog)) (define (parse-glil x) (pmatch x ((program ,nargs ,nrest ,nlocs ,nexts ,meta . ,body) (make-glil-program nargs nrest nlocs nexts meta (map parse-glil body))) ((bind . ,vars) (make-glil-bind vars)) ((mv-bind ,vars ,rest) (make-glil-mv-bind vars rest)) ((unbind) (make-glil-unbind)) ((source ,props) (make-glil-source props)) ((void) (make-glil-void)) ((const ,obj) (make-glil-const obj)) ((argument ,op ,index) (make-glil-argument op index)) ((local ,op ,index) (make-glil-local op index)) ((external ,op ,depth ,index) (make-glil-external op depth index)) ((toplevel ,op ,name) (make-glil-toplevel op name)) ((module public ,op ,mod ,name) (make-glil-module op mod name #t)) ((module private ,op ,mod ,name) (make-glil-module op mod name #f)) ((label ,label) (make-label ,label)) ((branch ,inst ,label) (make-glil-branch inst label)) ((call ,inst ,nargs) (make-glil-call inst nargs)) ((mv-call ,nargs ,ra) (make-glil-mv-call nargs ra)) (else (error "invalid glil" x)))) (define (unparse-glil glil) (record-case glil ;; meta (( nargs nrest nlocs nexts meta body) `(program ,nargs ,nrest ,nlocs ,nexts ,meta ,@(map unparse-glil body))) (( vars) `(bind ,@vars)) (( vars rest) `(mv-bind ,vars ,rest)) (() `(unbind)) (( props) `(source ,props)) ;; constants (() `(void)) (( obj) `(const ,obj)) ;; variables (( op index) `(argument ,op ,index)) (( op index) `(local ,op ,index)) (( op depth index) `(external ,op ,depth ,index)) (( op name) `(toplevel ,op ,name)) (( op mod name public?) `(module ,(if public? 'public 'private) ,op ,mod ,name)) ;; controls (( label) `(label ,label)) (( inst label) `(branch ,inst ,label)) (( inst nargs) `(call ,inst ,nargs)) (( nargs ra) `(mv-call ,nargs ,ra))))