This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

MD_FALLBACK_FRAME_STATE_FOR


This is an implementation of the $SUBJECT macro for x86-64. Bootstrapped and 
regtested on x86-64 with no new failures.

I had hoped that this would remove some of the failures in libstdc++ tests, 
but it didn't do any difference at all. It probably doesn't check for 
exception handling through signal handlers, and that should be the only place 
where this macro is needed on x86-64.

2002-04-24  Bo Thorsen  <bo@suse.de>

	* config/i386/linux64.h: Add an implementation of the
	MD_FALLBACK_FRAME_STATE_FOR macro.

Index: linux64.h
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/config/i386/linux64.h,v
retrieving revision 1.3.10.4
diff -u -r1.3.10.4 linux64.h
--- linux64.h	15 Apr 2002 20:27:27 -0000	1.3.10.4
+++ linux64.h	24 Apr 2002 08:24:58 -0000
@@ -67,3 +67,68 @@
   %{!m32:%{!shared:crtend.o%s} %{shared:crtendS.o%s} /usr/lib64/crtn.o%s}"
 
 #define MULTILIB_DEFAULTS { "m64" }
+
+/* Do code reading to identify a signal frame, and set the frame
+   state data appropriately.  See unwind-dw2.c for the structs.  */
+
+#ifdef IN_LIBGCC2
+#include <signal.h>
+#include <sys/ucontext.h>
+#endif
+
+#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS)		\
+  do {									\
+    unsigned char *pc_ = (CONTEXT)->ra;					\
+    struct sigcontext *sc_;						\
+    long new_cfa_;							\
+									\
+    /* movq __NR_rt_sigreturn, %rax ; syscall  */			\
+    if (*(unsigned char *)(pc_+0) == 0x48				\
+	&& *(unsigned long *)(pc_+1) == 0x050f0000000fc0c7)		\
+      {									\
+	struct ucontext *uc_ = (CONTEXT)->cfa;				\
+	sc_ = (struct sigcontext *) &uc_->uc_mcontext;			\
+      }									\
+    else								\
+      break;								\
+									\
+    new_cfa_ = sc_->rsp;						\
+    (FS)->cfa_how = CFA_REG_OFFSET;					\
+    /* Register 7 is rsp  */						\
+    (FS)->cfa_reg = 7;							\
+    (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa;		\
+									\
+    /* The SVR4 register numbering macros aren't usable in libgcc.  */	\
+    (FS)->regs.reg[0].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[0].loc.offset = (long)&sc_->rax - new_cfa_;		\
+    (FS)->regs.reg[1].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[1].loc.offset = (long)&sc_->rbx - new_cfa_;		\
+    (FS)->regs.reg[2].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[2].loc.offset = (long)&sc_->rcx - new_cfa_;		\
+    (FS)->regs.reg[3].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[3].loc.offset = (long)&sc_->rdx - new_cfa_;		\
+    (FS)->regs.reg[4].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[4].loc.offset = (long)&sc_->rbp - new_cfa_;		\
+    (FS)->regs.reg[5].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[5].loc.offset = (long)&sc_->rsi - new_cfa_;		\
+    (FS)->regs.reg[6].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[6].loc.offset = (long)&sc_->rdi - new_cfa_;		\
+    (FS)->regs.reg[8].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[8].loc.offset = (long)&sc_->r8 - new_cfa_;		\
+    (FS)->regs.reg[9].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[9].loc.offset = (long)&sc_->r9 - new_cfa_;		\
+    (FS)->regs.reg[10].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[10].loc.offset = (long)&sc_->r10 - new_cfa_;		\
+    (FS)->regs.reg[11].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[11].loc.offset = (long)&sc_->r11 - new_cfa_;		\
+    (FS)->regs.reg[12].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[12].loc.offset = (long)&sc_->r12 - new_cfa_;		\
+    (FS)->regs.reg[13].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[13].loc.offset = (long)&sc_->r13 - new_cfa_;		\
+    (FS)->regs.reg[14].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[14].loc.offset = (long)&sc_->r14 - new_cfa_;		\
+    (FS)->regs.reg[15].how = REG_SAVED_OFFSET;				\
+    (FS)->regs.reg[15].loc.offset = (long)&sc_->r15 - new_cfa_;		\
+    (FS)->retaddr_column = 16;						\
+    goto SUCCESS;							\
+  } while (0)


-- 

     Bo Thorsen                 |   Praestevejen 4
     Free software developer    |   5290 Marslev
     SuSE Labs                  |   Denmark


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]