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
|
||||
/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
|
||||
|
|
|
@ -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"' $<
|
||||
|
|
|
@ -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))))
|
||||
|
|
|
@ -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
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
|
||||
#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,6 +1264,16 @@ 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));
|
||||
|
||||
|
|
Loading…
Reference in a new issue