diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f6e73fc83dd..db3004596ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2002-02-13 Douglas B Rupp + * 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 ba657043a8e..9cc3f70dc73 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 #include #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