diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2000-04-07 09:07:24 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2000-04-07 09:07:24 +0000 |
commit | 1e143002cbb4f70c6cfe87bd4cab1bd3aa539184 (patch) | |
tree | df1a187aa3e1f8829bd0947a84637a9a7feb2b6f | |
parent | 62771d518605d12ca322cf35c20ba5164b5b9c5e (diff) | |
download | gcc-1e143002cbb4f70c6cfe87bd4cab1bd3aa539184.zip gcc-1e143002cbb4f70c6cfe87bd4cab1bd3aa539184.tar.gz gcc-1e143002cbb4f70c6cfe87bd4cab1bd3aa539184.tar.bz2 |
tinfo.cc (convert_to_base): New function.
* tinfo.cc (convert_to_base): New function.
(get_vbase_offset): Remove. Move into convert_to_base.
(__vmi_class_type_info::do_find_public_src): Adjust.
(__vmi_class_type_info::do_dyncast): Adjust.
(__vmi_class_type_info::do_upcast): Adjust.
plus commit changelog entry 2000-04-06 Nathan Sidwell <nathan@codesourcery.com>
From-SVN: r32993
-rw-r--r-- | gcc/cp/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/cp/tinfo.cc | 50 |
2 files changed, 41 insertions, 25 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cfef9b7..1cf52b6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2000-04-07 Nathan Sidwell <nathan@codesourcery.com> + + * tinfo.cc (convert_to_base): New function. + (get_vbase_offset): Remove. Move into convert_to_base. + (__vmi_class_type_info::do_find_public_src): Adjust. + (__vmi_class_type_info::do_dyncast): Adjust. + (__vmi_class_type_info::do_upcast): Adjust. + 2000-04-06 Jason Merrill <jason@yorick.cygnus.com> * tinfo.cc (operator=): Use __builtin_strcmp. @@ -30,6 +38,14 @@ 2000-04-06 Nathan Sidwell <nathan@codesourcery.com> + * vec.cc: New file. + * Make-lang.in (CXX_LIB2FUNCS): Add it. + (vec.o): Build it. + * inc/cxxabi.h (__cxa_vec_new, __cxa_vec_ctor, __cxa_vec_dtor, + __cxa_vec_delete): Declare. + +2000-04-06 Nathan Sidwell <nathan@codesourcery.com> + * rtti.c (dfs_class_hint_mark): New static function. (dfs_class_hint_unmark): New static function. (class_hint_flags): Use them. diff --git a/gcc/cp/tinfo.cc b/gcc/cp/tinfo.cc index 4c32255..130a775 100644 --- a/gcc/cp/tinfo.cc +++ b/gcc/cp/tinfo.cc @@ -590,12 +590,19 @@ adjust_pointer (const void *base, ptrdiff_t offset) (reinterpret_cast <const char *> (base) + offset); } -inline ptrdiff_t -get_vbase_offset (const void *object, ptrdiff_t offset) +// ADDR is a pointer to an object. Convert it to a pointer to a base, +// using OFFSET. IS_VIRTUAL is true, if we are getting a virtual base. +inline void const * +convert_to_base (void const *addr, bool is_virtual, ptrdiff_t offset) { - const char *vtable = *reinterpret_cast <const char *const *> (object); - vtable += offset; - return *reinterpret_cast <const ptrdiff_t *> (vtable); + if (is_virtual) + { + const void *vtable = *static_cast <const void *const *> (addr); + + offset = *adjust_pointer<ptrdiff_t> (vtable, offset); + } + + return adjust_pointer<void> (addr, offset); } // some predicate functions for __class_type_info::sub_kind @@ -721,20 +728,20 @@ do_find_public_src (ptrdiff_t src2dst, const void *base = obj_ptr; ptrdiff_t offset = base_list[i].offset (); + bool is_virtual = base_list[i].is_virtual_p (); - if (base_list[i].is_virtual_p ()) + if (is_virtual) { if (src2dst == -3) continue; // Not a virtual base, so can't be here. - offset = get_vbase_offset (base, offset); } - base = adjust_pointer <void> (base, offset); + base = convert_to_base (base, is_virtual, offset); sub_kind base_kind = base_list[i].base->do_find_public_src (src2dst, base, src_type, src_ptr); if (contained_p (base_kind)) { - if (base_list[i].is_virtual_p ()) + if (is_virtual) base_kind = sub_kind (base_kind | contained_virtual_mask); return base_kind; } @@ -843,13 +850,11 @@ do_dyncast (ptrdiff_t src2dst, void const *base = obj_ptr; sub_kind base_access = access_path; ptrdiff_t offset = base_list[i].offset (); + bool is_virtual = base_list[i].is_virtual_p (); - if (base_list[i].is_virtual_p ()) - { - base_access = sub_kind (base_access | contained_virtual_mask); - offset = get_vbase_offset (base, offset); - } - base = adjust_pointer <void> (base, offset); + if (is_virtual) + base_access = sub_kind (base_access | contained_virtual_mask); + base = convert_to_base (base, is_virtual, offset); if (!base_list[i].is_public_p ()) base_access = sub_kind (base_access & ~contained_public_mask); @@ -1032,6 +1037,7 @@ do_upcast (sub_kind access_path, const void *base = obj_ptr; sub_kind sub_access = access_path; ptrdiff_t offset = base_list[i].offset (); + bool is_virtual = base_list[i].is_virtual_p (); if (!base_list[i].is_public_p ()) { @@ -1040,22 +1046,16 @@ do_upcast (sub_kind access_path, continue; sub_access = sub_kind (sub_access & ~contained_public_mask); } - if (base_list[i].is_virtual_p ()) - { - sub_access = sub_kind (sub_access | contained_virtual_mask); - - if (base) - offset = get_vbase_offset (base, offset); - } + if (is_virtual) + sub_access = sub_kind (sub_access | contained_virtual_mask); if (base) - base = adjust_pointer <void> (base, offset); + base = convert_to_base (base, is_virtual, offset); if (base_list[i].base->do_upcast (sub_access, dst, base, result2)) return true; // must fail if (result2.base_type) { - if (result2.base_type == nonvirtual_base_type - && base_list[i].is_virtual_p ()) + if (result2.base_type == nonvirtual_base_type && is_virtual) result2.base_type = base_list[i].base; if (!result.base_type) { |