vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle register frame procedures.
authorDouglas B Rupp <rupp@gnat.com>
Wed, 13 Feb 2002 15:19:27 +0000 (10:19 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 13 Feb 2002 15:19:27 +0000 (10:19 -0500)
* config/alpha/vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle
register frame procedures. Optimize retrieving context.

From-SVN: r49732

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

index f6e73fc83dd8062a3bfc61e0f52cee1971835783..db3004596ef00685acdfbd9a9062ef600332b345 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 ba657043a8ea43a42ad9c4ca86879ec67d5d2b5b..9cc3f70dc73319a35d6b8f3d31b63b61ea1e1b62 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