OSDN Git Service

wrap _exit() in tesglue.c
authornickc <nickc>
Sun, 14 Apr 2002 08:27:53 +0000 (08:27 +0000)
committernickc <nickc>
Sun, 14 Apr 2002 08:27:53 +0000 (08:27 +0000)
dejagnu/ChangeLog
dejagnu/lib/libgloss.exp
dejagnu/testglue.c

index 929052d..7fc6d7e 100644 (file)
@@ -1,3 +1,17 @@
+2002-04-14  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * lib/libgloss.exp (build_wrapper): Wrap _exit too, unless
+       wrap_m68k_aout, uses_underscores or is_vxworks are defined in
+       target_info.
+
+       * testglue.c [!VXWORKS && !UNDERSCORES && !WRAP_M68K_AOUT]
+       (REAL__EXIT): Define.
+       [!UNDERSCORES && !WRAP_M68K_AOUT] (ORIG__EXIT): Define.
+       [REAL__EXIT] (REAL__EXIT): Prototype.
+       [ORIG__EXIT] (ORIG__EXIT): New function wrapper.
+       (done_exit_message): New static variable.
+       (ORIG_EXIT): Set done_exit_message.
+
 2002-03-15  Chris Demetriou  <cgd@broadcom.com>
 
        * baseboards/mips-sim-idt32.exp: New file.
index e9c6cf8..b3787c1 100644 (file)
@@ -820,8 +820,10 @@ proc build_wrapper { gluefile } {
        set flags "";
        if [target_info exists is_vxworks] {
            set flags "additional_flags=-DVXWORKS";
+           set result "-Wl,-wrap,exit -Wl,-wrap,main -Wl,-wrap,abort";
+       } else {
+           set result "-Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main -Wl,-wrap,abort";
        }
-       set result "-Wl,-wrap,exit -Wl,-wrap,main -Wl,-wrap,abort";
     }
     if [target_info exists wrap_compile_flags] {
        lappend flags "additional_flags=[target_info wrap_compile_flags]";
index 3d2b272..a3cd2c7 100644 (file)
@@ -12,7 +12,8 @@
    because currently GNU ld doesn't deal well with a.out targets and
    the -wrap option. When GNU ld is fixed, this should definitely be
    removed. Note that we actually wrap __exit, not _exit on a target
-   that has UNDERSCORES defined. */
+   that has UNDERSCORES defined.  On non-UNDERSCORE targets, we
+   wrap _exit separately; it's actually a different function.  */
 
 #ifdef WRAP_M68K_AOUT
 #define REAL_EXIT(code) asm ( "trap %0" : : "i" (0) );
 #define ORIG_MAIN _wrap__main
 #else
 #define REAL_EXIT __real_exit
+#ifndef VXWORKS
+#define REAL__EXIT __real__exit
+#endif
 #define REAL_MAIN __real_main
 #define REAL_ABORT __real_abort
 #define ORIG_EXIT __wrap_exit
+#define ORIG__EXIT __wrap__exit
 #define ORIG_ABORT __wrap_abort
 #define ORIG_MAIN __wrap_main
 #endif
@@ -42,6 +47,11 @@ extern void REAL_EXIT ();
 extern void REAL_ABORT ();
 extern int REAL_MAIN (int argc, char **argv, char **envp);
 #endif
+#ifdef REAL__EXIT
+extern void REAL__EXIT ();
+#endif
+
+static int done_exit_message = 0;
 
 int ___constval = 1;
 
@@ -81,10 +91,33 @@ ORIG_EXIT (code)
   ptr = write_int (code, buf + strlen(buf));
   *(ptr++) = '\n';
   write (1, buf, ptr-buf);
+  done_exit_message = 1;
   REAL_EXIT (code);
   while (___constval);
 }
 
+#ifdef ORIG__EXIT
+void
+ORIG__EXIT (code)
+     int code;
+{
+  char buf[30];
+  char *ptr;
+
+  /* Since exit may call _exit, we need to avoid a second message.  */
+  if (! done_exit_message)
+    {
+      strcpy (buf, "\n*** EXIT code ");
+      ptr = write_int (code, buf + strlen(buf));
+      *(ptr++) = '\n';
+      write (1, buf, ptr-buf);
+    }
+
+  REAL__EXIT (code);
+  while (___constval);
+}
+#endif
+
 void
 ORIG_ABORT ()
 {