mescc: Mes C Library: Add x86_64 libc+tcc support.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 11 Aug 2018 16:39:48 +0000 (18:39 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 11 Aug 2018 16:39:48 +0000 (18:39 +0200)
* include/linux/x86/syscall.h: Move SYS_ defines from tcc.c.
* include/linux/x86_64/syscall.h: Add SYS_ defines for tcc.
* lib/x86-mes-gcc/setjmp.c: Rename from lib/libc+tcc-gcc.c
* lib/x86-mes/setjmp.c: Rename from lib/libc+tcc-mes.c
* lib/linux/tcc.c: Update.

.gitignore
build-aux/build-cc.sh
include/linux/x86/syscall.h
include/linux/x86_64/syscall.h
lib/libc+tcc-gcc.c [deleted file]
lib/libc+tcc-mes.c [deleted file]
lib/libc+tcc.c
lib/linux/tcc.c
lib/x86-mes-gcc/setjmp.c [new file with mode: 0644]
lib/x86-mes/setjmp.c [new file with mode: 0644]
lib/x86_64-mes-gcc/setjmp.c [new file with mode: 0644]

index 3a7e009af17e9ab14a775901279b89ad5384602d..c3fc54c5abede5ecdc8454f4d57748f402ebdf91 100644 (file)
@@ -41,8 +41,6 @@
 *.x86_64-out
 
 
-/lib/x86-mes-gcc
-/lib/x86-mes-tcc
 /src/*.h
 /src/*.i
 /src/mes
index 596dc7e3f620a8bd077b65e4012817c425ec6af0..3c4efd5924103d6cd91462750af36d3b7c0b91d2 100755 (executable)
@@ -53,11 +53,11 @@ ARCHDIR=1 NOLINK=1 sh ${srcdest}build-aux/cc64-mes.sh lib/linux/x86_64-mes-gcc/c
 # 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
+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
 
 sh ${srcdest}build-aux/cc64-mes.sh scaffold/main
 sh ${srcdest}build-aux/cc64-mes.sh scaffold/hello
index 7c06bd3866ae3719b0a958d816e0d283f3a1f4c7..aa8bca28eda76665b2bc1a77c482d9437a23c0d4 100644 (file)
 #ifndef __MES_LINUX_X86_SYSCALL_H
 #define __MES_LINUX_X86_SYSCALL_H 1
 
+// libc-mini
 // #define SYS_exit    0x01
 // #define SYS_write   0x04
 
+// libc
 #define SYS_fork    0x02
 #define SYS_read    0x03
 #define SYS_open    0x05
 #define SYS_ioctl   0x36
 #define SYS_fsync   0x76
 
+// libc+tcc
+#define SYS_close  0x06
+#define SYS_lseek  0x13
+#define SYS_unlink 0x0a
+#define SYS_rmdir  0x28
+#define SYS_stat   0x6a
+#define SYS_getcwd 0xb7
+
 #endif // __MES_LINUX_X86_SYSCALL_H
index b0630dd12541b03ddf6c8c797b5f4d6766a730a6..c8846d733a4242e3a37d251f6d8eebfbb6e98af4 100644 (file)
 #ifndef __MES_LINUX_X86_64_SYSCALL_H
 #define __MES_LINUX_X86_64_SYSCALL_H 1
 
+// libc-mini
 // #define SYS_write   0x01
 // #define SYS_exit    0x3c
 
+// libc
 #define SYS_fork    0x39
 #define SYS_read    0x00
 #define SYS_open    0x02
 #define SYS_ioctl   0x10
 #define SYS_fsync   0x4a
 
+// libc+tcc
+#define SYS_close  0x03
+#define SYS_lseek  0x08
+#define SYS_unlink 0x57
+#define SYS_rmdir  0x54
+#define SYS_stat   0x04
+#define SYS_getcwd 0x4f
+
 #endif // __MES_LINUX_X86_64_SYSCALL_H
diff --git a/lib/libc+tcc-gcc.c b/lib/libc+tcc-gcc.c
deleted file mode 100644 (file)
index 050e227..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*-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/>.
- */
-
-#include <setjmp.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-int errno;
-
-void
-longjmp (jmp_buf env, int val)
-{
-  val = val == 0 ? 1 : val;
-  asm ("mov    0xc(%ebp),%eax\n\t"     // val
-       "mov    0x8(%ebp),%ebp\n\t"     // env*
-
-       "mov    0x4(%ebp),%ebx\n\t"     // env->__pc
-       "mov    0x8(%ebp),%esp\n\t"     // env->__sp
-       "mov    0x0(%ebp),%ebp\n\t"     // env->__bp
-       "jmp    *%ebx\n\t"              // jmp *PC
-       );
-  // not reached
-  exit (42);
-}
-
-#if 0
-int
-setjmp_debug (jmp_buf env, int val)
-{
-  int i;
-#if 1
-  i = env->__bp;
-  i = env->__pc;
-  i = env->__sp;
-#else
-  i = env[0].__bp;
-  i = env[0].__pc;
-  i = env[0].__sp;
-#endif
-  return val == 0 ? 1 : val;
-}
-#endif
-
-int
-setjmp (jmp_buf env)
-{
-  int *p = (int*)&env;
-  env[0].__bp = p[-2];
-  env[0].__pc = p[-1];
-  env[0].__sp = (int)&env;
-  return 0;
-}
diff --git a/lib/libc+tcc-mes.c b/lib/libc+tcc-mes.c
deleted file mode 100644 (file)
index cfca1ec..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/* -*-comment-start: "//";comment-end:""-*-
- * GNU Mes --- Maxwell Equations of Software
- * Copyright © 2017 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/>.
- */
-
-#include <setjmp.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-int errno;
-
-void
-longjmp (jmp_buf env, int val)
-{
-  val = val == 0 ? 1 : val;
-  asm ("mov____0x8(%ebp),%eax !0x0c"); // val
-  asm ("mov____0x8(%ebp),%ebp !0x08"); // env*
-
-  asm ("mov____0x8(%ebp),%ebx !0x4");  // env.__pc
-  asm ("mov____0x8(%ebp),%esp !0x8");  // env.__sp
-  asm ("mov____0x8(%ebp),%ebp !0x0");  // env.__bp
-  asm ("jmp____*%ebx");
-  // not reached
-  exit (42);
-}
-
-#if 0
-int
-setjmp_debug (jmp_buf env, int val)
-{
-  int i;
-#if 1
-  i = env->__bp;
-  i = env->__pc;
-  i = env->__sp;
-#else
-  i = env[0].__bp;
-  i = env[0].__pc;
-  i = env[0].__sp;
-#endif
-  return val == 0 ? 1 : val;
-}
-#endif
-
-int
-setjmp (__jmp_buf *env)
-{
-  int *p = (int*)&env;
-  env[0].__bp = p[-2];
-  env[0].__pc = p[-1];
-  env[0].__sp = (int)&env;
-  return 0;
-}
index 46168ae7d1812e436f8aa7a7acaa41264095289a..d19d736397389272f138f1f4296ec69159c00d94 100644 (file)
 #endif
 
 #if __MESC__
-
-#include <libc+tcc-mes.c>
-
-#else // !__MESC__
-
-#include <libc+tcc-gcc.c>
-
-#endif // !__MESC__
+#include <x86-mes/setjmp.c>
+#elif __i386__
+#include <x86-mes-gcc/setjmp.c>
+#elif __x86_64__
+#include <x86_64-mes-gcc/setjmp.c>
+#else
+#error arch not supported
+#endif
 
 char *
 search_path (char const *file_name)
index 8efc4719d6a30f8cb17700855756b5d54ddcaf06..07aec9e89e7862c6f0873971eeef9c13bee2e752 100644 (file)
  * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#define SYS_close  0x06
-#define SYS_lseek  0x13
-#define SYS_unlink 0x0a
-#define SYS_rmdir  0x28
-#define SYS_stat   0x6a
-#define SYS_getcwd 0xb7
-
 int
 close (int filedes)
 {
diff --git a/lib/x86-mes-gcc/setjmp.c b/lib/x86-mes-gcc/setjmp.c
new file mode 100644 (file)
index 0000000..050e227
--- /dev/null
@@ -0,0 +1,76 @@
+/* -*-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/>.
+ */
+
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+int errno;
+
+void
+longjmp (jmp_buf env, int val)
+{
+  val = val == 0 ? 1 : val;
+  asm ("mov    0xc(%ebp),%eax\n\t"     // val
+       "mov    0x8(%ebp),%ebp\n\t"     // env*
+
+       "mov    0x4(%ebp),%ebx\n\t"     // env->__pc
+       "mov    0x8(%ebp),%esp\n\t"     // env->__sp
+       "mov    0x0(%ebp),%ebp\n\t"     // env->__bp
+       "jmp    *%ebx\n\t"              // jmp *PC
+       );
+  // not reached
+  exit (42);
+}
+
+#if 0
+int
+setjmp_debug (jmp_buf env, int val)
+{
+  int i;
+#if 1
+  i = env->__bp;
+  i = env->__pc;
+  i = env->__sp;
+#else
+  i = env[0].__bp;
+  i = env[0].__pc;
+  i = env[0].__sp;
+#endif
+  return val == 0 ? 1 : val;
+}
+#endif
+
+int
+setjmp (jmp_buf env)
+{
+  int *p = (int*)&env;
+  env[0].__bp = p[-2];
+  env[0].__pc = p[-1];
+  env[0].__sp = (int)&env;
+  return 0;
+}
diff --git a/lib/x86-mes/setjmp.c b/lib/x86-mes/setjmp.c
new file mode 100644 (file)
index 0000000..99bdd30
--- /dev/null
@@ -0,0 +1,75 @@
+/* -*-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/>.
+ */
+
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+int errno;
+
+void
+longjmp (jmp_buf env, int val)
+{
+  val = val == 0 ? 1 : val;
+  asm ("mov____0x8(%ebp),%eax !0x0c"); // val
+  asm ("mov____0x8(%ebp),%ebp !0x08"); // env*
+
+  asm ("mov____0x8(%ebp),%ebx !0x4");  // env.__pc
+  asm ("mov____0x8(%ebp),%esp !0x8");  // env.__sp
+  asm ("mov____0x8(%ebp),%ebp !0x0");  // env.__bp
+  asm ("jmp____*%ebx");
+  // not reached
+  exit (42);
+}
+
+#if 0
+int
+setjmp_debug (jmp_buf env, int val)
+{
+  int i;
+#if 1
+  i = env->__bp;
+  i = env->__pc;
+  i = env->__sp;
+#else
+  i = env[0].__bp;
+  i = env[0].__pc;
+  i = env[0].__sp;
+#endif
+  return val == 0 ? 1 : val;
+}
+#endif
+
+int
+setjmp (__jmp_buf *env)
+{
+  int *p = (int*)&env;
+  env[0].__bp = p[-2];
+  env[0].__pc = p[-1];
+  env[0].__sp = (long)&env;
+  return 0;
+}
diff --git a/lib/x86_64-mes-gcc/setjmp.c b/lib/x86_64-mes-gcc/setjmp.c
new file mode 100644 (file)
index 0000000..ae37263
--- /dev/null
@@ -0,0 +1,75 @@
+/* -*-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/>.
+ */
+
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+int errno;
+
+void
+longjmp (jmp_buf env, int val)
+{
+  val = val == 0 ? 1 : val;
+  asm ("mov    %esi,%eax\n\t"           // val
+
+       "mov    0x00(%rdi),%rbp\n\t"     // env->__bp
+       "mov    0x08(%rdi),%rbx\n\t"     // env->__pc
+       "mov    0x16(%rdi),%rsp\n\t"     // env->__sp
+       "jmp    *%rbx\n\t"               // jmp *PC
+       );
+  // not reached
+  exit (42);
+}
+
+#if 0
+int
+setjmp_debug (jmp_buf env, int val)
+{
+  int i;
+#if 1
+  i = env->__bp;
+  i = env->__pc;
+  i = env->__sp;
+#else
+  i = env[0].__bp;
+  i = env[0].__pc;
+  i = env[0].__sp;
+#endif
+  return val == 0 ? 1 : val;
+}
+#endif
+
+int
+setjmp (jmp_buf env)
+{
+  int *p = (int*)&env;
+  env[0].__bp = p[-2];
+  env[0].__pc = p[-1];
+  env[0].__sp = (long)&env;
+  return 0;
+}