mescc: Add brk, naive malloc.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 2 Apr 2017 10:31:15 +0000 (12:31 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 2 Apr 2017 10:31:15 +0000 (12:31 +0200)
* 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
GNUmakefile
module/mes/libc-i386.mes
module/mes/libc.mes
scaffold/malloc.c [new file with mode: 0644]
scaffold/mini-mes.c

index deae9fad475e6df584e5246bc14c856ff1b987b3..76c911a8de636e88aeb41071b53bb17a83300f45 100644 (file)
@@ -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
index df0fa53188f13fcd7ef1c3bf9dce85e61d09a593..9e648250d2c19745fd8e876f06ab5ebb152d412c 100644 (file)
@@ -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"' $<
index b78ee0a5237cea0a7897f0d92d18141c5cfbb22c..1bc66129e6b1409eb99625993ef228d9f3fb784f 100644 (file)
@@ -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
 
     #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
    (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))))
index 531d4b8fa4abf7f73731a6112e7b88fb7ccb8922..0502987554ac8411877bad4936df047ef034cb97 100644 (file)
@@ -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 (file)
index 0000000..dfd1c05
--- /dev/null
@@ -0,0 +1,57 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#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
index abdf851f23ecbfe4feb82b908505a7d0d6277318..3abe2615648f50fdd692cb4808921e08439791ab 100644 (file)
 #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;