aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/expr.c
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/java/expr.c
parent2e3b2d2c0791d979571fd33155b62e66ea7fe27c (diff)
downloadgcc-6723181663a87a735bdfdf2e16a6bd41dbc30be1.zip
gcc-6723181663a87a735bdfdf2e16a6bd41dbc30be1.tar.gz
gcc-6723181663a87a735bdfdf2e16a6bd41dbc30be1.tar.bz2
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/java/expr.c')
-rw-r--r--gcc/java/expr.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index ff0a327..5481289 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -1845,9 +1845,18 @@ build_invokevirtual (dtable, method)
method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
method_index = size_binop (MULT_EXPR, method_index,
TYPE_SIZE_UNIT (nativecode_ptr_ptr_type_node));
+
+ if (TARGET_VTABLE_USES_DESCRIPTORS)
+ method_index = size_binop (MULT_EXPR, method_index,
+ size_int (TARGET_VTABLE_USES_DESCRIPTORS));
+
func = fold (build (PLUS_EXPR, nativecode_ptr_ptr_type_node, dtable,
convert (nativecode_ptr_ptr_type_node, method_index)));
- func = build1 (INDIRECT_REF, nativecode_ptr_type_node, func);
+
+ if (TARGET_VTABLE_USES_DESCRIPTORS)
+ func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
+ else
+ func = build1 (INDIRECT_REF, nativecode_ptr_type_node, func);
return func;
}