diff options
-rw-r--r-- | Android.mk | 51 | ||||
-rw-r--r-- | include/cxxabi.h | 183 | ||||
-rw-r--r-- | include/new | 56 | ||||
-rw-r--r-- | include/typeinfo | 76 | ||||
-rw-r--r-- | src/array_type_info.cc | 37 | ||||
-rw-r--r-- | src/class_type_info.cc | 37 | ||||
-rw-r--r-- | src/delete.cc | 38 | ||||
-rw-r--r-- | src/dynamic_cast.cc | 356 | ||||
-rw-r--r-- | src/enum_type_info.cc | 37 | ||||
-rw-r--r-- | src/function_type_info.cc | 37 | ||||
-rw-r--r-- | src/fundamental_type_info.cc | 37 | ||||
-rw-r--r-- | src/new.cc | 42 | ||||
-rw-r--r-- | src/pbase_type_info.cc | 37 | ||||
-rw-r--r-- | src/pointer_to_member_type_info.cc | 37 | ||||
-rw-r--r-- | src/pointer_type_info.cc | 37 | ||||
-rw-r--r-- | src/si_class_type_info.cc | 37 | ||||
-rw-r--r-- | src/type_info.cc | 75 | ||||
-rw-r--r-- | src/vmi_class_type_info.cc | 37 |
18 files changed, 1247 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..ddbc353 --- /dev/null +++ b/Android.mk @@ -0,0 +1,51 @@ +LOCAL_PATH:= $(call my-dir) + +libgabi++_cflags := \ + -I$(LOCAL_PATH)/include + +libgabi++_common_src_files := \ + src/array_type_info.cc \ + src/class_type_info.cc \ + src/delete.cc \ + src/dynamic_cast.cc \ + src/enum_type_info.cc \ + src/function_type_info.cc \ + src/new.cc \ + src/pbase_type_info.cc \ + src/pointer_type_info.cc \ + src/pointer_to_member_type_info.cc \ + src/si_class_type_info.cc \ + src/type_info.cc \ + src/vmi_class_type_info.cc + +include $(CLEAR_VARS) + +LOCAL_CPP_EXTENSION := .cc + +LOCAL_SRC_FILES:= $(libgabi++_common_src_files) + +LOCAL_MODULE:= libgabi++ + +LOCAL_CFLAGS := $(libgabi++_cflags) + +LOCAL_RTTI_FLAG := -frtti + +LOCAL_SYSTEM_SHARED_LIBRARIES := libc + +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_CPP_EXTENSION := .cc + +LOCAL_SRC_FILES:= $(libgabi++_common_src_files) + +LOCAL_MODULE:= libgabi++ + +LOCAL_CFLAGS := $(libgabi++_cflags) + +LOCAL_RTTI_FLAG := -frtti + +LOCAL_SYSTEM_SHARED_LIBRARIES := libc + +include $(BUILD_STATIC_LIBRARY) diff --git a/include/cxxabi.h b/include/cxxabi.h new file mode 100644 index 0000000..3bd8a58 --- /dev/null +++ b/include/cxxabi.h @@ -0,0 +1,183 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// + +#ifndef __GABIXX_CXXABI_H__ +#define __GABIXX_CXXABI_H__ + +#include <typeinfo> + +namespace abi = __cxxabiv1; + +namespace __cxxabiv1 +{ + extern "C" void __cxa_pure_virtual(); + + // Derived types of type_info below are based on 2.9.5 of C++ ABI. + + // Typeinfo for fundamental types. + class __fundamental_type_info : public std::type_info + { + public: + ~__fundamental_type_info(); + }; + + // Typeinfo for array types. + class __array_type_info : public std::type_info + { + public: + ~__array_type_info(); + }; + + // Typeinfo for function types. + class __function_type_info : public std::type_info + { + public: + ~__function_type_info(); + }; + + // Typeinfo for enum types. + class __enum_type_info : public std::type_info + { + public: + ~__enum_type_info(); + }; + + // Typeinfo for classes with no bases. + class __class_type_info : public std::type_info + { + public: + ~__class_type_info(); + + enum class_type_info_code + { + CLASS_TYPE_INFO_CODE, + SI_CLASS_TYPE_INFO_CODE, + VMI_CLASS_TYPE_INFO_CODE + }; + + virtual class_type_info_code + code() const { return CLASS_TYPE_INFO_CODE; } + }; + + // Typeinfo for classes containing only a single, public, non-virtual base at + // offset zero. + class __si_class_type_info : public __class_type_info + { + public: + ~__si_class_type_info(); + const __class_type_info *__base_type; + + virtual __class_type_info::class_type_info_code + code() const { return SI_CLASS_TYPE_INFO_CODE; } + }; + + struct __base_class_type_info + { + public: + const __class_type_info *__base_type; + + // All but the lower __offset_shift bits of __offset_flags are a signed + // offset. For a non-virtual base, this is the offset in the object of the + // base subobject. For a virtual base, this is the offset in the virtual + // table of the virtual base offset for the virtual base referenced + // (negative). + long __offset_flags; + + enum __offset_flags_masks + { + __virtual_mask = 0x1, + __public_mask = 0x2, + __offset_shift = 8 + }; + + bool inline + is_virtual() const { return (__offset_flags & __virtual_mask) != 0; } + + bool inline + is_public() const { return (__offset_flags & __public_mask) != 0; } + + // FIXME: Right-shift of signed integer is implementation dependent. + long inline + offset() const { return __offset_flags >> __offset_shift; } + + long inline + flags() const { return __offset_flags & ((1L << __offset_shift) - 1); } + }; + + // Typeinfo for classes with bases that do not satisfy the + // __si_class_type_info constraints. + class __vmi_class_type_info : public __class_type_info + { + public: + ~__vmi_class_type_info(); + unsigned int __flags; + unsigned int __base_count; + __base_class_type_info __base_info[1]; + + enum __flags_masks + { + __non_diamond_repeat_mask = 0x1, + __diamond_shaped_mask = 0x2 + }; + + virtual __class_type_info::class_type_info_code + code() const { return VMI_CLASS_TYPE_INFO_CODE; } + }; + + class __pbase_type_info : public std::type_info + { + public: + ~__pbase_type_info(); + unsigned int __flags; + const std::type_info *__pointee; + + enum __masks + { + __const_mask = 0x1, + __volatile_mask = 0x2, + __restrict_mask = 0x4, + __incomplete_mask = 0x8, + __incomplete_class_mask = 0x10 + }; + }; + + class __pointer_type_info : public __pbase_type_info + { + public: + ~__pointer_type_info(); + }; + + class __pointer_to_member_type_info : public __pbase_type_info + { + public: + ~__pointer_to_member_type_info(); + }; +} + +#endif /* defined(__GABIXX_CXXABI_H__) */ + diff --git a/include/new b/include/new new file mode 100644 index 0000000..92dd960 --- /dev/null +++ b/include/new @@ -0,0 +1,56 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// new: Dynamic storage management. + +#ifndef __GABIXX_NEW__ +#define __GABIXX_NEW__ + +#include <cstddef> + +namespace std +{ + struct nothrow_t {}; + extern const nothrow_t nothrow; + typedef void (*new_handler)(); +} + +// FIXME: Need to handle exceptions. +void* operator new(std::size_t size) throw(/*std::bad_alloc*/); +void* operator new(std::size_t size, const std::nothrow_t&) throw(); +void operator delete(void* ptr) throw(); +void operator delete(void*, const std::nothrow_t&) throw(); +void* operator new[](std::size_t size) throw(/*std::bad_alloc*/); +void* operator new[](std::size_t size, const std::nothrow_t&) throw(); +void operator delete[](void* ptr) throw(); +void operator delete[](void* const, std::nothrow_t&) throw(); +void* operator new(std::size_t size, void* ptr) throw(); +void* operator new[](std::size_t size, void* ptr) throw(); +void operator delete(void* ptr, void*) throw(); +void operator delete[](void* ptr, void*) throw(); + +#endif // __GABIXX_NEW__ diff --git a/include/typeinfo b/include/typeinfo new file mode 100644 index 0000000..ab87f7e --- /dev/null +++ b/include/typeinfo @@ -0,0 +1,76 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// typeinfo: RTTI support header. +// +// References: +// Itanium C++ ABI at http://www.codesourcery.com/public/cxx-abi/abi.html. +// IHI0041A C++ Application Binary Interface for the ARM architecture. +// Linux Standard Base C++ Specification for S390X 4.1. +// + +#ifndef __GABIXX_TYPEINFO__ +#define __GABIXX_TYPEINFO__ + +namespace std +{ + // Defintion of type_info based on example in C++ ABI section 2.9.3 + class type_info + { + public: + virtual + ~type_info(); + + // Whether two type_infos corresponds to the same types. + bool + operator==(const type_info &ti) const; + + // Whether two type_infos corresponds to the different types. + bool + operator!=(const type_info &ti) const; + + bool + before(const type_info &ti) const; + + // Return name of type. + const char* + name() const { return __type_name; } + + private: + // Assignment of type_info is not allowed. + type_info (const type_info& rhs); + + type_info& + operator=(const type_info& rhs); + + // Mangled name of type. + const char *__type_name; + }; + +} // namespace std + +#endif // _GABIXX_TYPEINFO_ diff --git a/src/array_type_info.cc b/src/array_type_info.cc new file mode 100644 index 0000000..006f50d --- /dev/null +++ b/src/array_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// fundamental_type_info.cc: Methods for __fundamental_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __fundamental_type_info::~__fundamental_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/class_type_info.cc b/src/class_type_info.cc new file mode 100644 index 0000000..4544542 --- /dev/null +++ b/src/class_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// class_type_info.cc: Methods for __class_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __class_type_info::~__class_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/delete.cc b/src/delete.cc new file mode 100644 index 0000000..f13fc49 --- /dev/null +++ b/src/delete.cc @@ -0,0 +1,38 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// delete.cc: delete operator + +#include <stdlib.h> +#include <new> + +void +operator delete(void* ptr) throw() +{ + if (ptr) + free(ptr); +} diff --git a/src/dynamic_cast.cc b/src/dynamic_cast.cc new file mode 100644 index 0000000..4487fff --- /dev/null +++ b/src/dynamic_cast.cc @@ -0,0 +1,356 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// dynamic_cast.cc: RTTI support. +// +// References: +// Itanium C++ ABI at http://www.codesourcery.com/public/cxx-abi/abi.html +// IHI0041A C++ Application Binary Interface for the ARM architecture. +// + +#include <cxxabi.h> + +#include <cstddef> +#include <cassert> + +namespace +{ + // Adjust a pointer by an offset. + + const void* + adjust_pointer(const void* p, std::ptrdiff_t off) + { + // FIXME: should we align pointer after adjustment? + const char *cp = reinterpret_cast<const char*>(p) + off; + return reinterpret_cast<const void*>(cp); + } + + // Return the vtable pointer of a polymorphic object pointed by p. + + inline const void* + get_vtable(const void* p) + { + return *reinterpret_cast<void*const*>(p); + } + + // Return a pointer to a __class_type_info in a vtable. + + inline const abi::__class_type_info* + get_class_type_info(const void* vtable) + { + const void* type_info_ptr = adjust_pointer(vtable, -sizeof(void*)); + return *reinterpret_cast<abi::__class_type_info*const*>(type_info_ptr); + } + + // Return offset to object in a vtable. + + inline std::ptrdiff_t + get_offset_to_top(const void* vtable) + { + const void* type_info_ptr_address = adjust_pointer(vtable, -sizeof(void*)); + const void* offset_to_top_address = + adjust_pointer(type_info_ptr_address, -sizeof(std::ptrdiff_t)); + return *reinterpret_cast<const std::ptrdiff_t*>(offset_to_top_address); + } + + // Return the virtual pointer to the most derived object of referred by a + // pointer p. + + const void* + get_most_derived_object(const void* p) + { + const void* vtable = get_vtable(p); + std::ptrdiff_t offset_to_top = get_offset_to_top(vtable); + return adjust_pointer(p, offset_to_top); + } + + // We assume that -1 cannot be a valid pointer to object. + const void * const ambiguous_object = + reinterpret_cast<const void*>(-1); + + // Return a pointer to the subobject described by base_info. + + const void* + get_subobject(const void* object, + const void* vtable, + const abi::__base_class_type_info* base_info) + { + long offset = base_info->offset(); + if (base_info->is_virtual()) + { + const std::ptrdiff_t* virtual_base_offset_address = + static_cast<const std::ptrdiff_t*> (adjust_pointer(vtable, offset)); + offset = *virtual_base_offset_address; + } + return adjust_pointer(object, offset); + } + + // Helper of __dyanmic_cast to walk the type tree of an object. + + const void * + walk_object(const void *object, + const abi::__class_type_info *type, + const void *match_object, + const abi::__class_type_info *match_type) + { + if (*type == *match_type) + return (match_object == NULL || object == match_object) ? object : NULL; + + switch(type->code()) + { + case abi::__class_type_info::CLASS_TYPE_INFO_CODE: + // This isn't not the class you're looking for. + return NULL; + + case abi::__class_type_info::SI_CLASS_TYPE_INFO_CODE: + // derived type has a single public base at offset 0. + { + const abi::__si_class_type_info* ti = + static_cast<const abi::__si_class_type_info*>(type); + return walk_object(object, ti->__base_type, match_object, + match_type); + } + + case abi::__class_type_info::VMI_CLASS_TYPE_INFO_CODE: + { + const void* vtable = get_vtable(object); + const abi::__vmi_class_type_info* ti = + static_cast<const abi::__vmi_class_type_info*>(type); + + // Look at all direct bases. + const void* result = NULL; + for (unsigned i = 0; i < ti->__base_count; ++i) + { + if (!ti->__base_info[i].is_public()) + continue; + + const void *subobject = + get_subobject(object, vtable, &ti->__base_info[i]); + const void* walk_subobject_result = + walk_object(subobject, ti->__base_info[i].__base_type, + match_object, match_type); + + if (walk_subobject_result == ambiguous_object) + return ambiguous_object; + else if (walk_subobject_result != NULL) + { + if (result == NULL) + { + result = walk_subobject_result; + } + else if (result != walk_subobject_result) + return ambiguous_object; + } + } + return result; + } + + default: + assert(0); + } + return NULL; + } + + // Bookkeeping structure for derived-to-base cast in the general case. + struct cast_context + { + public: + const void* object; + const abi::__class_type_info *src_type; + const abi::__class_type_info *dst_type; + std::ptrdiff_t src2dst_offset; + + const void* dst_object; + const void* result; + + cast_context(const void* obj, const abi::__class_type_info *src, + const abi::__class_type_info *dst, std::ptrdiff_t offset) + : object(obj), src_type(src), dst_type(dst), src2dst_offset(offset), + dst_object(NULL), result(NULL) + { } + }; + + // based-to-derive cast in the general case. + + void + base_to_derived_cast(const void *object, + const abi::__class_type_info *type, + cast_context* context) + { + const void* saved_dst_object = context->dst_object; + bool is_dst_type = *type == *context->dst_type; + if (is_dst_type) + context->dst_object = object; + + if (object == context->object + && context->dst_object != NULL + && *type == *context->src_type) + { + if (context->result == NULL) + context->result = context->dst_object; + else if (context->result != context->dst_object) + context->result = ambiguous_object; + context->dst_object = saved_dst_object; + return; + } + + switch(type->code()) + { + case abi::__class_type_info::CLASS_TYPE_INFO_CODE: + // This isn't not the class you're looking for. + break; + + case abi::__class_type_info::SI_CLASS_TYPE_INFO_CODE: + // derived type has a single public base at offset 0. + { + const abi::__si_class_type_info* ti = + static_cast<const abi::__si_class_type_info*>(type); + base_to_derived_cast(object, ti->__base_type, context); + break; + } + + case abi::__class_type_info::VMI_CLASS_TYPE_INFO_CODE: + { + const void* vtable = get_vtable(object); + const abi::__vmi_class_type_info* ti = + static_cast<const abi::__vmi_class_type_info*>(type); + + // Look at all direct bases. + for (unsigned i = 0; i < ti->__base_count; ++i) + { + if (!ti->__base_info[i].is_public()) + continue; + + const void *subobject = + get_subobject(object, vtable, &ti->__base_info[i]); + base_to_derived_cast(subobject, ti->__base_info[i].__base_type, + context); + + // FIXME: Use flags in base_info to optimize search. + if (context->result == ambiguous_object) + break; + } + break; + } + + default: + assert(0); + } + context->dst_object = saved_dst_object; + } +} // namespace + +namespace __cxxabiv1 +{ +#define DYNAMIC_CAST_NO_HINT -1 +#define DYNAMIC_CAST_NOT_PUBLIC_BASE -2 +#define DYNAMIC_CAST_MULTIPLE_PUBLIC_NONVIRTUAL_BASE -3 + + /* v: source address to be adjusted; nonnull, and since the + * source object is polymorphic, *(void**)v is a virtual pointer. + * src: static type of the source object. + * dst: destination type (the "T" in "dynamic_cast<T>(v)"). + * src2dst_offset: a static hint about the location of the + * source subobject with respect to the complete object; + * special negative values are: + * -1: no hint + * -2: src is not a public base of dst + * -3: src is a multiple public base type but never a + * virtual base type + * otherwise, the src type is a unique public nonvirtual + * base type of dst at offset src2dst_offset from the + * origin of dst. + */ + extern "C" void* + __dynamic_cast (const void *v, + const abi::__class_type_info *src, + const abi::__class_type_info *dst, + std::ptrdiff_t src2dst_offset) + { + const void* most_derived_object = get_most_derived_object(v); + const void* vtable = get_vtable(most_derived_object); + const abi::__class_type_info* most_derived_class_type_info = + get_class_type_info(vtable); + + // If T is not a public base type of the most derived class referred + // by v, the cast always fails. + void* t_object = + const_cast<void*>(walk_object(most_derived_object, + most_derived_class_type_info, NULL, dst)); + if (t_object == NULL) + return NULL; + + // C++ ABI 2.9.7 The dynamic_cast Algorithm: + // + // If, in the most derived object pointed (referred) to by v, v points + // (refers) to a public base class subobject of a T object [note: this can + // be checked at compile time], and if only one object of type T is derived + // from the subobject pointed (referred) to by v, the result is a pointer + // (an lvalue referring) to that T object. + + // We knew that src is not a public base, so base-to-derived cast + // is not possible. This works even if there are multiple subobjects + // of type T in the most derived object. + if (src2dst_offset != DYNAMIC_CAST_NOT_PUBLIC_BASE) + { + // If it is known that v points to a public base class subobject + // of a T object, simply adjust the pointer by the offset. + if (t_object != ambiguous_object && src2dst_offset >= 0) + return const_cast<void*>(adjust_pointer(v, src2dst_offset)); + + // If there is only one T type subobject, we only need to look at + // there. Otherwise, look for the subobject referred by v in the + // most derived object. + cast_context context(v, src, dst, src2dst_offset); + if (t_object != ambiguous_object) + base_to_derived_cast(t_object, dst, &context); + else + base_to_derived_cast(most_derived_object, + most_derived_class_type_info, &context); + + if (context.result != NULL && context.result != ambiguous_object) + return const_cast<void*>(context.result); + } + + // C++ ABI 2.9.7 The dynamic_cast Algorithm: + // + // Otherwise, if v points (refers) to a public base class subobject of the + // most derived object, and the type of the most derived object has an + // unambiguous public base class of type T, the result is a pointer (an + // lvalue referring) to the T subobject of the most derived object. + // Otherwise, the run-time check fails. + + // Check to see if T is a unambiguous public base class. + if (t_object == ambiguous_object) + return NULL; + + // See if v refers to a public base class subobject. + const void* v_object = + walk_object(most_derived_object, most_derived_class_type_info, v, src); + return v_object == v ? t_object : NULL; + } +} // namespace __cxxabiv1 diff --git a/src/enum_type_info.cc b/src/enum_type_info.cc new file mode 100644 index 0000000..3a0f809 --- /dev/null +++ b/src/enum_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// enum_type_info.cc: Methods for __enum_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __enum_type_info::~__enum_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/function_type_info.cc b/src/function_type_info.cc new file mode 100644 index 0000000..138dd07 --- /dev/null +++ b/src/function_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// function_type_info.cc: Methods for __function_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __function_type_info::~__function_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/fundamental_type_info.cc b/src/fundamental_type_info.cc new file mode 100644 index 0000000..d84af0a --- /dev/null +++ b/src/fundamental_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// array_type_info.cc: Methods for __array_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __array_type_info::~__array_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/new.cc b/src/new.cc new file mode 100644 index 0000000..77f54a4 --- /dev/null +++ b/src/new.cc @@ -0,0 +1,42 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// + +#include <stdlib.h> +#include <new> + +// FIXME: need to handle exceptions +void* +operator new(std::size_t size) throw (/*std::bad_alloc*/) +{ + void* ptr = malloc(size); +#if 0 + if (ptr == NULL) + throw std::bad_alloc(); +#endif + return ptr; +} diff --git a/src/pbase_type_info.cc b/src/pbase_type_info.cc new file mode 100644 index 0000000..d7b1901 --- /dev/null +++ b/src/pbase_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// pbase_type_info.cc: Methods for __pbase_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __pbase_type_info::~__pbase_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/pointer_to_member_type_info.cc b/src/pointer_to_member_type_info.cc new file mode 100644 index 0000000..e2892ab --- /dev/null +++ b/src/pointer_to_member_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// pointer_to_member_type_info.cc: Methods for __pointer_to_member_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __pointer_to_member_type_info::~__pointer_to_member_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/pointer_type_info.cc b/src/pointer_type_info.cc new file mode 100644 index 0000000..31a84f4 --- /dev/null +++ b/src/pointer_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// pointer_type_info.cc: Methods for __pointer_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __pointer_type_info::~__pointer_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/si_class_type_info.cc b/src/si_class_type_info.cc new file mode 100644 index 0000000..d6a631f --- /dev/null +++ b/src/si_class_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// si_class_type_info.cc: Methods for __si_class_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __si_class_type_info::~__si_class_type_info() + { + } +} // namespace __cxxabiv1 diff --git a/src/type_info.cc b/src/type_info.cc new file mode 100644 index 0000000..69b9f3a --- /dev/null +++ b/src/type_info.cc @@ -0,0 +1,75 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// type_info.cc: Methods for std::type_info. +// + +#include <cxxabi.h> +#ifdef __ARM_EABI__ +// ARM EABI requires string comprison for mangled type names for type_info +// equality. +#include <string.h> +#endif + +#include <typeinfo> + +namespace std +{ + type_info::~type_info() + { + } + + bool + type_info::operator==(const type_info& rhs) const + { +#ifdef __ARM_EABI__ + // IHI0041A CPPABI 3.2.5.6. Because of weak linkage and share libraries, + // we perform string comparison. + return strcmp(this->__type_name, rhs.__type_name) == 0; +#else + return this == &rhs; +#endif + } + + bool + type_info::operator!=(const type_info& rhs) const + { + return !this->operator==(rhs); + } + + bool + type_info::before(const type_info& rhs) const + { +#ifdef __ARM_EABI__ + // IHI0041A CPPABI 3.2.5.6. Because of weak linkage and share libraries, + // we perform string comparison. + return strcmp(this->__type_name, rhs.__type_name) < 0; +#else + return this < &rhs; +#endif + } +} // end namespace std diff --git a/src/vmi_class_type_info.cc b/src/vmi_class_type_info.cc new file mode 100644 index 0000000..b6a4bf6 --- /dev/null +++ b/src/vmi_class_type_info.cc @@ -0,0 +1,37 @@ +// Copyright (C) 2011 The Android Open Source Project +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +// vmi_class_type_info.cc: Methods for __vmi_class_type_info. + +#include <cxxabi.h> + +namespace __cxxabiv1 +{ + __vmi_class_type_info::~__vmi_class_type_info() + { + } +} // namespace __cxxabiv1 |