Bug 864843 - Part 1. Import gabi++ to tree to build ICU for Android r=glandium
authorFabrice Desré <fabrice@mozilla.com>
Mon, 19 Oct 2015 22:25:44 -0700
changeset 268571 a6e94fdb528e48724e354bede9b1924a05ecae10
parent 268570 282e9eb6ecd00459ee240679bad4b34a78ef9d47
child 268572 ba7fd2ff5fa098f0fd2a9c7d806d8f77e425a235
push id29554
push userkwierso@gmail.com
push dateTue, 20 Oct 2015 21:59:11 +0000
treeherdermozilla-central@f39703495030 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersglandium
bugs864843
milestone44.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 864843 - Part 1. Import gabi++ to tree to build ICU for Android r=glandium
build/gabi++/Android.mk
build/gabi++/README.mozilla
build/gabi++/include/cxxabi.h
build/gabi++/include/new
build/gabi++/include/typeinfo
build/gabi++/src/array_type_info.cc
build/gabi++/src/class_type_info.cc
build/gabi++/src/delete.cc
build/gabi++/src/dynamic_cast.cc
build/gabi++/src/enum_type_info.cc
build/gabi++/src/function_type_info.cc
build/gabi++/src/fundamental_type_info.cc
build/gabi++/src/new.cc
build/gabi++/src/pbase_type_info.cc
build/gabi++/src/pointer_to_member_type_info.cc
build/gabi++/src/pointer_type_info.cc
build/gabi++/src/si_class_type_info.cc
build/gabi++/src/type_info.cc
build/gabi++/src/vmi_class_type_info.cc
build/gabi++/use_rtti.mk
new file mode 100644
--- /dev/null
+++ b/build/gabi++/Android.mk
@@ -0,0 +1,55 @@
+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_MODULE_TAGS := optional
+
+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_MODULE_TAGS := optional
+
+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)
new file mode 100644
--- /dev/null
+++ b/build/gabi++/README.mozilla
@@ -0,0 +1,1 @@
+This copy of libgabi++ is from Android 5.0 source code on https://android.googlesource.com/platform/abi/cpp/.  Tag is android-5.0.0_r1.
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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 __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();
+  };
+}
+
+namespace abi = __cxxabiv1;
+
+#endif /* defined(__GABIXX_CXXABI_H__) */
+
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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__
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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_
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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);
+}
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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;
+}
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/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
new file mode 100644
--- /dev/null
+++ b/build/gabi++/use_rtti.mk
@@ -0,0 +1,8 @@
+# To use RTTI, "include abi/cpp/use_rtti.mk" in your target.
+
+LOCAL_C_INCLUDES := \
+	abi/cpp/include \
+	$(LOCAL_C_INCLUDES)
+
+LOCAL_RTTI_FLAG := -frtti
+LOCAL_SHARED_LIBRARIES += libgabi++