Update MD_FALLBACK_FRAME_STATE_FOR for VMS

Richard Kenner kenner@vlsi1.ultra.nyu.edu
Wed Feb 13 07:51:00 GMT 2002


2002-02-13  Douglas B Rupp  <rupp@gnat.com>

	* config/alpha/vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle
	register frame procedures. Optimize retrieving context.

*** config/alpha/vms.h.1	Thu Jan 10 18:55:16 2002
--- config/alpha/vms.h	Sat Jan 26 13:31:00 2002
*************** do {									\
*** 385,406 ****
  #define LINK_EH_SPEC "vms-dwarf2eh.o%s "
  
  #ifdef IN_LIBGCC2
- #include <libicb.h>
  #include <pdscdef.h>
  
  #define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS)		\
   do {									\
!   unsigned long handle;							\
!   PDSCDEF *pv;								\
!   INVO_CONTEXT_BLK invo;						\
  									\
!   memset (&invo, 0, sizeof (INVO_CONTEXT_BLK));				\
! 									\
!   invo.libicb$q_ireg [29] = *((long long *) (CONTEXT)->reg [29]);	\
!   invo.libicb$q_ireg [30] = (long long) (CONTEXT)->cfa;			\
!   handle = LIB$GET_INVO_HANDLE (&invo);					\
!   LIB$GET_INVO_CONTEXT (handle, &invo);					\
!   pv = (PDSCDEF *) invo.libicb$ph_procedure_descriptor;			\
  									\
    if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_STACK))		\
      {									\
--- 385,398 ----
  #define LINK_EH_SPEC "vms-dwarf2eh.o%s "
  
  #ifdef IN_LIBGCC2
  #include <pdscdef.h>
  
  #define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS)		\
   do {									\
!   PDSCDEF *pv = *((PDSCDEF **) (CONTEXT)->reg [29]);                    \
  									\
!   if (pv && ((long) pv & 0x7) == 0) /* low bits 0 means address */      \
!     pv = *(PDSCDEF **) pv;                                              \
  									\
    if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_STACK))		\
      {									\
*************** do {									\
*** 424,429 ****
--- 416,434 ----
  	    (FS)->regs.reg[i].how = REG_SAVED_OFFSET;			\
  	  }								\
  									\
+       goto SUCCESS;							\
+     }									\
+   else if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_REGISTER))	\
+     {									\
+       (FS)->cfa_offset = pv->pdsc$l_size;				\
+       (FS)->cfa_reg = pv->pdsc$w_flags & PDSC$M_BASE_REG_IS_FP ? 29 : 30; \
+       (FS)->retaddr_column = 26;					\
+       (FS)->cfa_how = CFA_REG_OFFSET;					\
+       (FS)->regs.reg[26].loc.reg = pv->pdsc$b_save_ra;			\
+       (FS)->regs.reg[26].how = REG_SAVED_REG;			        \
+       (FS)->regs.reg[29].loc.reg = pv->pdsc$b_save_fp;			\
+       (FS)->regs.reg[29].how = REG_SAVED_REG;			        \
+ 									\
        goto SUCCESS;							\
      }									\
  } while (0)



More information about the Gcc-patches mailing list