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:
parent
b1d6e19eca
commit
0685c9e7e8
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
/cons-mes
|
/cons-mes
|
||||||
/m
|
/m
|
||||||
|
/malloc
|
||||||
/main
|
/main
|
||||||
/micro-mes
|
/micro-mes
|
||||||
/mini-mes
|
/mini-mes
|
||||||
|
@ -25,6 +26,7 @@
|
||||||
|
|
||||||
/guile-cons-mes
|
/guile-cons-mes
|
||||||
/guile-m
|
/guile-m
|
||||||
|
/guile-malloc
|
||||||
/guile-main
|
/guile-main
|
||||||
/guile-micro-mes
|
/guile-micro-mes
|
||||||
/guile-mini-mes
|
/guile-mini-mes
|
||||||
|
|
|
@ -172,6 +172,15 @@ guile-m: scaffold/m.c
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
guile/mescc.scm $< > $@ || rm -f $@
|
||||||
chmod +x $@
|
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
|
micro-mes: scaffold/micro-mes.c GNUmakefile
|
||||||
rm -f $@
|
rm -f $@
|
||||||
gcc -nostdlib -I. --std=gnu99 -m32 -o $@ '-DVERSION="0.4"' $<
|
gcc -nostdlib -I. --std=gnu99 -m32 -o $@ '-DVERSION="0.4"' $<
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
(define (i386:exit f g ta t d)
|
(define (i386:exit f g ta t d)
|
||||||
`(
|
'(
|
||||||
#x5b ; pop %ebx
|
#x5b ; pop %ebx
|
||||||
#x5b ; pop %ebx
|
#x5b ; pop %ebx
|
||||||
#xb8 #x01 #x00 #x00 #x00 ; mov $0x1,%eax
|
#xb8 #x01 #x00 #x00 #x00 ; mov $0x1,%eax
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
))
|
))
|
||||||
|
|
||||||
(define (i386:open f g ta t d)
|
(define (i386:open f g ta t d)
|
||||||
`(
|
'(
|
||||||
#x55 ; push %ebp
|
#x55 ; push %ebp
|
||||||
#x89 #xe5 ; mov %esp,%ebp
|
#x89 #xe5 ; mov %esp,%ebp
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
))
|
))
|
||||||
|
|
||||||
(define (i386:read f g ta t d)
|
(define (i386:read f g ta t d)
|
||||||
`(
|
'(
|
||||||
#x55 ; push %ebp
|
#x55 ; push %ebp
|
||||||
#x89 #xe5 ; mov %esp,%ebp
|
#x89 #xe5 ; mov %esp,%ebp
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@
|
||||||
))
|
))
|
||||||
|
|
||||||
(define (i386:write f g ta t d)
|
(define (i386:write f g ta t d)
|
||||||
`(
|
'(
|
||||||
#x55 ; push %ebp
|
#x55 ; push %ebp
|
||||||
#x89 #xe5 ; mov %esp,%ebp
|
#x89 #xe5 ; mov %esp,%ebp
|
||||||
|
|
||||||
|
@ -79,6 +79,20 @@
|
||||||
#xc3 ; ret
|
#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)
|
(define (i386:_start)
|
||||||
(string-append ".byte"
|
(string-append ".byte"
|
||||||
" 0x89 0xe8" ; mov %ebp,%eax
|
" 0x89 0xe8" ; mov %ebp,%eax
|
||||||
|
@ -95,4 +109,5 @@
|
||||||
(cons "exit" (list i386:exit))
|
(cons "exit" (list i386:exit))
|
||||||
(cons "open" (list i386:open))
|
(cons "open" (list i386:open))
|
||||||
(cons "read" (list i386:read))
|
(cons "read" (list i386:read))
|
||||||
(cons "write" (list i386:write))))
|
(cons "write" (list i386:write))
|
||||||
|
(cons "brk" (list i386:brk))))
|
||||||
|
|
|
@ -263,6 +263,44 @@ isdigit (char c)
|
||||||
parse-c99)))
|
parse-c99)))
|
||||||
ast))
|
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
|
(define libc
|
||||||
(list
|
(list
|
||||||
strlen
|
strlen
|
||||||
|
@ -275,4 +313,6 @@ isdigit (char c)
|
||||||
puts
|
puts
|
||||||
strcmp
|
strcmp
|
||||||
itoa
|
itoa
|
||||||
isdigit))
|
isdigit
|
||||||
|
malloc
|
||||||
|
realloc))
|
||||||
|
|
57
scaffold/malloc.c
Normal file
57
scaffold/malloc.c
Normal 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
|
|
@ -23,6 +23,11 @@
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
#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 MES_MINI 1
|
||||||
#define FIXED_PRIMITIVES 1
|
#define FIXED_PRIMITIVES 1
|
||||||
|
|
||||||
|
@ -38,8 +43,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int ARENA_SIZE = 4000000;
|
//int ARENA_SIZE = 4000000;
|
||||||
char arena[4000000];
|
int ARENA_SIZE = 100000000;
|
||||||
|
char *arena = 0;
|
||||||
|
|
||||||
typedef int SCM;
|
typedef int SCM;
|
||||||
|
|
||||||
|
@ -72,7 +78,13 @@ struct function {
|
||||||
char *name;
|
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
|
//FIXME
|
||||||
//struct scm *g_news = 0;
|
//struct scm *g_news = 0;
|
||||||
|
@ -203,7 +215,8 @@ int g_function = 0;
|
||||||
SCM
|
SCM
|
||||||
alloc (int n)
|
alloc (int n)
|
||||||
{
|
{
|
||||||
#if __GNUC__
|
#if 1
|
||||||
|
//__GNUC__
|
||||||
assert (g_free + n < ARENA_SIZE);
|
assert (g_free + n < ARENA_SIZE);
|
||||||
#endif
|
#endif
|
||||||
SCM x = g_free;
|
SCM x = g_free;
|
||||||
|
@ -1251,6 +1264,16 @@ SCM g_symbol_max;
|
||||||
SCM
|
SCM
|
||||||
gc_init_cells () ///((internal))
|
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;
|
return 0;
|
||||||
//g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm));
|
//g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue