mescc: Tinycc support: Function addresses.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 17:46:26 +0000 (19:46 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 11 May 2018 17:46:26 +0000 (19:46 +0200)
module/language/c99/compiler.mes
module/language/c99/info.scm
module/mes/M1.mes

index f275fb99689230fdde2b51e013decd5f84b05d28..ea41b3620b0b57a7c544220bfd1be50410f26da8 100644 (file)
 (define (ast->name o)
   (pmatch o
     ((ident ,name) name)
-    ((ptr-declr ,pointer (ident ,name)) name)
     ((array-of ,array . ,_) (ast->name array))
-    ((ftn-declr (scope (ptr-declr ,pointer (ident ,name)))) name)
+    ((ftn-declr (scope (ptr-declr ,pointer (ident ,name))) . _) name)
     ((ptr-declr ,pointer ,decl . ,_) (ast->name decl))
+    ((ptr-declr ,pointer (ident ,name)) name)
     (_ (error "ast->name not supported: " o))))
 
 (define (init-declr->count info o)
index 1d387ced520bc644e7dd3bf059e089d4ec7d61e0..a04276100dd49fda3cbc463377b4c92c79fe82ba 100644 (file)
@@ -96,6 +96,7 @@
             function:name
             function:type
             function:text
+            function->string
 
             ->type
             ->rank
   (type function:type)
   (text function:text))
 
+(define (function->string o)
+  (function:name o))
+
 (define (structured-type? o)
   (cond ((type? o) (memq (type:type o) '(struct union)))
         ((global? o) ((compose structured-type? global:type) o))
index e515d4252246532167d3b7d82d9fdd677eaeba78..3280cd5895f29692a5b1e4f695810fcdffc0aa30 100644 (file)
            (hex2:address address))
           ((#:address (#:address ,global)) (guard (global? global))
            (hex2:address (global->string global)))
+          ((#:address ,function) (guard (function? function))
+           (hex2:address (function->string function)))
+          ((#:address ,number) (guard (number? number))
+           (string-join (map text->M1 (int->bv32 number))))
           ((#:string ,string)
            (hex2:address (string->label o)))
           ((#:address ,address) (guard (string? address)) (hex2:address address))
           ((#:offset ,offset) (hex2:offset offset))
           ((#:offset1 ,offset1) (hex2:offset1 offset1))
           ((#:immediate ,immediate) (hex2:immediate immediate))
-          ((#:immediate1 ,immediate1) (hex2:immediate1 immediate1))))
+          ((#:immediate1 ,immediate1) (hex2:immediate1 immediate1))
+          (_ (error "text->M1 no match o" o))))
        ((pair? o) (string-join (map text->M1 o)))))
     (define (write-function o)
       (let ((name (car o))