diff options
author | Douglas B Rupp <rupp@gnat.com> | 2002-02-13 10:19:27 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2002-02-13 10:19:27 -0500 |
commit | 3deb00ce32493605cc011cc0ebf48bff62540d9d (patch) | |
tree | a6359750b4ee1e6984f567f05ed5acc2818bc9e2 | |
parent | 09eb789b6d453a3f1388e7517182cd2033351eae (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/config/alpha/vms.h | 27 |
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 |