mescc: Nicer functions/parameters.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 2 Jan 2017 06:41:56 +0000 (07:41 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 2 Jan 2017 06:41:56 +0000 (07:41 +0100)
* module/mes/libc-i386.mes (eputs, exit, puts): Save stack pointer,
  fill parameter registers from stack.
* module/language/c99/compiler.mes (formal->text): Fill parameter
  registers from stack memory.
  (formals->text): Save stack pointer.

module/language/c99/compiler.mes
module/mes/libc-i386.mes

index 5458356c7074a83c72c0f4e9279e0d35826ffb7d..62963605eee1e56e595e726ead87577b868f1616 100644 (file)
@@ -1,7 +1,7 @@
 ;;; -*-scheme-*-
 
 ;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of Mes.
 ;;;
   (mes-use-module (mes elf))
   (mes-use-module (mes libc-i386))))
 
-;;(define (gnuc-xdef? name mode) (if (equal? name "__GNUC__") #f (env? mode 'code)))
+(define (gnuc-xdef? name mode) (if (equal? name "__GNUC__") #f (eq? mode 'code)))
 ;;(define (gnuc-xdef? name mode) (equal? name "__GNUC__"))
-(define (gnuc-xdef? name mode)
-  (cond ((equal? name "__GNUC__") #t)
-        ((equal? name "asm") #f)))
+;; (define (gnuc-xdef? name mode)
+;;   (cond ((equal? name "__GNUC__") #t)
+;;         ((equal? name "asm") #f)))
 
 (define (mescc)
   (parse-c99 #:inc-dirs (string-split (getenv "C_INCLUDE_PATH") #\:)
-             #:cpp-defs '(("__GNUC__" . "0"))
-             #:xdef? gnuc-xdef?))
+             #:cpp-defs '(("__GNUC__" . "0") ("__NYACC__" . "1"))
+             #:xdef? gnuc-xdef?
+             #:mode 'code
+             ))
 
 (define (write-any x)
   (write-char (if (char? x) x (integer->char (if (>= x 0) x (+ x 256))))))
 
 (define (.name o)
   (pmatch o
-    ((fctn-defn _ (ftn-declr (ident ,name) _) _) name)))
+    ((fctn-defn _ (ftn-declr (ident ,name) _) _) name)
+    ((fctn-defn _ (ptr-declr (pointer) (ftn-declr (ident ,name) _)) _) name)))
 
 (define (.statements o)
   (pmatch o
-    ((fctn-defn _ (ftn-declr (ident ,name) _) (compd-stmt (block-item-list . ,statements))) statements)))
+    ((fctn-defn _ (ftn-declr (ident ,name) _) (compd-stmt (block-item-list . ,statements))) statements)
+    ((fctn-defn _ (ptr-declr (pointer) (ftn-declr (ident ,name) _)) (compd-stmt (block-item-list . ,statements))) statements)))
 
 (define (expr->arg symbols) ;; FIXME: get Mes curried-definitions
   (lambda (o)
         
         ((return (p-expr (fixed ,value)))
          (let ((value (string->number value)))
-           (make-text+symbols (append text (list (lambda _ (i386:ret)))) symbols)))
+           (make-text+symbols (append text (list (lambda _ (i386:ret value)))) symbols)))
 
        (_
         (format (current-error-port) "SKIPPING S=~a\n" o)
 (define (.formals o)
   (pmatch o
     ((fctn-defn _ (ftn-declr _ ,formals) _) formals)
+    ((fctn-defn _ (ptr-declr (pointer) (ftn-declr _ ,formals)) _) formals)
     (_ (format (current-error-port) ".formals: no match: ~a\n" o)
        barf)))
 
-(define (formal->text o)
-  '(#x58))  ;; pop %eax
+(define (formal->text n)
+  (lambda (o i)
+    (case i
+      ((0) (list #x8b #x5d (* n 4)))          ; mov    $00(%ebp),%ebx
+      ((1) (list #x8b #x4d (* (- n 1) 4)))    ; mov    $00(%ebp),%ecx
+      ((2) (list #x8b #x55 (* (- n 2) 4)))    ; mov    $00(%ebp),%edx
+      ((3) (list #x8b #x45 (* (- n 3) 4)))))) ; mov    $00(%ebp),%eax FIXME
 
 (define (formals->text o)
   (pmatch o
     ((param-list . ,formals)
-     (list (lambda (s t d)
-             (append
-              '(#x5f) ;; pop %edi
-              (append-map formal->text formals)
-              '(#x57) ;; push %edi
-              ))))
+     (let ((n (length formals)))
+       (list (lambda (s t d)
+              (append
+               '(#x55                   ; push   %ebp
+                 #x89 #xe5)             ; mov    %esp,%ebp
+               (append-map (formal->text n) formals (iota n))
+               '(#x83 #xec #x10)        ; sub    $0x10,%esp -- 4 local vars
+               )))))
     (_ (format (current-error-port) "formals->text+data: no match: ~a\n" o)
        barf)))
 
index cb3f46a97541dcc9262cbe6604af91a235fe6d30..dbc04469e9ce5f8a89f6161491d2d40b118cc299 100644 (file)
@@ -1,7 +1,7 @@
 ;;; -*-scheme-*-
 
 ;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of Mes.
 ;;;
 (define (push-arg o)
   `(#x68 ,@(int->bv32 o)))              ; push o
 
-(define (i386:ret)
-  '(
-    #xc3                                ; ret
+(define (i386:ret . rest)
+  `(
+    ,@(if (null? rest) '()
+          `(#xb8                        ; mov    $00,%eax
+            ,@(int->bv32 (car rest))))
+    #xc9                                        ; leave
+    #xc3                               ; ret
     ))
 
+;; #x83 #xec #x10                      ; sub    $0x10,%esp
+
+;; #x8b #x45 #x04                      ; mov    0x4(%ebp),%eax
+
+;; #x8b #x5d #x04                      ; mov    0x4(%ebp),%ebx
+;; #x8b #x45 #x08                      ; mov    0x8(%ebp),%eax
+
+;; #x8b #x4d #x04                      ; mov    0xc(%ebp),%ecx
+;; #x8b #x5d #x08                      ; mov    0x4(%ebp),%ebx
+;; #x8b #x45 #x0c                      ; mov    0x8(%ebp),%eax
+
+;; #x8b #x55 #xfc                     ; mov    0x4(%ebp),%edx
+
+
+
+;; #x8b #x5d #x08                      ; mov    $0x8(%ebp),%ebx
+
+;; #x8b #x4d #x08                      ; mov    $0x8(%ebp),%ecx
+;; #x8b #x5d #x0c                      ; mov    $0xc(%ebp),%ebx
+
+;; #x8b #x55 #x08                     ; mov    $0x8(%ebp),%edx
+;; #x8b #x4d #x0c                      ; mov    $0xc(%ebp),%ecx
+;; #x8b #x5d #x10                      ; mov    $0x10(%ebp),%ebx
+
+
 (define (i386:call address . arguments)
-  (let ((pushes (append-map push-arg arguments)))
+  (let* ((pushes (append-map push-arg arguments))
+         (s (length pushes))
+         (n (length arguments)))
    `(
-     ,@pushes                                         ; push args
-     #xe8 ,@(int->bv32 (- address 5 (length pushes))) ; call relative
+     ,@pushes                           ; push args
+     #xe8 ,@(int->bv32 (- address 5 s)) ; call relative
+     #x83 #xc4 ,(* n 4)                 ; add    $00,%esp
      )))
   
 (define (i386:eputs s t d)
   `(
-    #x5f                                ; pop    %edi
-    #xba #x01 #x00 #x00 #x00           ; mov    0xa,%edx
-    #x59                                ; pop    %ecx
-    #x57                                ; push   %edi
+    #x55                                ; push   %ebp
+    #x89 #xe5                           ; mov    %esp,%ebp
+
+    ;;;#x59                                ; pop    %ecx
+
+    #x8b #x4d #x08                      ; mov    $0x8(%ebp),%ecx
+    ;;#x8b #x5d #x0c                      ; mov    $0xc(%ebp),%ebx
+
+    #xba #x01 #x00 #x00 #x00           ; mov    $0x1,%edx
+
+
     #xbb #x02 #x00 #x00 #x00            ; mov    $0x1,%ebx
     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
     #xcd #x80                           ; int    $0x80
+
+    #xc9                                ; leave
     #xc3                                ; ret
     ))
 
 (define (i386:exit s t d)
   `(
-    #x5f                                ; pop    %edi
+    #x5b                                ; pop    %ebx
+    #x5b                                ; pop    %ebx
+    ;; FIXME: hack to get return value 41
+    ;; without local variable support in _start
+    #x89 #xc3                           ; mov    %eax,%ebx
     #xb8 #x01 #x00 #x00 #x00            ; mov    $0x1,%eax
     #xcd #x80                           ; int    $0x80
     ))
 
 (define (i386:puts s t d)
   `(
-    #x5f                                ; pop    %edi
-    #xba #x0a #x00 #x00 #x00           ; mov    0xa,%edx
-    #x59                                ; pop    %ecx
-    #x57                                ; push   %edi
+    #x55                                ; push   %ebp
+    #x89 #xe5                           ; mov    %esp,%ebp
+
+    #x8b #x4d #x08                      ; mov    $0x8(%ebp),%ecx
+    ;; #x8b #x5d #x0c                      ; mov    $0xc(%ebp),%ebx
+
+    #xba #x0a #x00 #x00 #x00           ; mov    $0xa,%edx
+    ;; #x59                                ; pop    %ecx
+
     #xbb #x01 #x00 #x00 #x00            ; mov    $0x1,%ebx
     #xb8 #x04 #x00 #x00 #x00            ; mov    $0x4,%eax
     #xcd #x80                           ; int    $0x80
+    #xc9                                ; leave
     #xc3                                ; ret
     ))