summaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-09-21 09:58:22 -0700
committerRichard Henderson <rth@gcc.gnu.org>2001-09-21 09:58:22 -0700
commit6723181663a87a735bdfdf2e16a6bd41dbc30be1 (patch)
tree746cb9ad4b9e1b8562a39be3d23d3c85abfdac19 /gcc/testsuite
parent2e3b2d2c0791d979571fd33155b62e66ea7fe27c (diff)
downloadgcc-6723181663a87a735bdfdf2e16a6bd41dbc30be1.tar.gz
tree.def (FDESC_EXPR): New.
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. From-SVN: r45733
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.abi/ptrmem.C18
-rw-r--r--gcc/testsuite/g++.old-deja/g++.abi/vtable2.C19
3 files changed, 34 insertions, 8 deletions
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 <rth@redhat.com>
+
+ * 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 <jsm28@cam.ac.uk>
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) */