mescc: Use records for Guile: preparation.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 14 Jul 2017 18:42:26 +0000 (20:42 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 26 Jul 2017 09:36:08 +0000 (11:36 +0200)
* module/language/c99/info.mes: New file.
* module/mes/M1.mes: Use it.
* scripts/mescc.mes: Use it.
* module/language/c99/compiler.mes: Use it.  (<info>, <types>,
  <constants>, <functions>, <globals>, <locals>, <function>, <text>,
  <break>, <continue>, make, info?, .info, .types, .constants,
  .functions, .globals, .locals, .function, .text, .break, .continue):
  Remove.
* module/language/c99/info.scm: New file.
* module/language/c99/compiler.scm: Use it.
* guile/mescc.scm: Use it.
* module/mes/M1.scm: Use it.

guile/mescc.scm
make.scm
module/language/c99/compiler.mes
module/language/c99/compiler.scm
module/language/c99/info.mes [new file with mode: 0644]
module/language/c99/info.scm [new file with mode: 0644]
module/mes/M1.mes
module/mes/M1.scm
scripts/mescc.mes

index 357ec3f47e518bb3ef2df6b9a677df616cae0f0a..5981509dda76373d92976442f71e6ac9fde61d88 100755 (executable)
@@ -35,6 +35,7 @@ GUILE='~/src/guile-1.8/build/pre-inst-guile --debug -q' guile/mescc.scm
 !#
 
 (define-module (mescc)
+  #:use-module (language c99 info)
   #:use-module (language c99 compiler)
   #:use-module (mes elf)
   #:use-module (mes M1)
index df00bf190a7577b3bb3dcc3d583eff9a1f98ffe0..4e94f6361f7be2f383520b4645b4c06784013a3d 100755 (executable)
--- a/make.scm
+++ b/make.scm
@@ -14,6 +14,7 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
     "guix/records.scm"
     "guix/shell-utils.scm"
     "language/c99/compiler.scm"
+    "language/c99/info.scm"
     "mes/as-i386.scm"
     "mes/as.scm"
     "mes/bytevectors.scm"
@@ -371,6 +372,8 @@ exec ${GUILE-guile} --no-auto-compile -L . -L guile -C . -C guile -s "$0" ${1+"$
    ((install-dir #:dir (string-append %module-dir)) f))
  '("module/language/c99/compiler.mes"
    "module/language/c99/compiler.scm"
+   "module/language/c99/info.mes"
+   "module/language/c99/info.scm"
    "module/language/paren.mes"
    "module/mes/M1.mes"
    "module/mes/M1.scm"
index 4850b3107e9c7ba62ccdb0fd764b7a7dc176de24..0e667ff1b78b3f0fa0ecdf988ccf79a3f7685ae3 100644 (file)
@@ -29,6 +29,7 @@
  (guile-2)
  (guile)
  (mes
+  (mes-use-module (srfi srfi-1))
   (mes-use-module (srfi srfi-26))
   (mes-use-module (mes pmatch))
   (mes-use-module (nyacc lang c99 parser))
@@ -36,7 +37,8 @@
   (mes-use-module (mes as))
   (mes-use-module (mes as-i386))
   (mes-use-module (mes M1))
-  (mes-use-module (mes optargs))))
+  (mes-use-module (mes optargs))
+  (mes-use-module (language c99 info))))
 
 (define (logf port string . rest)
   (apply format (cons* port string rest))
     ((fctn-defn _ (ptr-declr (pointer (pointer)) (ftn-declr (ident ,name) _)) (compd-stmt (block-item-list . ,statements))) statements)
     (_ (error ".statements: unsupported: " o))))
 
-(define <info> '<info>)
-(define <types> '<types>)
-(define <constants> '<constants>)
-(define <functions> '<functions>)
-(define <globals> '<globals>)
-(define <locals> '<locals>)
-(define <function> '<function>)
-(define <text> '<text>)
-(define <break> '<break>)
-(define <continue> '<continue>)
-
-(define* (make o #:key (types '()) (constants '()) (functions '()) (globals '()) (locals '()) (function #f) (text '()) (break '()) (continue '()))
-  (pmatch o
-    (<info> (list <info>
-                  (cons <types> types)
-                  (cons <constants> constants)
-                  (cons <functions> functions)
-                  (cons <globals> globals)
-                  (cons <locals> locals)
-                  (cons <function> function)
-                  (cons <text> text)
-                  (cons <break> break)
-                  (cons <continue> continue)))))
-
-(define (.types o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <types>))))
-
-(define (.constants o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <constants>))))
-
-(define (.functions o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <functions>))))
-
-(define (.globals o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <globals>))))
-
-(define (.locals o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <locals>))))
-
-(define (.function o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <function>))))
-
-(define (.text o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <text>))))
-
-(define (.break o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <break>))))
-
-(define (.continue o)
-  (pmatch o
-    ((<info> . ,alist) (assq-ref alist <continue>))))
-
-(define (info? o)
-  (and (pair? o) (eq? (car o) <info>)))
-
 (define (clone o . rest)
   (cond ((info? o)
          (let ((types (.types o))
                           (continue continue))
                          (make <info> #:types types #:constants constants #:functions functions #:globals globals  #:locals locals #:function function #:text text #:break break #:continue continue))))))
 
+(define (append-text info text)
+  (clone info #:text (append (.text info) text)))
+
 (define (push-global globals)
   (lambda (o)
     (list (i386:push-label-mem `(#:address ,o)))))
            (info ((expr->base info) b)))
       (append-text info (wrap-as c)))))
 
-(define (append-text info text)
-  (clone info #:text (append (.text info) text)))
-
 (define (wrap-as o . annotation)
   `(,@annotation ,o))
 
index 49509b97a1167b7ac813c0fcebe58cbf1891c8b8..a6750dfe4b8af717604b794d529441d1e004d848 100644 (file)
   #:use-module (mes as-i386)
   #:use-module (mes elf)
   #:use-module (mes M1)
+  #:use-module (language c99 info)
   #:export (c99-ast->info
             c99-input->ast
             c99-input->elf
             c99-input->info
             c99-input->object
+            clone
             info->object))
 
 (cond-expand
diff --git a/module/language/c99/info.mes b/module/language/c99/info.mes
new file mode 100644 (file)
index 0000000..9c8354c
--- /dev/null
@@ -0,0 +1,96 @@
+;;; -*-scheme-*-
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; Mes 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; info.mes defines a record-interface to simplistic list data
+;;; structures.
+
+;;; Code:
+
+(cond-expand
+ (guile-2)
+ (guile)
+ (mes
+  (mes-use-module (mes optargs))
+  (mes-use-module (mes pmatch))))
+
+(define <info> '<info>)
+(define <types> '<types>)
+(define <constants> '<constants>)
+(define <functions> '<functions>)
+(define <globals> '<globals>)
+(define <locals> '<locals>)
+(define <function> '<function>)
+(define <text> '<text>)
+(define <break> '<break>)
+(define <continue> '<continue>)
+
+(define (.types o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <types>))))
+
+(define (.constants o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <constants>))))
+
+(define (.functions o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <functions>))))
+
+(define (.globals o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <globals>))))
+
+(define (.locals o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <locals>))))
+
+(define (.function o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <function>))))
+
+(define (.text o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <text>))))
+
+(define (.break o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <break>))))
+
+(define (.continue o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <continue>))))
+
+(define (info? o)
+  (and (pair? o) (eq? (car o) <info>)))
+
+(define* (make o #:key (types '()) (constants '()) (functions '()) (globals '()) (locals '()) (function #f) (text '()) (break '()) (continue '()))
+  (pmatch o
+    (<info> (list <info>
+                  (cons <types> types)
+                  (cons <constants> constants)
+                  (cons <functions> functions)
+                  (cons <globals> globals)
+                  (cons <locals> locals)
+                  (cons <function> function)
+                  (cons <text> text)
+                  (cons <break> break)
+                  (cons <continue> continue)))))
diff --git a/module/language/c99/info.scm b/module/language/c99/info.scm
new file mode 100644 (file)
index 0000000..c5bab0d
--- /dev/null
@@ -0,0 +1,122 @@
+;;; -*-scheme-*-
+
+;;; Mes --- Maxwell Equations of Software
+;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;
+;;; This file is part of Mes.
+;;;
+;;; Mes 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 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Mes 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; info.scm defines [Guile] record data types for compiler.mes
+
+;;; Code:
+
+(define-module (language c99 info)
+  #:use-module (ice-9 optargs)
+  #:use-module (system base pmatch)
+  #:export (<info>
+            ;; <types>
+            ;; <constants>
+            ;; <functions>
+            ;; <globals>
+            ;; <locals>
+            ;; <function>
+            ;; <text>
+            ;; <break>
+            ;; <continue>
+
+            make
+            info?
+
+            .info
+            .types
+            .constants
+            .functions
+            .globals
+            .locals
+            .function
+            .text
+            .break
+            .continue))
+
+(cond-expand
+ (guile-2)
+ (guile
+  (use-modules (ice-9 syncase)))
+ (mes))
+
+;;(include-from-path "language/c99/info.mes")
+
+(define <info> '<info>)
+(define <types> '<types>)
+(define <constants> '<constants>)
+(define <functions> '<functions>)
+(define <globals> '<globals>)
+(define <locals> '<locals>)
+(define <function> '<function>)
+(define <text> '<text>)
+(define <break> '<break>)
+(define <continue> '<continue>)
+
+(define* (make o #:key (types '()) (constants '()) (functions '()) (globals '()) (locals '()) (function #f) (text '()) (break '()) (continue '()))
+  (pmatch o
+    (<info> (list <info>
+                  (cons <types> types)
+                  (cons <constants> constants)
+                  (cons <functions> functions)
+                  (cons <globals> globals)
+                  (cons <locals> locals)
+                  (cons <function> function)
+                  (cons <text> text)
+                  (cons <break> break)
+                  (cons <continue> continue)))))
+
+(define (.types o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <types>))))
+
+(define (.constants o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <constants>))))
+
+(define (.functions o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <functions>))))
+
+(define (.globals o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <globals>))))
+
+(define (.locals o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <locals>))))
+
+(define (.function o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <function>))))
+
+(define (.text o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <text>))))
+
+(define (.break o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <break>))))
+
+(define (.continue o)
+  (pmatch o
+    ((<info> . ,alist) (assq-ref alist <continue>))))
+
+(define (info? o)
+  (and (pair? o) (eq? (car o) <info>)))
index 8ca27a63349496e0ecaf9fbf270112e0a3fac457..14e1c48b8b7736990699b1f9aa5c9fae11bd1613 100644 (file)
@@ -32,7 +32,8 @@
   (mes-use-module (mes as))
   (mes-use-module (mes elf))
   (mes-use-module (mes optargs))
-  (mes-use-module (mes pmatch))))
+  (mes-use-module (mes pmatch))
+  (mes-use-module (language c99 info))))
 
 (define (logf port string . rest)
   (apply format (cons* port string rest))
index 12a4c1531a65b32c7e9be367fa4dba6b585e90f6..43813e6b33b811015df3b4e88b0f1ce0a64bd640 100644 (file)
@@ -29,6 +29,7 @@
   #:use-module (mes guile)
   #:use-module (mes as)
   #:use-module (mes elf)
+  #:use-module (language c99 info)
   #:export (object->M1
             objects->M1
             object->elf
index cd5403d9e8bea9e647ed9f680da6e7e60c2a09d4..16df53390b96c731d484dd5db6ba6eca4a3c6c8a 100755 (executable)
@@ -40,6 +40,7 @@ exit $r
 (mes-use-module (mes guile))
 (mes-use-module (mes getopt-long))
 (mes-use-module (mes pretty-print))
+(mes-use-module (language c99 info))
 (mes-use-module (language c99 compiler))
 (mes-use-module (mes elf))
 (mes-use-module (mes M1))