+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.
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]";
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
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;
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 ()
{