build: Support tcc, create tinycc-seed with tcc.

* configure: check for tcc.
* build-aux/cc32-mes.sh: Rename from cc-mes-gcc.sh.  Support
  tcc.  Update users.
* build-aux/build-cc32-mes.sh: Rename from build-mes-gcc.sh.  Update users.
* GNUmakefile (mes-tcc): New target.
* .gitignore: Ignore mes-tcc arch output.
* lib/crt1.c (_start): Add "rm" constraint so satisfy tcc.
* lib/linux-gcc.c (_sys_call, _sys_call1 _sys_call2 _sys_call3): Likewise.
This commit is contained in:
Jan Nieuwenhuizen 2018-06-24 09:28:23 +02:00
parent c2ff5ec954
commit 350d94aa77
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
11 changed files with 118 additions and 111 deletions

7
.gitignore vendored
View file

@ -18,6 +18,11 @@
*.mes-gcc-out *.mes-gcc-out
*.mes-gcc-out *.mes-gcc-out
*.mes-gcc-stdout *.mes-gcc-stdout
*.mes-tcc
*.mes-tcc-o
*.mes-tcc-out
*.mes-tcc-out
*.mes-tcc-stdout
*.mes-o *.mes-o
*.mes-out *.mes-out
*.mes-stdout *.mes-stdout
@ -29,6 +34,8 @@
*.stderr *.stderr
*.stdout *.stdout
/lib/x86-mes-gcc
/lib/x86-mes-tcc
/src/*.h /src/*.h
/src/*.i /src/*.i
/src/mes /src/mes

View file

@ -18,7 +18,10 @@ cc:
build-aux/build-cc.sh build-aux/build-cc.sh
mes-gcc: mes-gcc:
build-aux/build-mes-gcc.sh build-aux/build-cc32.sh
mes-tcc:
CC32=$(TCC) build-aux/build-cc32.sh
mes: mes:
build-aux/build-mes.sh build-aux/build-mes.sh
@ -41,8 +44,7 @@ install:
.config.make: ./configure .config.make: ./configure
seed: all-go seed: all-go mes-gcc mes-tcc
build-aux/build-mes-gcc.sh
cd $(TINYCC_SEED) && MES_PREFIX=$(PWD) ./refresh.sh cd $(TINYCC_SEED) && MES_PREFIX=$(PWD) ./refresh.sh
cd $(MES_SEED) && git reset --hard HEAD cd $(MES_SEED) && git reset --hard HEAD
MES=$(GUILE) GUILE=$(GUILE) SEED=1 build-aux/build-mes.sh MES=$(GUILE) GUILE=$(GUILE) SEED=1 build-aux/build-mes.sh
@ -65,6 +67,7 @@ Targets:
all-go update .go files all-go update .go files
cc update src/mes.gcc-out cc update src/mes.gcc-out
mes-gcc update src/mes.mes-gcc-out mes-gcc update src/mes.mes-gcc-out
mes-tcc update src/mes.mes-tcc-out
mes update src/mes mes update src/mes
check run unit tests check run unit tests
clean run git clean -dfx clean run git clean -dfx
@ -112,6 +115,10 @@ ifdef GUILE_TOOLS
export GUILE_TOOLS export GUILE_TOOLS
endif endif
ifdef TCC
export TCC
endif
ifdef GUILE_LOAD_PATH ifdef GUILE_LOAD_PATH
export GUILE_LOAD_PATH export GUILE_LOAD_PATH
endif endif

View file

@ -25,7 +25,7 @@ if [ -n "$BUILD_DEBUG" ]; then
fi fi
MODULEDIR=${MODULEDIR-${DATADIR}${DATADIR:+/}module} MODULEDIR=${MODULEDIR-${DATADIR}${DATADIR:+/}module}
export CC32 CPPFLAGS C32FLAGS export CC32 TCC CPPFLAGS C32FLAGS
CC32=${CC32-$(command -v i686-unknown-linux-gnu-gcc)} CC32=${CC32-$(command -v i686-unknown-linux-gnu-gcc)}
build-aux/mes-snarf.scm --mes src/gc.c build-aux/mes-snarf.scm --mes src/gc.c
@ -54,7 +54,7 @@ CPPFLAGS=${CPPFLAGS-"
"} "}
C32FLAGS=${C32FLAGS-" C32FLAGS=${C32FLAGS-"
--std=gnu99 -std=gnu99
-O0 -O0
-fno-stack-protector -fno-stack-protector
-g -g
@ -63,24 +63,24 @@ C32FLAGS=${C32FLAGS-"
-nostdlib -nostdlib
"} "}
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/crt0 ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crt0
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/crt1 ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crt1
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/crti ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crti
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/crtn ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/crtn
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc-mini ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libc-mini
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libc
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libgetopt ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libgetopt
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc+tcc ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libc+tcc
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libtcc1 ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libtcc1
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc+gnu ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libc+gnu
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libg ARCHDIR=1 NOLINK=1 sh build-aux/cc32-mes.sh lib/libg
sh build-aux/cc-mes-gcc.sh scaffold/main sh build-aux/cc32-mes.sh scaffold/main
sh build-aux/cc-mes-gcc.sh scaffold/hello sh build-aux/cc32-mes.sh scaffold/hello
sh build-aux/cc-mes-gcc.sh scaffold/argv sh build-aux/cc32-mes.sh scaffold/argv
sh build-aux/cc-mes-gcc.sh scaffold/malloc sh build-aux/cc32-mes.sh scaffold/malloc
sh build-aux/cc-mes-gcc.sh scaffold/micro-mes sh build-aux/cc32-mes.sh scaffold/micro-mes
sh build-aux/cc-mes-gcc.sh scaffold/tiny-mes sh build-aux/cc32-mes.sh scaffold/tiny-mes
sh build-aux/cc-mes-gcc.sh scaffold/mini-mes sh build-aux/cc32-mes.sh scaffold/mini-mes
sh build-aux/cc-mes-gcc.sh src/mes sh build-aux/cc32-mes.sh src/mes

View file

@ -34,7 +34,7 @@ CPPFLAGS=${CPPFLAGS-"
"} "}
C32FLAGS=${C32FLAGS-" C32FLAGS=${C32FLAGS-"
--std=gnu99 -std=gnu99
-O0 -O0
-fno-builtin -fno-builtin
-fno-stack-protector -fno-stack-protector
@ -44,20 +44,28 @@ C32FLAGS=${C32FLAGS-"
-nostdlib -nostdlib
"} "}
LIBC=${LIBC-c} LIBC=${LIBC-c}
a=mes-gcc
if [ "$CC32" = "$TCC" ]; then
a=mes-tcc
LIBC=c+tcc # tcc bug with undefined symbols
fi
arch=x86-$a
if [ -n "$LIBC" ]; then if [ -n "$LIBC" ]; then
CC32LIBS="lib/x86-mes-gcc/lib$LIBC.o" CC32LIBS="lib/$arch/lib$LIBC.o"
fi fi
c=$1 c=$1
if [ -z "$ARCHDIR" ]; then if [ -z "$ARCHDIR" ]; then
o="$c" o="$c"
p="mes-gcc-" p="$a-"
else else
b=${c##*/} b=${c##*/}
d=${c%/*} d=${c%/*}
o="$d/x86-mes-gcc/$b" o="$d/$arch/$b"
mkdir -p $d/x86-mes-gcc mkdir -p $d/$arch
fi fi
$CC32\ $CC32\
@ -71,7 +79,7 @@ if [ -z "$NOLINK" ]; then
$CC32\ $CC32\
$C32FLAGS\ $C32FLAGS\
-o "$o".${p}out\ -o "$o".${p}out\
lib/x86-mes-gcc/crt1.o\ lib/$arch/crt1.o\
"$o".${p}o\ "$o".${p}o\
$CC32LIBS $CC32LIBS
fi fi

View file

@ -54,7 +54,7 @@ fi
rm -f "$t".mes-gcc-out rm -f "$t".mes-gcc-out
if [ -n "$CC32" ]; then if [ -n "$CC32" ]; then
sh build-aux/cc-mes-gcc.sh "$t" sh build-aux/cc32-mes.sh "$t"
r=0 r=0
[ -f "$t".exit ] && r=$(cat "$t".exit) [ -f "$t".exit ] && r=$(cat "$t".exit)

View file

@ -23,7 +23,7 @@ if [ -n "$BUILD_DEBUG" ]; then
fi fi
# dash does not export foo=${foo-bar} for some values # dash does not export foo=${foo-bar} for some values
export CC CC32 GUILE MESCC MES_SEED export CC CC32 TCC GUILE MESCC MES_SEED
export MES_ARENA MES_DEBUG export MES_ARENA MES_DEBUG
export PREFIX DATADIR MODULEDIR export PREFIX DATADIR MODULEDIR
export CPPFLAGS CFLAGS C32FLAGS MESCCFLAGS export CPPFLAGS CFLAGS C32FLAGS MESCCFLAGS
@ -86,8 +86,13 @@ if [ -n "$CC" ]; then
fi fi
if [ -n "$CC32" ]; then if [ -n "$CC32" ]; then
sh build-aux/build-mes-gcc.sh sh build-aux/build-cc32.sh
cp src/mes.mes-gcc-out src/mes cp src/mes.mes-gcc-out src/mes
fi fi
if [ -n "$TCC" ]; then
CC32=$TCC sh build-aux/build-cc32.sh
cp src/mes.mes-tcc-out src/mes
fi
sh build-aux/build-mes.sh sh build-aux/build-mes.sh

5
configure vendored
View file

@ -224,6 +224,7 @@ Some influential environment variables:
GUILE_TOOLS guile-tools command GUILE_TOOLS guile-tools command
MES_SEED location of mes-seed MES_SEED location of mes-seed
MESCC_TOOLS_SEED location of mescc-tools-seed MESCC_TOOLS_SEED location of mescc-tools-seed
TCC tcc C compiler command
TINYCC_SEED location of tinycc-seed TINYCC_SEED location of tinycc-seed
" PACKAGE VERSION (getenv "PREFIX"))) " PACKAGE VERSION (getenv "PREFIX")))
@ -245,6 +246,7 @@ Some influential environment variables:
(let ((CC32 (or (getenv "CC32") (let ((CC32 (or (getenv "CC32")
(if (member ARCH '("i686" "arm")) (string-append BUILD_TRIPLET "-" CC) (if (member ARCH '("i686" "arm")) (string-append BUILD_TRIPLET "-" CC)
"i686-unknown-linux-gnu-gcc"))) "i686-unknown-linux-gnu-gcc")))
(TCC (or (getenv "TCC") "tcc"))
(GUILE_TOOLS (or (getenv "GUILE_TOOLS") "guile-tools")) (GUILE_TOOLS (or (getenv "GUILE_TOOLS") "guile-tools"))
(BLOOD_ELF (or (getenv "BLOOD_ELF") "blood-elf")) (BLOOD_ELF (or (getenv "BLOOD_ELF") "blood-elf"))
(HEX2 (or (getenv "HEX2") "hex2")) (HEX2 (or (getenv "HEX2") "hex2"))
@ -281,6 +283,8 @@ Some influential environment variables:
(check-header-c "limits.h" "linux-headers")) (check-header-c "limits.h" "linux-headers"))
(if (not (check-version CC32 '(4 8) #:optional? #t)) (if (not (check-version CC32 '(4 8) #:optional? #t))
(set! CC32 #f)) (set! CC32 #f))
(if (not (check-version TCC '(0 9 26) #:optional? #t #:version-option "-v"))
(set! TCC #f))
(set! make? (check-version "make" '(4 0) #:optional? #t)) (set! make? (check-version "make" '(4 0) #:optional? #t))
(check-version "perl" '(5)) (check-version "perl" '(5))
@ -298,6 +302,7 @@ Some influential environment variables:
(stdout "ARCH:=~a\n" ARCH) (stdout "ARCH:=~a\n" ARCH)
(stdout "CC:=~a\n" (or CC "")) (stdout "CC:=~a\n" (or CC ""))
(stdout "CC32:=~a\n" (or CC32 "")) (stdout "CC32:=~a\n" (or CC32 ""))
(stdout "TCC:=~a\n" (or TCC ""))
(stdout "BLOOD_ELF:=~a\n" (or BLOOD_ELF "")) (stdout "BLOOD_ELF:=~a\n" (or BLOOD_ELF ""))
(stdout "MES_SEED:=~a\n" (or MES_SEED "")) (stdout "MES_SEED:=~a\n" (or MES_SEED ""))
(stdout "MESCC_TOOLS_SEED:=~a\n" (or MESCC_TOOLS_SEED "")) (stdout "MESCC_TOOLS_SEED:=~a\n" (or MESCC_TOOLS_SEED ""))

View file

@ -21,43 +21,7 @@
char **environ = 0; char **environ = 0;
int main (int argc, char *argv[]); int main (int argc, char *argv[]);
#if __GNUC__ #if __MESC__
void
_start ()
{
asm (
"mov %%ebp,%%eax\n\t"
"addl $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"addl $3,%%eax\n\t"
"shl $2,%%eax\n\t"
"add %%ebp,%%eax\n\t"
"movl %%eax,%0\n\t"
: "=environ" (environ)
: //no inputs ""
);
asm (
"mov %%ebp,%%eax\n\t"
"addl $8,%%eax\n\t"
"push %%eax\n\t"
"mov %%ebp,%%eax\n\t"
"addl $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"push %%eax\n\t"
"call main\n\t"
"mov %%eax,%%ebx\n\t"
"mov $1,%%eax\n\t"
"int $0x80\n\t"
"hlt \n\t"
:
);
}
#elif __MESC__
int int
_start () _start ()
@ -89,4 +53,39 @@ _start ()
asm ("hlt"); asm ("hlt");
} }
#endif #else // !__MESC__
void
_start ()
{
asm (
"mov %%ebp,%%eax\n\t"
"add $4,%%eax\n\t"
"movzbl (%%eax),%%eax\n\t"
"add $3,%%eax\n\t"
"shl $2,%%eax\n\t"
"add %%ebp,%%eax\n\t"
"mov %%eax,%0\n\t"
: "=r" (environ)
: //no inputs ""
);
asm (
"mov %ebp,%eax\n\t"
"add $8,%eax\n\t"
"push %eax\n\t"
"mov %ebp,%eax\n\t"
"add $4,%eax\n\t"
"movzbl (%eax),%eax\n\t"
"push %eax\n\t"
"call main\n\t"
"mov %eax,%ebx\n\t"
"mov $1,%eax\n\t"
"int $0x80\n\t"
"hlt \n\t"
);
}
#endif // !__MESC__

View file

@ -112,7 +112,15 @@ __fixunsxfdi (double a1)
return 0; return 0;
} }
unsigned long long #if __TINYC__ == 9227
int
#if __TINYC__ == 9226
long
#else
long long
int
#endif // __TINYC__ == 9226
#endif // __TINYC__ == 9227
__fixdfdi (double a1) __fixdfdi (double a1)
{ {
static int stub = 0; static int stub = 0;
@ -132,7 +140,7 @@ __fixxfdi (double a1)
return 0; return 0;
} }
unsigned long long long long
__fixsfdi (double a1) __fixsfdi (double a1)
{ {
static int stub = 0; static int stub = 0;

View file

@ -23,14 +23,13 @@
int int
_sys_call (int sys_call) _sys_call (int sys_call)
{ {
#if !__TINYC__
int r; int r;
asm ( asm (
"mov %1,%%eax\n\t" "mov %1,%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
: "" (sys_call) : "rm" (sys_call)
: "eax" : "eax"
); );
if (r < 0) if (r < 0)
@ -41,13 +40,11 @@ _sys_call (int sys_call)
else else
errno = 0; errno = 0;
return r; return r;
#endif
} }
int int
_sys_call1 (int sys_call, int one) _sys_call1 (int sys_call, int one)
{ {
#if !__TINYC__
int r; int r;
asm ( asm (
"mov %1,%%eax\n\t" "mov %1,%%eax\n\t"
@ -55,7 +52,7 @@ _sys_call1 (int sys_call, int one)
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
: "" (sys_call), "" (one) : "rm" (sys_call), "rm" (one)
: "eax", "ebx" : "eax", "ebx"
); );
if (r < 0) if (r < 0)
@ -66,13 +63,11 @@ _sys_call1 (int sys_call, int one)
else else
errno = 0; errno = 0;
return r; return r;
#endif
} }
int int
_sys_call2 (int sys_call, int one, int two) _sys_call2 (int sys_call, int one, int two)
{ {
#if !__TINYC__
int r; int r;
asm ( asm (
"mov %1,%%eax\n\t" "mov %1,%%eax\n\t"
@ -81,7 +76,7 @@ _sys_call2 (int sys_call, int one, int two)
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
: "" (sys_call), "" (one), "" (two) : "rm" (sys_call), "rm" (one), "rm" (two)
: "eax", "ebx", "ecx" : "eax", "ebx", "ecx"
); );
if (r < 0) if (r < 0)
@ -92,13 +87,11 @@ _sys_call2 (int sys_call, int one, int two)
else else
errno = 0; errno = 0;
return r; return r;
#endif
} }
int int
_sys_call3 (int sys_call, int one, int two, int three) _sys_call3 (int sys_call, int one, int two, int three)
{ {
#if !__TINYC__
int r; int r;
asm ( asm (
"mov %2,%%ebx\n\t" "mov %2,%%ebx\n\t"
@ -108,7 +101,7 @@ _sys_call3 (int sys_call, int one, int two, int three)
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
: "" (sys_call), "" (one), "" (two), "" (three) : "rm" (sys_call), "rm" (one), "rm" (two), "rm" (three)
: "eax", "ebx", "ecx", "edx" : "eax", "ebx", "ecx", "edx"
); );
if (r < 0) if (r < 0)
@ -119,5 +112,4 @@ _sys_call3 (int sys_call, int one, int two, int three)
else else
errno = 0; errno = 0;
return r; return r;
#endif
} }

View file

@ -24,23 +24,13 @@
void void
_exit (int code) _exit (int code)
{ {
#if !__TINYC__
asm ( asm (
"mov $"SYS_exit",%%eax\n\t" "mov $"SYS_exit",%%eax\n\t"
"mov %0,%%ebx\n\t" "mov %0,%%ebx\n\t"
"int $0x80\n\t" "int $0x80\n\t"
: // no outputs "=" (r) : // no outputs "=" (r)
: "" (code) : "rm" (code)
); );
#else // __TINYC__
asm (
"mov $"SYS_exit",%%eax\n\t"
"mov %0,%%ebx\n\t"
"int $128\n\t"
: // no outputs "=" (r)
: "Ir" (code)
);
#endif // __TINYC__
// not reached // not reached
_exit (0); _exit (0);
} }
@ -49,7 +39,6 @@ ssize_t
_write (int filedes, void const *buffer, size_t size) _write (int filedes, void const *buffer, size_t size)
{ {
int r; int r;
#if __GNUC__
asm ( asm (
"mov $"SYS_write",%%eax\n\t" "mov $"SYS_write",%%eax\n\t"
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
@ -58,21 +47,8 @@ _write (int filedes, void const *buffer, size_t size)
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
: "" (filedes), "" (buffer), "" (size) : "rm" (filedes), "rm" (buffer), "rm" (size)
: "eax", "ebx", "ecx", "edx" : "eax", "ebx", "ecx", "edx"
); );
#elif __TINYC__
asm (
"mov $"SYS_write",%%eax\n\t"
"mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t"
"int $128\n\t"
"mov %%eax,%0\n\t"
: "=r" (r)
: "Ir" (filedes), "Ir" (buffer), "Ir" (size)
: "eax", "ebx", "ecx"//, "edx"
);
#endif
return r; return r;
} }