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.
This commit is contained in:
Jan Nieuwenhuizen 2017-04-02 12:31:15 +02:00
parent b1d6e19eca
commit 0685c9e7e8
6 changed files with 157 additions and 11 deletions

2
.gitignore vendored
View 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

View 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"' $<

View 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
@ -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))))

View 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))

57
scaffold/malloc.c Normal file
View file

@ -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

View file

@ -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;