From 0685c9e7e8c514395fe4c502e5b2a8405bcf33f6 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 2 Apr 2017 12:31:15 +0200 Subject: [PATCH] mescc: Add brk, naive malloc. * scaffold/mini-mes.c (gc_init_cells): Use malloc to init g_cells. * scaffold/malloc.c: New file. * GNUmakefile (malloc, guile-malloc): New targets. * module/mes/libc-i386.mes (i386:brk): New function. (i386:libc): Add it. * mlibc.c (brk): New function. (malloc): Use it. (realloc): New function. * module/mes/libc.mes (malloc, realloc): New functions. --- .gitignore | 2 ++ GNUmakefile | 9 +++++++ module/mes/libc-i386.mes | 25 ++++++++++++++---- module/mes/libc.mes | 42 ++++++++++++++++++++++++++++- scaffold/malloc.c | 57 ++++++++++++++++++++++++++++++++++++++++ scaffold/mini-mes.c | 33 +++++++++++++++++++---- 6 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 scaffold/malloc.c diff --git a/.gitignore b/.gitignore index deae9fad..76c911a8 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ /cons-mes /m +/malloc /main /micro-mes /mini-mes @@ -25,6 +26,7 @@ /guile-cons-mes /guile-m +/guile-malloc /guile-main /guile-micro-mes /guile-mini-mes diff --git a/GNUmakefile b/GNUmakefile index df0fa531..9e648250 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -172,6 +172,15 @@ guile-m: scaffold/m.c guile/mescc.scm $< > $@ || rm -f $@ chmod +x $@ +malloc: scaffold/malloc.c GNUmakefile + rm -f $@ + gcc -nostdlib -I. --std=gnu99 -m32 -g -o $@ '-DVERSION="0.4"' $< + chmod +x $@ + +guile-malloc: scaffold/malloc.c + guile/mescc.scm $< > $@ || rm -f $@ + chmod +x $@ + micro-mes: scaffold/micro-mes.c GNUmakefile rm -f $@ gcc -nostdlib -I. --std=gnu99 -m32 -o $@ '-DVERSION="0.4"' $< diff --git a/module/mes/libc-i386.mes b/module/mes/libc-i386.mes index b78ee0a5..1bc66129 100644 --- a/module/mes/libc-i386.mes +++ b/module/mes/libc-i386.mes @@ -25,7 +25,7 @@ ;;; Code: (define (i386:exit f g ta t d) - `( + '( #x5b ; pop %ebx #x5b ; pop %ebx #xb8 #x01 #x00 #x00 #x00 ; mov $0x1,%eax @@ -33,7 +33,7 @@ )) (define (i386:open f g ta t d) - `( + '( #x55 ; push %ebp #x89 #xe5 ; mov %esp,%ebp @@ -48,7 +48,7 @@ )) (define (i386:read f g ta t d) - `( + '( #x55 ; push %ebp #x89 #xe5 ; mov %esp,%ebp @@ -64,7 +64,7 @@ )) (define (i386:write f g ta t d) - `( + '( #x55 ; push %ebp #x89 #xe5 ; mov %esp,%ebp @@ -79,6 +79,20 @@ #xc3 ; ret )) +(define (i386:brk f g ta t d) + '( + #x55 ; push %ebp + #x89 #xe5 ; mov %esp,%ebp + + #x8b #x5d #x08 ; mov 0x8(%ebp),%ebx + #xb8 #x2d #x00 #x00 #x00 ; mov $0x2d,%eax + #xcd #x80 ; int $0x80 + + #xc9 ; leave + #xc3 ; ret + )) + + (define (i386:_start) (string-append ".byte" " 0x89 0xe8" ; mov %ebp,%eax @@ -95,4 +109,5 @@ (cons "exit" (list i386:exit)) (cons "open" (list i386:open)) (cons "read" (list i386:read)) - (cons "write" (list i386:write)))) + (cons "write" (list i386:write)) + (cons "brk" (list i386:brk)))) diff --git a/module/mes/libc.mes b/module/mes/libc.mes index 531d4b8f..05029875 100644 --- a/module/mes/libc.mes +++ b/module/mes/libc.mes @@ -263,6 +263,44 @@ isdigit (char c) parse-c99))) ast)) +(define malloc + (let* ((ast (with-input-from-string + " +//void *g_malloc_base = 0; +char *g_malloc_base = 0; + +//void * +int * +malloc (int size) +{ + //void *p = brk (0); + char *p = 0; + if (!g_malloc_base) g_malloc_base = p; + p = brk (0); + brk (p+size); + return p; +} +" +;;paredit:" + parse-c99))) + ast)) + +(define realloc + (let* ((ast (with-input-from-string + " +//void * +int * +//realloc (void *p, int size) +realloc (int *p, int size) +{ + brk (g_malloc_base + size); + return g_malloc_base; +} +" +;;paredit:" + parse-c99))) + ast)) + (define libc (list strlen @@ -275,4 +313,6 @@ isdigit (char c) puts strcmp itoa - isdigit)) + isdigit + malloc + realloc)) diff --git a/scaffold/malloc.c b/scaffold/malloc.c new file mode 100644 index 00000000..dfd1c059 --- /dev/null +++ b/scaffold/malloc.c @@ -0,0 +1,57 @@ +/* -*-comment-start: "//";comment-end:""-*- + * Mes --- Maxwell Equations of Software + * Copyright © 2016,2017 Jan Nieuwenhuizen + * + * 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 . + */ + +#if __GNUC__ +#include "mlibc.c" +#endif +#define assert(x) ((x) ? (void)0 : assert_fail (#x)) + +int +main (int argc, char *argv[]) +{ + int size = 5000; + puts ("m!\n"); + //int *p = 0; + char *p = 0; + p = malloc (size); + size = 5000; + puts ("p="); + puts (itoa (p)); + puts ("\n"); + for (int i = 0; i < size; i++) + { + puts ("set "); + puts (itoa (i)); + puts ("\n"); + p[i] = i; + } + for (int i = 0; i < size; i++) + { + puts (itoa (i)); + puts (": "); + puts (itoa (p[i])); + puts ("\n"); + } + return 0; +} + +#if __GNUC__ +#include "mstart.c" +#endif diff --git a/scaffold/mini-mes.c b/scaffold/mini-mes.c index abdf851f..3abe2615 100644 --- a/scaffold/mini-mes.c +++ b/scaffold/mini-mes.c @@ -23,6 +23,11 @@ #endif #define assert(x) ((x) ? (void)0 : assert_fail (#x)) +#if __MESCC__ +//void *g_malloc_base = 0; +char *g_malloc_base = 0; +#endif + #define MES_MINI 1 #define FIXED_PRIMITIVES 1 @@ -38,8 +43,9 @@ #endif -int ARENA_SIZE = 4000000; -char arena[4000000]; +//int ARENA_SIZE = 4000000; +int ARENA_SIZE = 100000000; +char *arena = 0; typedef int SCM; @@ -72,7 +78,13 @@ struct function { char *name; }; -struct scm *g_cells = arena; +//struct scm *g_cells = arena; +int *foobar = 0; +#if __GNUC__ +struct scm *g_cells; +#else +struct scm *g_cells = foobar; +#endif //FIXME //struct scm *g_news = 0; @@ -203,7 +215,8 @@ int g_function = 0; SCM alloc (int n) { -#if __GNUC__ +#if 1 + //__GNUC__ assert (g_free + n < ARENA_SIZE); #endif SCM x = g_free; @@ -1251,8 +1264,18 @@ SCM g_symbol_max; SCM gc_init_cells () ///((internal)) { + //return 0; + //g_cells = (scm *)malloc (ARENA_SIZE); +#if __GNUC__ + arena = (char*)malloc (ARENA_SIZE); +#else + char *p = 0; + p = malloc (ARENA_SIZE); + arena = p; +#endif + g_cells = arena; return 0; -// g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm)); + //g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm)); // #if __NYACC__ || FIXME_NYACC // TYPE (0) = TVECTOR;