aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas B Rupp <rupp@gnat.com>2002-02-13 10:19:27 -0500
committerRichard Kenner <kenner@gcc.gnu.org>2002-02-13 10:19:27 -0500
commit3deb00ce32493605cc011cc0ebf48bff62540d9d (patch)
treea6359750b4ee1e6984f567f05ed5acc2818bc9e2
parent09eb789b6d453a3f1388e7517182cd2033351eae (diff)
downloadgcc-3deb00ce32493605cc011cc0ebf48bff62540d9d.zip
gcc-3deb00ce32493605cc011cc0ebf48bff62540d9d.tar.gz
gcc-3deb00ce32493605cc011cc0ebf48bff62540d9d.tar.bz2
vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle register frame procedures.
* config/alpha/vms.h (MD_FALLBACK_FRAME_STATE_FOR): Handle register frame procedures. Optimize retrieving context. From-SVN: r49732
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/alpha/vms.h27
2 files changed, 19 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f6e73fc..db30045 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/alpha/vms.h b/gcc/config/alpha/vms.h
index ba65704..9cc3f70 100644
--- a/gcc/config/alpha/vms.h
+++ b/gcc/config/alpha/vms.h
@@ -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