From 6bfa2cc1b1757ca919c796642fcb4ee2d7fe7fa7 Mon Sep 17 00:00:00 2001 From: rth Date: Fri, 21 Sep 2001 16:58:22 +0000 Subject: gcc/ * tree.def (FDESC_EXPR): New. * expr.c (expand_expr): Handle it. * varasm.c (initializer_constant_valid_p): Likewise. (output_constant): Likewise. * defaults.h (TARGET_VTABLE_USES_DESCRIPTORS): New. * config/ia64/ia64.h (TARGET_VTABLE_USES_DESCRIPTORS): New. (ASM_OUTPUT_FDESC): New. * doc/tm.texi: Document the new macros. gcc/cp/ * class.c (set_vindex): Mind TARGET_VTABLE_USES_DESCRIPTORS. (build_vtbl_initializer): Likewise. (build_vfn_ref): New. * cp-tree.h: Declare it. * call.c (build_over_call): Use it. * decl2.c (mark_vtable_entries): Mark FDESC_EXPR. * typeck.c (get_member_function_from_ptrfunc): Mind descriptors. gcc/java/ * class.c (get_dispatch_table): Handle function descriptors. (build_dtable_decl): Likewise. * expr.c (build_invokevirtual): Likewise. gcc/testsuite/ * g++.old-deja/g++.abi/ptrmem.C: Update for ia64 c++ abi. * g++.old-deja/g++.abi/vtable2.C: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45733 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C | 18 ++++++++++++++---- gcc/testsuite/g++.old-deja/g++.abi/vtable2.C | 19 +++++++++++++++---- 3 files changed, 34 insertions(+), 8 deletions(-) (limited to 'gcc/testsuite') diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 74508a6c941..ac98003e9cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2001-09-21 Richard Henderson + + * g++.old-deja/g++.abi/ptrmem.C: Update for ia64 c++ abi. + * g++.old-deja/g++.abi/vtable2.C: Likewise. + 2001-09-21 Joseph S. Myers Table-driven attributes. diff --git a/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C b/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C index 6bef481d8cf..38f8177a2a6 100644 --- a/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C +++ b/gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C @@ -14,6 +14,16 @@ #define ADJUST_DELTA(delta, virt) (delta) #endif +/* IA64 uses function descriptors instead of function pointers in its + vtables, which means that we can't meaningfully compare them directly. */ +#if defined __ia64__ +#define CMP_PTRFN(A, B) (*(void **)(A) == *(void **)(B)) +#define VPTE_SIZE (16) +#else +#define CMP_PTRFN(A, B) ((A) == (B)) +#define VPTE_SIZE sizeof(void *) +#endif + #if defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 // Check that pointers-to-member functions are represented correctly. @@ -85,12 +95,12 @@ main () // There should be no adjustment for the `T' version, and an // appropriate adjustment for the `S' version. y = &T::f; - if (yp->ptr != ADJUST_PTRFN (&_ZN1T1fEv, 0)) + if (! CMP_PTRFN (yp->ptr, ADJUST_PTRFN (&_ZN1T1fEv, 0))) return 5; if (yp->adj != ADJUST_DELTA (0, 0)) return 6; x = (sp) y; - if (xp->ptr != ADJUST_PTRFN (&_ZN1T1fEv, 0)) + if (! CMP_PTRFN (xp->ptr, ADJUST_PTRFN (&_ZN1T1fEv, 0))) return 7; if (xp->adj != ADJUST_DELTA (delta, 0)) return 8; @@ -99,12 +109,12 @@ main () // one. `T::h' is in the second slot: the vtable pointer points to // the first virtual function. y = &T::h; - if (yp->ptr != ADJUST_PTRFN (sizeof (void *), 1)) + if (yp->ptr != ADJUST_PTRFN (VPTE_SIZE, 1)) return 9; if (yp->adj != ADJUST_DELTA (0, 1)) return 10; x = (sp) y; - if (xp->ptr != ADJUST_PTRFN (sizeof (void *), 1)) + if (xp->ptr != ADJUST_PTRFN (VPTE_SIZE, 1)) return 11; if (xp->adj != ADJUST_DELTA (delta, 1)) return 12; diff --git a/gcc/testsuite/g++.old-deja/g++.abi/vtable2.C b/gcc/testsuite/g++.old-deja/g++.abi/vtable2.C index 5fe1e140d6c..9847a15a8b8 100644 --- a/gcc/testsuite/g++.old-deja/g++.abi/vtable2.C +++ b/gcc/testsuite/g++.old-deja/g++.abi/vtable2.C @@ -127,6 +127,15 @@ void _ZN2S32s3Ev (); void _ZN2S42s1Ev (); } +// IA-64 uses function descriptors not function pointers in its vtables. +#if defined __ia64__ +#define CMP_VPTR(A, B) (*(void **)(A) == *(void **)(B)) +#define INC_VPTR(A) ((A) += 2) +#else +#define CMP_VPTR(A, B) (*(A) == (ptrdiff_t)(B)) +#define INC_VPTR(A) ((A) += 1) +#endif + int main () { S4 s4; @@ -148,10 +157,12 @@ int main () return 4; // Skip the RTTI entry. vtbl++; - if (*vtbl++ != (ptrdiff_t) &_ZN2S32s3Ev) + if (! CMP_VPTR (vtbl, &_ZN2S32s3Ev)) return 5; - if (*vtbl++ != (ptrdiff_t) &_ZN2S42s1Ev) + INC_VPTR (vtbl); + if (! CMP_VPTR (vtbl, &_ZN2S42s1Ev)) return 6; + INC_VPTR (vtbl); // The S1 vbase offset. if (*vtbl++ != 0) return 7; @@ -169,8 +180,8 @@ int main () // Skip the RTTI entry. vtbl++; // Skip the remaining virtual functions -- they are thunks. - vtbl++; - vtbl++; + INC_VPTR (vtbl); + INC_VPTR (vtbl); } #else /* !(defined (__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100) */ -- cgit v1.2.1