aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2000-04-07 09:07:24 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2000-04-07 09:07:24 +0000
commit1e143002cbb4f70c6cfe87bd4cab1bd3aa539184 (patch)
treedf1a187aa3e1f8829bd0947a84637a9a7feb2b6f /gcc
parent62771d518605d12ca322cf35c20ba5164b5b9c5e (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog16
-rw-r--r--gcc/cp/tinfo.cc50
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)
{