mescc: Mes C Library: Add x86_64 libc-mini support.
* lib/linux/x86-mes-gcc/mini.c: Rename from lib/linux/mini-gcc.c. * lib/linux/x86-mes/mini.c: Rename from lib/linux/mini-mes.c. * lib/linux/x86_64-mes-gcc/crt1.c: Rename from lib/linux/x86_64/crt1.c. * lib/linux/x86_64-mes-gcc/mini.c: New file. * build-aux/build-cc.sh: Build libc-mini, scaffold/main, scaffold/hello. * build-aux/cc64.sh: New file.
This commit is contained in:
parent
75c54406ce
commit
46e0641e9c
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -35,9 +35,12 @@
|
||||||
*.stderr
|
*.stderr
|
||||||
*.stdout
|
*.stdout
|
||||||
*.x86-out
|
*.x86-out
|
||||||
|
*.x86_64-mes-gcc-o
|
||||||
|
*.x86_64-mes-gcc-out
|
||||||
*.x86_64-mes-out
|
*.x86_64-mes-out
|
||||||
*.x86_64-out
|
*.x86_64-out
|
||||||
|
|
||||||
|
|
||||||
/lib/x86-mes-gcc
|
/lib/x86-mes-gcc
|
||||||
/lib/x86-mes-tcc
|
/lib/x86-mes-tcc
|
||||||
/src/*.h
|
/src/*.h
|
||||||
|
|
3
HACKING
3
HACKING
|
@ -191,6 +191,9 @@ b *0x804a79d
|
||||||
** Create memory dump with 32 bit Gcc compiled Mes
|
** Create memory dump with 32 bit Gcc compiled Mes
|
||||||
make out/i686-unknown-linux-gnu-mes
|
make out/i686-unknown-linux-gnu-mes
|
||||||
out/i686-unknown-linux-gnu-mes --dump < module/mes/read-0.mes > module/mes/read-0-32.mo
|
out/i686-unknown-linux-gnu-mes --dump < module/mes/read-0.mes > module/mes/read-0-32.mo
|
||||||
|
|
||||||
|
x/s *((char **)($rsp+8))
|
||||||
|
|
||||||
** C parser/compiler
|
** C parser/compiler
|
||||||
*** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
|
*** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
|
||||||
*** PEG: [[http://piumarta.com/software/peg/][parse C using PEG]]
|
*** PEG: [[http://piumarta.com/software/peg/][parse C using PEG]]
|
||||||
|
|
|
@ -23,6 +23,10 @@ set -e
|
||||||
. ${srcdest}build-aux/config.sh
|
. ${srcdest}build-aux/config.sh
|
||||||
. ${srcdest}build-aux/trace.sh
|
. ${srcdest}build-aux/trace.sh
|
||||||
|
|
||||||
|
# cc64
|
||||||
|
LIBC=${LIBC-c-mini}
|
||||||
|
|
||||||
|
# native
|
||||||
trace "SNARF gc.c" ${srcdest}build-aux/mes-snarf.scm src/gc.c
|
trace "SNARF gc.c" ${srcdest}build-aux/mes-snarf.scm src/gc.c
|
||||||
trace "SNARF lib.c" ${srcdest}build-aux/mes-snarf.scm src/lib.c
|
trace "SNARF lib.c" ${srcdest}build-aux/mes-snarf.scm src/lib.c
|
||||||
trace "SNARF math.c" ${srcdest}build-aux/mes-snarf.scm src/math.c
|
trace "SNARF math.c" ${srcdest}build-aux/mes-snarf.scm src/math.c
|
||||||
|
@ -31,5 +35,37 @@ trace "SNARF posix.c" ${srcdest}build-aux/mes-snarf.scm src/posix.c
|
||||||
trace "SNARF reader.c" ${srcdest}build-aux/mes-snarf.scm src/reader.c
|
trace "SNARF reader.c" ${srcdest}build-aux/mes-snarf.scm src/reader.c
|
||||||
trace "SNARF vector.c" ${srcdest}build-aux/mes-snarf.scm src/vector.c
|
trace "SNARF vector.c" ${srcdest}build-aux/mes-snarf.scm src/vector.c
|
||||||
|
|
||||||
|
# cc64-mes
|
||||||
|
trace "MSNARF gc.c" ${srcdest}build-aux/mes-snarf.scm --mes src/gc.c
|
||||||
|
trace "MSNARF lib.c" ${srcdest}build-aux/mes-snarf.scm --mes src/lib.c
|
||||||
|
trace "MSNARF math.c" ${srcdest}build-aux/mes-snarf.scm --mes src/math.c
|
||||||
|
trace "MSNARF mes.c" ${srcdest}build-aux/mes-snarf.scm --mes src/mes.c
|
||||||
|
trace "MSNARF posix.c" ${srcdest}build-aux/mes-snarf.scm --mes src/posix.c
|
||||||
|
trace "MSNARF reader.c" ${srcdest}build-aux/mes-snarf.scm --mes src/reader.c
|
||||||
|
trace "MSNARF vector.c" ${srcdest}build-aux/mes-snarf.scm --mes src/vector.c
|
||||||
|
|
||||||
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc.sh lib/libmes
|
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc.sh lib/libmes
|
||||||
sh ${srcdest}build-aux/cc.sh src/mes
|
sh ${srcdest}build-aux/cc.sh src/mes
|
||||||
|
|
||||||
|
#ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64/crt0
|
||||||
|
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64-mes-gcc/crt1
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64/crti
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64/crtn
|
||||||
|
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc-mini
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libgetopt
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc+tcc
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libtcc1
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libc+gnu
|
||||||
|
# ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/libg
|
||||||
|
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/main
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/hello
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/argv
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/malloc
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/micro-mes
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/tiny-mes
|
||||||
|
# sh ${srcdest}build-aux/cc64-mes.sh scaffold/cons-mes
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh scaffold/mini-mes
|
||||||
|
|
||||||
|
sh ${srcdest}build-aux/cc64-mes.sh src/mes
|
||||||
|
|
|
@ -27,6 +27,7 @@ LIBC=${LIBC-c}
|
||||||
|
|
||||||
##moduledir=${moduledir-${datadir}${datadir:+/}module}
|
##moduledir=${moduledir-${datadir}${datadir:+/}module}
|
||||||
|
|
||||||
|
# native
|
||||||
# trace "SNARF gc.c" ${srcdest}build-aux/mes-snarf.scm src/gc.c
|
# trace "SNARF gc.c" ${srcdest}build-aux/mes-snarf.scm src/gc.c
|
||||||
# trace "SNARF lib.c" ${srcdest}build-aux/mes-snarf.scm src/lib.c
|
# trace "SNARF lib.c" ${srcdest}build-aux/mes-snarf.scm src/lib.c
|
||||||
# trace "SNARF math.c" ${srcdest}build-aux/mes-snarf.scm src/math.c
|
# trace "SNARF math.c" ${srcdest}build-aux/mes-snarf.scm src/math.c
|
||||||
|
@ -35,6 +36,7 @@ LIBC=${LIBC-c}
|
||||||
# trace "SNARF reader.c" ${srcdest}build-aux/mes-snarf.scm src/reader.c
|
# trace "SNARF reader.c" ${srcdest}build-aux/mes-snarf.scm src/reader.c
|
||||||
# trace "SNARF vector.c" ${srcdest}build-aux/mes-snarf.scm src/vector.c
|
# trace "SNARF vector.c" ${srcdest}build-aux/mes-snarf.scm src/vector.c
|
||||||
|
|
||||||
|
# cc32-mes
|
||||||
trace "MSNARF gc.c" ${srcdest}build-aux/mes-snarf.scm --mes src/gc.c
|
trace "MSNARF gc.c" ${srcdest}build-aux/mes-snarf.scm --mes src/gc.c
|
||||||
trace "MSNARF lib.c" ${srcdest}build-aux/mes-snarf.scm --mes src/lib.c
|
trace "MSNARF lib.c" ${srcdest}build-aux/mes-snarf.scm --mes src/lib.c
|
||||||
trace "MSNARF math.c" ${srcdest}build-aux/mes-snarf.scm --mes src/math.c
|
trace "MSNARF math.c" ${srcdest}build-aux/mes-snarf.scm --mes src/math.c
|
||||||
|
@ -55,12 +57,12 @@ ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc32-mes.sh lib/libtcc1
|
||||||
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc32-mes.sh lib/libc+gnu
|
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc32-mes.sh lib/libc+gnu
|
||||||
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc32-mes.sh lib/libg
|
ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc32-mes.sh lib/libg
|
||||||
|
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/main
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/main
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/hello
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/hello
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/argv
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/argv
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/malloc
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/malloc
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/micro-mes
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/micro-mes
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/tiny-mes
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/tiny-mes
|
||||||
# sh ${srcdest}build-aux/cc32-mes.sh scaffold/mini-mes
|
sh ${srcdest}build-aux/cc32-mes.sh scaffold/mini-mes
|
||||||
|
|
||||||
sh ${srcdest}build-aux/cc32-mes.sh src/mes
|
sh ${srcdest}build-aux/cc32-mes.sh src/mes
|
||||||
|
|
64
build-aux/cc64-mes.sh
Executable file
64
build-aux/cc64-mes.sh
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
# GNU Mes --- Maxwell Equations of Software
|
||||||
|
# Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
#
|
||||||
|
# This file is part of GNU Mes.
|
||||||
|
#
|
||||||
|
# GNU 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.
|
||||||
|
#
|
||||||
|
# GNU 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 GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. ${srcdest}build-aux/config.sh
|
||||||
|
. ${srcdest}build-aux/trace.sh
|
||||||
|
|
||||||
|
arch=x86_64-mes-gcc
|
||||||
|
if [ "$CC64" = "$TCC" ]; then
|
||||||
|
arch=x86_64-mes-tcc
|
||||||
|
LIBC=c+tcc # tcc bug with undefined symbols
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$LIBC" ]; then
|
||||||
|
CC64LIBS="lib/$arch/lib$LIBC.o"
|
||||||
|
fi
|
||||||
|
|
||||||
|
c=$1
|
||||||
|
|
||||||
|
if [ -z "$ARCHDIR" ]; then
|
||||||
|
o="$c"
|
||||||
|
d=${c%%/*}
|
||||||
|
p="$arch-"
|
||||||
|
else
|
||||||
|
b=${c##*/}
|
||||||
|
d=${c%%/*}/$arch
|
||||||
|
o="$d/$b"
|
||||||
|
fi
|
||||||
|
mkdir -p $d
|
||||||
|
|
||||||
|
trace "CC64 $c.c" $CC64\
|
||||||
|
-c\
|
||||||
|
$CC64_CPPFLAGS\
|
||||||
|
$CC64_CFLAGS\
|
||||||
|
-o "$o".${p}o\
|
||||||
|
"${srcdest}$c".c
|
||||||
|
|
||||||
|
if [ -z "$NOLINK" ]; then
|
||||||
|
trace "CCLD64 $c.c" $CC64\
|
||||||
|
$CC64_CPPFLAGS\
|
||||||
|
$CC64_CFLAGS\
|
||||||
|
-o "$o".${p}out\
|
||||||
|
lib/$arch/crt1.o\
|
||||||
|
"$o".${p}o\
|
||||||
|
$CC64LIBS
|
||||||
|
fi
|
|
@ -26,6 +26,7 @@ fi
|
||||||
export CC
|
export CC
|
||||||
export CC CFLAGS
|
export CC CFLAGS
|
||||||
export CC32
|
export CC32
|
||||||
|
export CC64
|
||||||
export CC_CFLAGS
|
export CC_CFLAGS
|
||||||
export CC_CFLAGS
|
export CC_CFLAGS
|
||||||
export CC_CPPFLAGS
|
export CC_CPPFLAGS
|
||||||
|
@ -82,6 +83,33 @@ CC_CFLAGS=${CC_CFLAGS-"
|
||||||
-g
|
-g
|
||||||
"}
|
"}
|
||||||
|
|
||||||
|
CC64_CPPFLAGS=${CC64_CPPFLAGS-"
|
||||||
|
-D 'VERSION=\"$VERSION\"'
|
||||||
|
-D 'MODULEDIR=\"$moduledir\"'
|
||||||
|
-D 'PREFIX=\"$prefix\"'
|
||||||
|
-I src
|
||||||
|
-I ${srcdest}src
|
||||||
|
-I ${srcdest}lib
|
||||||
|
-I ${srcdest}include
|
||||||
|
"}
|
||||||
|
|
||||||
|
CC64_CFLAGS=${CC64_CFLAGS-"
|
||||||
|
-std=gnu99
|
||||||
|
-O0
|
||||||
|
-fno-builtin
|
||||||
|
-fno-stack-protector
|
||||||
|
-g
|
||||||
|
-m64
|
||||||
|
-nostdinc
|
||||||
|
-nostdlib
|
||||||
|
-Wno-discarded-qualifiers
|
||||||
|
-Wno-int-to-pointer-cast
|
||||||
|
-Wno-pointer-to-int-cast
|
||||||
|
-Wno-pointer-sign
|
||||||
|
-Wno-int-conversion
|
||||||
|
-Wno-incompatible-pointer-types
|
||||||
|
"}
|
||||||
|
|
||||||
CC32_CPPFLAGS=${CC32_CPPFLAGS-"
|
CC32_CPPFLAGS=${CC32_CPPFLAGS-"
|
||||||
-D 'VERSION=\"$VERSION\"'
|
-D 'VERSION=\"$VERSION\"'
|
||||||
-D 'MODULEDIR=\"$moduledir\"'
|
-D 'MODULEDIR=\"$moduledir\"'
|
||||||
|
|
|
@ -60,6 +60,10 @@ ifdef CC32
|
||||||
export CC32
|
export CC32
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CC64
|
||||||
|
export CC64
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef BLOOD_ELF
|
ifdef BLOOD_ELF
|
||||||
export BLOOD_ELF
|
export BLOOD_ELF
|
||||||
endif
|
endif
|
||||||
|
@ -124,6 +128,10 @@ ifdef CC32_CFLAGS
|
||||||
export CC32_CFLAGS
|
export CC32_CFLAGS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CC64_CFLAGS
|
||||||
|
export CC64_CFLAGS
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef HEX2FLAGS
|
ifdef HEX2FLAGS
|
||||||
export HEX2FLAGS
|
export HEX2FLAGS
|
||||||
endif
|
endif
|
||||||
|
|
7
configure
vendored
7
configure
vendored
|
@ -281,6 +281,8 @@ Some influential environment variables:
|
||||||
CC C compiler command
|
CC C compiler command
|
||||||
CFLAGS C compiler flags
|
CFLAGS C compiler flags
|
||||||
CC32 x86 C compiler command
|
CC32 x86 C compiler command
|
||||||
|
CC64_CFLAGS x86_64 C compiler flags
|
||||||
|
CC64 x86_64 C compiler command
|
||||||
CC32_CFLAGS x86 C compiler flags
|
CC32_CFLAGS x86 C compiler flags
|
||||||
GUILE guile command
|
GUILE guile command
|
||||||
GUILE_TOOLS guile-tools command
|
GUILE_TOOLS guile-tools command
|
||||||
|
@ -364,6 +366,9 @@ Some influential environment variables:
|
||||||
(make-dep "cc32" '(2 95)
|
(make-dep "cc32" '(2 95)
|
||||||
#:optional? #t
|
#:optional? #t
|
||||||
#:commands '("i686-unknown-linux-gnu-gcc"))
|
#:commands '("i686-unknown-linux-gnu-gcc"))
|
||||||
|
(make-dep "cc64" '(2 95)
|
||||||
|
#:optional? #t
|
||||||
|
#:commands '("gcc"))
|
||||||
(make-dep "M1" '(0 3))
|
(make-dep "M1" '(0 3))
|
||||||
(make-dep "blood-elf" '(0 1))
|
(make-dep "blood-elf" '(0 1))
|
||||||
(make-dep "hex2" '(0 3))
|
(make-dep "hex2" '(0 3))
|
||||||
|
@ -458,9 +463,9 @@ Some influential environment variables:
|
||||||
'(
|
'(
|
||||||
"CFLAGS"
|
"CFLAGS"
|
||||||
"CC32_CFLAGS"
|
"CC32_CFLAGS"
|
||||||
|
"CC64_CFLAGS"
|
||||||
"HEX2FLAGS"
|
"HEX2FLAGS"
|
||||||
"M1FLAGS"
|
"M1FLAGS"
|
||||||
"CC32_CFLAGS"
|
|
||||||
"MES_CFLAGS"
|
"MES_CFLAGS"
|
||||||
))))
|
))))
|
||||||
|
|
||||||
|
|
|
@ -20,13 +20,21 @@
|
||||||
|
|
||||||
#if __MESC__
|
#if __MESC__
|
||||||
|
|
||||||
#include <linux/mini-mes.c>
|
#include <linux/x86-mes/mini.c>
|
||||||
|
|
||||||
#else // !__MESC__
|
#elif __i386__
|
||||||
|
|
||||||
#include <linux/mini-gcc.c>
|
#include <linux/x86-mes-gcc/mini.c>
|
||||||
|
|
||||||
#endif // !__MESC__
|
#elif __x86_64__
|
||||||
|
|
||||||
|
#include <linux/x86_64-mes-gcc/mini.c>
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#error arch not supported
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
write (int filedes, void const *buffer, size_t size)
|
write (int filedes, void const *buffer, size_t size)
|
||||||
|
|
|
@ -38,7 +38,7 @@ _exit (int code)
|
||||||
ssize_t
|
ssize_t
|
||||||
_write (int filedes, void const *buffer, size_t size)
|
_write (int filedes, void const *buffer, size_t size)
|
||||||
{
|
{
|
||||||
int r;
|
long r;
|
||||||
asm (
|
asm (
|
||||||
"mov $"SYS_write",%%eax\n\t"
|
"mov $"SYS_write",%%eax\n\t"
|
||||||
"mov %1,%%ebx\n\t"
|
"mov %1,%%ebx\n\t"
|
57
lib/linux/x86_64-mes-gcc/crt1.c
Normal file
57
lib/linux/x86_64-mes-gcc/crt1.c
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU 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.
|
||||||
|
*
|
||||||
|
* GNU 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 GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char **environ = 0;
|
||||||
|
int main (int argc, char *argv[]);
|
||||||
|
|
||||||
|
// gcc x86_64 calling convention:
|
||||||
|
// edi, esi, edx, ecx, r8d, r9d, <stack0>, <stack1>
|
||||||
|
|
||||||
|
void
|
||||||
|
_start ()
|
||||||
|
{
|
||||||
|
asm (
|
||||||
|
"movq %%rbp,%%rax\n\t"
|
||||||
|
"add $8,%%rax\n\t"
|
||||||
|
"movq (%%rax),%%rax\n\t"
|
||||||
|
"add $3,%%rax\n\t"
|
||||||
|
"shl $3,%%rax\n\t"
|
||||||
|
"add %%rbp,%%rax\n\t"
|
||||||
|
"mov %%rax,%0\n\t"
|
||||||
|
: "=r" (environ)
|
||||||
|
: //no inputs ""
|
||||||
|
);
|
||||||
|
asm (
|
||||||
|
"mov %rbp,%rax\n\t"
|
||||||
|
"add $16,%rax\n\t"
|
||||||
|
"mov %rax,%rsi\n\t"
|
||||||
|
|
||||||
|
"mov %rbp,%rax\n\t"
|
||||||
|
"add $8,%rax\n\t"
|
||||||
|
"mov (%rax),%rax\n\t"
|
||||||
|
"mov %rax,%rdi\n\t"
|
||||||
|
"call main\n\t"
|
||||||
|
|
||||||
|
"mov %rax,%rdi\n\t"
|
||||||
|
"mov $0x3c,%rax\n\t"
|
||||||
|
"syscall \n\t"
|
||||||
|
"hlt \n\t"
|
||||||
|
);
|
||||||
|
}
|
54
lib/linux/x86_64-mes-gcc/mini.c
Normal file
54
lib/linux/x86_64-mes-gcc/mini.c
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/* -*-comment-start: "//";comment-end:""-*-
|
||||||
|
* GNU Mes --- Maxwell Equations of Software
|
||||||
|
* Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
*
|
||||||
|
* This file is part of GNU Mes.
|
||||||
|
*
|
||||||
|
* GNU 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.
|
||||||
|
*
|
||||||
|
* GNU 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 GNU Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SYS_exit "0x3c"
|
||||||
|
#define SYS_write "0x01"
|
||||||
|
|
||||||
|
void
|
||||||
|
_exit (int code)
|
||||||
|
{
|
||||||
|
asm (
|
||||||
|
"mov $"SYS_exit",%%rax\n\t"
|
||||||
|
"mov %0,%%rdi\n\t"
|
||||||
|
"syscall \n\t"
|
||||||
|
: // no outputs "=" (r)
|
||||||
|
: "rm" (code)
|
||||||
|
);
|
||||||
|
// not reached
|
||||||
|
_exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
_write (int filedes, void const *buffer, size_t size)
|
||||||
|
{
|
||||||
|
long r;
|
||||||
|
asm (
|
||||||
|
"mov $"SYS_write",%%rax\n\t"
|
||||||
|
"mov %1,%%rdi\n\t"
|
||||||
|
"mov %2,%%rsi\n\t"
|
||||||
|
"mov %3,%%rdx\n\t"
|
||||||
|
"syscall \n\t"
|
||||||
|
"mov %%rax,%0\n\t"
|
||||||
|
: "=r" (r)
|
||||||
|
: "rm" (filedes), "rm" (buffer), "rm" (size)
|
||||||
|
: "rax", "rdi", "rsi", "rdx"
|
||||||
|
);
|
||||||
|
return r;
|
||||||
|
}
|
|
@ -38,7 +38,7 @@ int JAM_SIZE = 20000;
|
||||||
int GC_SAFETY = 2000;
|
int GC_SAFETY = 2000;
|
||||||
|
|
||||||
char *g_arena = 0;
|
char *g_arena = 0;
|
||||||
typedef int SCM;
|
typedef long SCM;
|
||||||
|
|
||||||
int g_debug = 0;
|
int g_debug = 0;
|
||||||
int g_free = 0;
|
int g_free = 0;
|
||||||
|
|
Loading…
Reference in a new issue