OSDN Git Service

* config/alpha/vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Feb 2002 15:19:27 +0000 (15:19 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Feb 2002 15:19:27 +0000 (15:19 +0000)
register frame procedures. Optimize retrieving context.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49732 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/alpha/vms.h

index f6e73fc..db30045 100644 (file)
@@ -1,5 +1,8 @@
 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/t-vms (MULTILIB_OPTIONS): Define.
        (MULTILIB_DIRNAME, LIBGCC, INSTALL_LIBGCC): Likewise.
        * config/alpha/vms.h (ASM_FILE_START): Write .arch directive.
index ba65704..9cc3f70 100644 (file)
@@ -391,22 +391,14 @@ do {                                                                      \
 #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;                                               \
+  PDSCDEF *pv = *((PDSCDEF **) (CONTEXT)->reg [29]);                    \
                                                                        \
-  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 && ((long) pv & 0x7) == 0) /* low bits 0 means address */      \
+    pv = *(PDSCDEF **) pv;                                              \
                                                                        \
   if (pv && ((pv->pdsc$w_flags & 0xf) == PDSC$K_KIND_FP_STACK))                \
     {                                                                  \
@@ -432,6 +424,19 @@ do {                                                                       \
                                                                        \
       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)
 #endif