mescc: Tinycc support: Function variables.

This commit is contained in:
Jan Nieuwenhuizen 2018-05-11 18:53:54 +02:00
parent 8cc406c9ff
commit ec13ccc19f
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
2 changed files with 31 additions and 3 deletions

View file

@ -176,6 +176,8 @@
(define (ast->type o info) (define (ast->type o info)
(define (type-helper o info) (define (type-helper o info)
(if (getenv "MESC_DEBUG")
(stderr "type-helper: ~s\n" o))
(pmatch o (pmatch o
(,t (guard (type? t)) t) (,t (guard (type? t)) t)
(,p (guard (pointer? p)) p) (,p (guard (pointer? p)) p)
@ -202,8 +204,13 @@
(let ((type (get-type name info))) (let ((type (get-type name info)))
(ast->type type info))) (ast->type type info)))
((fctn-call (p-expr (ident ,name)) . _) (or (ident->type info name) ((fctn-call (p-expr (ident ,name)) . _)
(get-type "int" info))) (or (and=> (assoc-ref (.functions info) name) function:type)
(get-type "int" info)))
((fctn-call (de-ref (p-expr (ident ,name))) . _)
(or (and=> (assoc-ref (.functions info) name) function:type)
(get-type "int" info)))
((fixed-type ,type) (ast->type type info)) ((fixed-type ,type) (ast->type type info))
((float-type ,type) (ast->type type info)) ((float-type ,type) (ast->type type info))
@ -1745,6 +1752,8 @@
(strings (filter string-global? (.globals tmp)))) (strings (filter string-global? (.globals tmp))))
(clone info #:globals (append (.globals info) strings) (clone info #:globals (append (.globals info) strings)
#:statics (append statics (.statics info))))))) #:statics (append statics (.statics info)))))))
(((decl-spec-list (stor-spec (,store)) (type-spec ,type)))
(type->info type #f info))
(((@ . _)) (((@ . _))
(stderr "decl->info: skip: ~s\n" o) (stderr "decl->info: skip: ~s\n" o)
info) info)
@ -1938,6 +1947,11 @@
(type (rank+= type rank))) (type (rank+= type rank)))
(if (.function info) (local->info type name o init info) (if (.function info) (local->info type name o init info)
(global->info type name o init info)))) (global->info type name o init info))))
(((ftn-declr (scope (ptr-declr ,pointer (ident ,name))) ,param-list))
(let* ((rank (pointer->rank pointer))
(type (rank+= type rank)))
(if (.function info) (local->info type name o '() info)
(global->info type name o '() info))))
(((ptr-declr ,pointer . ,_) . ,init) (((ptr-declr ,pointer . ,_) . ,init)
(let* ((rank (pointer->rank pointer)) (let* ((rank (pointer->rank pointer))
(type (rank+= type rank))) (type (rank+= type rank)))

View file

@ -34,7 +34,7 @@ char *list[2] = {"foo\n", "bar\n"};
struct foo {int length; char* string;}; struct foo {int length; char* string;};
struct foo g_f = {3, "foo"}; struct foo g_f = {3, "foo"};
struct foo g_g = &g_f; struct foo *g_g = &g_f;
struct foo g_foes[2]; struct foo g_foes[2];
int g_foe; int g_foe;
@ -57,6 +57,12 @@ test (struct foo* p)
p[0].length = 0; p[0].length = 0;
} }
int
next_main (int argc, char* argv[])
{
return 0;
}
int int
main (int argc, char* argv[]) main (int argc, char* argv[])
{ {
@ -131,6 +137,14 @@ main (int argc, char* argv[])
char buf[sizeof (g_f.string)]; char buf[sizeof (g_f.string)];
char buf1[sizeof (g_g->string)]; char buf1[sizeof (g_g->string)];
int (*fun)(int, char **);
fun = &next_main;
//i = (*fun)(argc, argv);
int (*fun2)(int, char *[]);
fun2 = &next_main;
//i = (*fun2)(argc, argv);
i = 1; i = 1;
int lst[6] = {-1, 1 - 1, i, 2, 3}; int lst[6] = {-1, 1 - 1, i, 2, 3};
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)