mescc: Compile specific for loop.
* module/language/c99/compiler.mes (ast->info): Handle for, pre-inc. * GNUmakefile (main): New target. * doc/examples/main.c: (exit, write, strlen,puts)[__GNUC__]: New functions; import from micro-mes.c (_start): New function.
This commit is contained in:
parent
4a3e419e30
commit
107795b13c
|
@ -45,6 +45,11 @@ micro-mes: doc/examples/micro-mes.c GNUmakefile
|
||||||
gcc -nostdlib --std=gnu99 -m32 -o micro-mes '-DVERSION="0.4"' $<
|
gcc -nostdlib --std=gnu99 -m32 -o micro-mes '-DVERSION="0.4"' $<
|
||||||
chmod +x $@
|
chmod +x $@
|
||||||
|
|
||||||
|
main: doc/examples/main.c GNUmakefile
|
||||||
|
rm -f $@
|
||||||
|
gcc -nostdlib --std=gnu99 -m32 -o main '-DVERSION="0.4"' $<
|
||||||
|
chmod +x $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f mes mes.o *.environment.i *.symbols.i *.environment.h *.cat a.out
|
rm -f mes mes.o *.environment.i *.symbols.i *.environment.h *.cat a.out
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,59 @@
|
||||||
|
#if __GNUC__
|
||||||
|
|
||||||
|
void
|
||||||
|
write (int fd, char const* s, int n)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
//syscall (SYS_write, fd, s, n));
|
||||||
|
asm (
|
||||||
|
"mov %0, %%ebx\n\t"
|
||||||
|
"mov %1, %%ecx\n\t"
|
||||||
|
"mov %2, %%edx\n\t"
|
||||||
|
|
||||||
|
"mov $0x4, %%eax\n\t"
|
||||||
|
"int $0x80\n\t"
|
||||||
|
: // no outputs "=" (r)
|
||||||
|
: "" (fd), "" (s), "" (n)
|
||||||
|
: "eax", "ebx", "ecx", "edx"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
exit (int code)
|
||||||
|
{
|
||||||
|
asm (
|
||||||
|
"movl %0, %%ebx\n\t"
|
||||||
|
"movl $1, %%eax\n\t"
|
||||||
|
"int $0x80"
|
||||||
|
: // no outputs "=" (r)
|
||||||
|
: "" (code)
|
||||||
|
);
|
||||||
|
// not reached
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define STDOUT 1
|
||||||
|
|
||||||
|
typedef long size_t;
|
||||||
|
size_t
|
||||||
|
strlen (char const* s)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (s[i]) i++;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
puts (char const* s)
|
||||||
|
{
|
||||||
|
//write (STDOUT, s, strlen (s));
|
||||||
|
//int i = write (STDOUT, s, strlen (s));
|
||||||
|
int i = strlen (s);
|
||||||
|
write (1, s, i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
main ()
|
main ()
|
||||||
{
|
{
|
||||||
|
@ -6,3 +62,12 @@ main ()
|
||||||
puts (" Hello, world!\n");
|
puts (" Hello, world!\n");
|
||||||
return 42;
|
return 42;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __GNUC__
|
||||||
|
void
|
||||||
|
_start ()
|
||||||
|
{
|
||||||
|
int r=main ();
|
||||||
|
exit (r);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -235,8 +235,7 @@
|
||||||
(append text (list (lambda (f g t d)
|
(append text (list (lambda (f g t d)
|
||||||
(i386:call f g t d
|
(i386:call f g t d
|
||||||
(+ t (function-offset name f))
|
(+ t (function-offset name f))
|
||||||
(+ d (data-offset string globals
|
(+ d (data-offset string g))))))
|
||||||
))))))
|
|
||||||
#:globals globals))))
|
#:globals globals))))
|
||||||
|
|
||||||
((expr-stmt (fctn-call (p-expr (ident ,name)) (expr-list . ,expr-list)))
|
((expr-stmt (fctn-call (p-expr (ident ,name)) (expr-list . ,expr-list)))
|
||||||
|
@ -265,6 +264,50 @@
|
||||||
body-text)
|
body-text)
|
||||||
#:globals (.globals body-info))))
|
#:globals (.globals body-info))))
|
||||||
|
|
||||||
|
(;;(for ,init ,test ,step ,body)
|
||||||
|
(for ,init
|
||||||
|
;; FIXME: ,test
|
||||||
|
(lt (p-expr (ident ,name)) (p-expr (fixed ,value)))
|
||||||
|
,step ,body)
|
||||||
|
(let* ((value (string->number value))
|
||||||
|
(info (clone info #:text '()))
|
||||||
|
|
||||||
|
(info ((ast->info info) init))
|
||||||
|
|
||||||
|
(init-text (.text info))
|
||||||
|
(init-locals (.locals info))
|
||||||
|
(info (clone info #:text '()))
|
||||||
|
|
||||||
|
(body-info ((ast->info info) body))
|
||||||
|
(body-text (.text body-info))
|
||||||
|
(body-length (length (text->list body-text)))
|
||||||
|
|
||||||
|
(step-info ((ast->info info) `(expr-stmt ,step)))
|
||||||
|
(step-text (.text step-info))
|
||||||
|
(step-length (length (text->list step-text)))
|
||||||
|
|
||||||
|
;; (test-info ((ast->info info) test))
|
||||||
|
;; (test-text (.text test-info))
|
||||||
|
;; (test-length (length (text->list test-text)))
|
||||||
|
)
|
||||||
|
|
||||||
|
(clone info #:text
|
||||||
|
(append text
|
||||||
|
init-text
|
||||||
|
(list (lambda (f g t d) (i386:jump body-length)))
|
||||||
|
body-text
|
||||||
|
step-text
|
||||||
|
;;test-text
|
||||||
|
;;(list (lambda (f g t d) (i386:jump-nz (- (+ body-length test-length)))))
|
||||||
|
(list (lambda (f g t d)
|
||||||
|
(append
|
||||||
|
(i386:local-test (assoc-ref init-locals name) value)
|
||||||
|
(i386:jump-le (- (+ body-length step-length 2) ;;test-length
|
||||||
|
)))))
|
||||||
|
)
|
||||||
|
#:globals (append globals (.globals body-info))
|
||||||
|
#:locals locals)))
|
||||||
|
|
||||||
((while ,test ,body)
|
((while ,test ,body)
|
||||||
(let* ((info (clone info #:text '()))
|
(let* ((info (clone info #:text '()))
|
||||||
(body-info ((ast->info info) body))
|
(body-info ((ast->info info) body))
|
||||||
|
@ -300,11 +343,18 @@
|
||||||
((ident->accu locals) index)
|
((ident->accu locals) index)
|
||||||
(i386:mem-byte->accu))))))) ; FIXME: type: char
|
(i386:mem-byte->accu))))))) ; FIXME: type: char
|
||||||
|
|
||||||
|
;; i++
|
||||||
((expr-stmt (post-inc (p-expr (ident ,name))))
|
((expr-stmt (post-inc (p-expr (ident ,name))))
|
||||||
(clone info #:text
|
(clone info #:text
|
||||||
(append text (list (lambda (f g t d)
|
(append text (list (lambda (f g t d)
|
||||||
(i386:local-add (assoc-ref locals name) 1))))))
|
(i386:local-add (assoc-ref locals name) 1))))))
|
||||||
|
|
||||||
|
;; ++i -- same for now FIXME
|
||||||
|
((expr-stmt (pre-inc (p-expr (ident ,name))))
|
||||||
|
(clone info #:text
|
||||||
|
(append text (list (lambda (f g t d)
|
||||||
|
(i386:local-add (assoc-ref locals name) 1))))))
|
||||||
|
|
||||||
((return ,expr)
|
((return ,expr)
|
||||||
(clone info #:text
|
(clone info #:text
|
||||||
(append text (list (i386:ret ((expr->accu info) expr))))))
|
(append text (list (i386:ret ((expr->accu info) expr))))))
|
||||||
|
|
Loading…
Reference in a new issue