summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-02-24 16:52:29 +0100
committerStephan Bergmann <sbergman@redhat.com>2015-02-24 16:52:29 +0100
commit03736d673ad88d848f327d8c327ebc2dedeb986a (patch)
treed147413b3316d6e7a1989b74a73cfea7389e14d8 /bridges
parentcdb214c33080c9b6347cefc627b392df24d6aede (diff)
Fix MI RTTI (as needed by -fsanitize=vptr)
Change-Id: Idbde54c641531b34f397d07c5f929870c3a82371
Diffstat (limited to 'bridges')
-rw-r--r--bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx29
1 files changed, 26 insertions, 3 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx b/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
index ef00adb0b06a..df6c4db4d552 100644
--- a/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
+++ b/bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
@@ -162,9 +162,32 @@ std::type_info * RTTI::getRTTI(typelib_TypeDescription const & pTypeDescr)
static_cast<__cxxabiv1::__class_type_info *>(
bases[0]));
break;
- case 2:
- //TODO
- break;
+ default:
+ {
+ char * pad = new char[
+ sizeof (__cxxabiv1::__vmi_class_type_info)
+ + ((itd.nBaseTypes - 1)
+ * sizeof (
+ __cxxabiv1::__base_class_type_info))];
+ __cxxabiv1::__vmi_class_type_info * info
+ = new(pad)
+ __cxxabiv1::__vmi_class_type_info(
+ strdup(rttiName),
+ __cxxabiv1::__vmi_class_type_info::__flags_unknown_mask);
+ info->__base_count = itd.nBaseTypes;
+ for (sal_Int32 i = 0; i != itd.nBaseTypes; ++i)
+ {
+ info->__base_info[i].__base_type
+ = static_cast<
+ __cxxabiv1::__class_type_info *>(
+ bases[i]);
+ info->__base_info[i].__offset_flags
+ = (__cxxabiv1::__base_class_type_info::__public_mask
+ | ((8 * i) << __cxxabiv1::__base_class_type_info::__offset_shift));
+ }
+ rtti = info;
+ break;
+ }
}
break;
}