This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
update Darwin unwind-fallback logic for Leopard
- From: gkeating at apple dot com (Geoffrey Keating)
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 13 Mar 2007 00:17:21 -0700 (PDT)
- Subject: update Darwin unwind-fallback logic for Leopard
This patch updates darwin-fallback.c to handle Leopard's slightly
different system call code. It's primarily a precaution in case a
better solution doesn't make it in.
(I also deleted the HAS_MD_FALLBACK_FRAME_STATE_FOR macro, which
appears to never be used.)
Bootstrapped & tested on powerpc-darwin9; all the cleanup tests now
pass!
--
- Geoffrey Keating <geoffk@apple.com>
===File ~/patches/rs6000-darwin-unwindleopard.patch=========
2007-03-11 Geoffrey Keating <geoffk@apple.com>
* config/rs6000/darwin-fallback.c: Compile file only on powerpc.
(handle_syscall): Handle direct system calls.
* config/rs6000/darwin.h (HAS_MD_FALLBACK_FRAME_STATE_FOR): Delete.
Index: config/rs6000/darwin.h
===================================================================
--- config/rs6000/darwin.h (revision 122823)
+++ config/rs6000/darwin.h (working copy)
@@ -412,8 +412,6 @@
#define MD_UNWIND_SUPPORT "config/rs6000/darwin-unwind.h"
#endif
-#define HAS_MD_FALLBACK_FRAME_STATE_FOR 1
-
/* True, iff we're generating fast turn around debugging code. When
true, we arrange for function prologues to start with 5 nops so
that gdb may insert code to redirect them, and for data to be
Index: config/rs6000/darwin-fallback.c
===================================================================
--- config/rs6000/darwin-fallback.c (revision 122823)
+++ config/rs6000/darwin-fallback.c (working copy)
@@ -1,5 +1,5 @@
/* Fallback frame-state unwinder for Darwin.
- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of GCC.
@@ -27,6 +27,8 @@
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
+#ifdef __ppc__
+
#include "tconfig.h"
#include "tsystem.h"
#include "coretypes.h"
@@ -327,9 +329,9 @@
static _Unwind_Ptr return_addr;
/* Yay! We're in a Libc that we understand, and it's made a
- system call. It'll be one of two kinds: either a Jaguar-style
- SYS_sigreturn, or a Panther-style 'syscall' call with 184, which
- is also SYS_sigreturn. */
+ system call. In Jaguar, this is a direct system call with value 103;
+ in Panther and Tiger it is a SYS_syscall call for system call number 184,
+ and in Leopard it is a direct syscall with number 184. */
if (gprs[0] == 0x67 /* SYS_SIGRETURN */)
{
@@ -339,7 +341,7 @@
is_64 = (uctx->mcsize == UC_FLAVOR64_VEC_SIZE
|| uctx->mcsize == UC_FLAVOR64_SIZE);
}
- else if (gprs[0] == 0 && gprs[3] == 184)
+ else if (gprs[0] == 0 /* SYS_syscall */ && gprs[3] == 184)
{
int ctxstyle = gprs[5];
uctx = (struct gcc_ucontext *) gprs[4];
@@ -348,6 +350,15 @@
is_64 = (ctxstyle == UC_FLAVOR64_VEC || ctxstyle == UC_TRAD64_VEC
|| ctxstyle == UC_FLAVOR64 || ctxstyle == UC_TRAD64);
}
+ else if (gprs[0] == 184 /* SYS_sigreturn */)
+ {
+ int ctxstyle = gprs[4];
+ uctx = (struct gcc_ucontext *) gprs[3];
+ is_vector = (ctxstyle == UC_FLAVOR_VEC || ctxstyle == UC_FLAVOR64_VEC
+ || ctxstyle == UC_TRAD_VEC || ctxstyle == UC_TRAD64_VEC);
+ is_64 = (ctxstyle == UC_FLAVOR64_VEC || ctxstyle == UC_TRAD64_VEC
+ || ctxstyle == UC_FLAVOR64 || ctxstyle == UC_TRAD64);
+ }
else
return false;
@@ -469,3 +480,4 @@
return false;
return handle_syscall (fs, gprs, _Unwind_GetCFA (context));
}
+#endif
============================================================