mescc: Support gcc-3.0: Implement atexit.
authorJan Nieuwenhuizen <janneke@gnu.org>
Thu, 7 Jun 2018 16:02:21 +0000 (18:02 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Thu, 7 Jun 2018 16:02:21 +0000 (18:02 +0200)
include/stdlib.h
include/unistd.h
lib/gcc.c
lib/linux-mini-gcc.c
lib/linux-mini-mes.c

index 1c747e4bc8c069b928467f87a3ff3bde6492be10..46cbd2864feafa839b2978825ee6b36efe048fac 100644 (file)
@@ -40,8 +40,10 @@ void * alloca (unsigned size);
 void * alloca (size_t size);
 #endif
 int atoi (char const *s);
+int atexit (void (*function) (void));
 void * calloc (size_t nmemb, size_t size);
-void exit (int);
+void _exit (int status);
+void exit (int status);
 void free (void *ptr);
 char* getenv (char const* s);
 int setenv (char const* s, char const* v, int overwrite_p);
index 391b19a46048aec59ddac861b5d60d7a226d0694..26632a2b3f7d3f033ce43bc3d0836987b47455ae 100644 (file)
@@ -90,9 +90,6 @@ typedef int pid_t;
 
 int access (char const *s, int mode);
 unsigned int alarm (unsigned int seconds);
-#define alarm(x) {eputs ("alarm x="); eputs (itoa (x)); eputs ("\n"); kill (getpid (), 14);}
-#define atexit(x) eputs ("atexit\n")
-
 int close (int fd);
 int execv (char const *file_name, char *const argv[]);
 int execve (char const *file, char *const argv[], char *const env[]);
index 45fa72fdc3f1009b7f5de06d7c8855109f21e647..e74d505ef5ff35f8006c576e8c209008f54df2c4 100644 (file)
--- a/lib/gcc.c
+++ b/lib/gcc.c
@@ -80,3 +80,11 @@ unsetenv (char const *name)
       p++;
     }
 }
+
+// gcc-3.0
+int
+atexit (void (*function) (void))
+{
+  __call_at_exit = function;
+}
+
index da05ccf419a45ec62eb45ff29bf6b42fd7675000..3fe3829dfcd55545dadb850c988023300c084a6a 100644 (file)
@@ -22,7 +22,7 @@
 #define SYS_write  "0x04"
 
 void
-exit (int code)
+_exit (int code)
 {
 #if !__TINYC__
   asm (
@@ -42,7 +42,17 @@ exit (int code)
        );
 #endif // __TINYC__
   // not reached
-  exit (0);
+  _exit (0);
+}
+
+void (*__call_at_exit) (void);
+
+void
+exit (int code)
+{
+  if (__call_at_exit)
+    (*__call_at_exit) ();
+  _exit (code);
 }
 
 ssize_t
index 349552163309b0a2c21470f8871c1ca2b688fa18..f2858a1f3c199d4502a2093f2735279d8c451001 100644 (file)
  */
 
 void
-exit ()
+_exit ()
 {
   asm ("mov____$i32,%eax SYS_exit");
   asm ("mov____0x8(%ebp),%ebx !8");
   asm ("int____$0x80");
 }
 
+void (*__call_at_exit) (void);
+
+void
+exit (int code)
+{
+  if (__call_at_exit)
+    (*__call_at_exit) ();
+  _exit (code);
+}
+
 void
 write ()
 {