This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 58f226d2b5 libcxxmini: Add missing runtime related classes.
58f226d2b5 is described below

commit 58f226d2b5fd0fb84956f811d559cb80f5ffc969
Author: cuiziwei <[email protected]>
AuthorDate: Mon Nov 11 18:44:29 2024 +0800

    libcxxmini: Add missing runtime related classes.
    
    reference:https://github.com/libcxxrt/libcxxrt/tree/master/src
    
    Signed-off-by: cuiziwei <[email protected]>
---
 libs/libxx/libcxxmini/CMakeLists.txt         |   4 +-
 libs/libxx/libcxxmini/Make.defs              |   1 +
 libs/libxx/libcxxmini/libxx_dynamic_cast.cxx | 182 ++++++++++++++++++
 libs/libxx/libcxxmini/libxx_typeinfo.cxx     |  83 ++++++++
 libs/libxx/libcxxmini/libxx_typeinfo.h       | 273 +++++++++++++++++++++++++++
 5 files changed, 542 insertions(+), 1 deletion(-)

diff --git a/libs/libxx/libcxxmini/CMakeLists.txt 
b/libs/libxx/libcxxmini/CMakeLists.txt
index c318c71791..a4d3192d9c 100644
--- a/libs/libxx/libcxxmini/CMakeLists.txt
+++ b/libs/libxx/libcxxmini/CMakeLists.txt
@@ -37,7 +37,9 @@ if(CONFIG_LIBCXXMINI)
             libxx_deletea.cxx
             libxx_deletea_sized.cxx
             libxx_new.cxx
-            libxx_newa.cxx)
+            libxx_newa.cxx
+            libxx_dynamic_cast.cxx
+            libxx_typeinfo.cxx)
 
   # Why c++14? * libcxx seems to require c++11. * The compiler defaults varies:
   # clang/macOS (from xcode): 199711L gcc/ubuntu:               201402L * There
diff --git a/libs/libxx/libcxxmini/Make.defs b/libs/libxx/libcxxmini/Make.defs
index 85df3f7846..6cd7543362 100644
--- a/libs/libxx/libcxxmini/Make.defs
+++ b/libs/libxx/libcxxmini/Make.defs
@@ -23,6 +23,7 @@
 CXXSRCS += libxx_cxa_guard.cxx libxx_cxapurevirtual.cxx
 CXXSRCS += libxx_delete.cxx libxx_delete_sized.cxx libxx_deletea.cxx
 CXXSRCS += libxx_deletea_sized.cxx libxx_new.cxx libxx_newa.cxx
+CXXSRCS += libxx_dynamic_cast.cxx libxx_typeinfo.cxx
 
 ifneq ($(CONFIG_XTENSA_TOOLCHAIN_XCC), y)
   CXXFLAGS += -Wno-missing-exception-spec
diff --git a/libs/libxx/libcxxmini/libxx_dynamic_cast.cxx 
b/libs/libxx/libcxxmini/libxx_dynamic_cast.cxx
new file mode 100644
index 0000000000..046dea0722
--- /dev/null
+++ b/libs/libxx/libcxxmini/libxx_dynamic_cast.cxx
@@ -0,0 +1,182 @@
+/****************************************************************************
+ * libs/libxx/libcxxmini/libxx_dynamic_cast.cxx
+ *
+ * Copyright 2010-2011 PathScale, Inc. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "libxx_typeinfo.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+using namespace __cxxabiv1;
+
+#define ADD_TO_PTR(x, off) \
+        reinterpret_cast<__typeof__(x)>(reinterpret_cast<char*>(x) + off)
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct vtable_header
+{
+  /* Offset of the leaf object. */
+
+  ptrdiff_t leaf_offset;
+
+  /* Type of the object. */
+
+  const __class_type_info *type;
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+bool std::type_info::__do_catch(std::type_info const *ex_type,
+                                void **exception_object,
+                                unsigned int outer) const
+{
+  const type_info *type = this;
+
+  if (type == ex_type)
+  {
+    return true;
+  }
+
+#ifdef CONFIG_CXX_RTTI
+  if (const __class_type_info *cti = dynamic_cast<const __class_type_info 
*>(type))
+  {
+    return ex_type->__do_upcast(cti, exception_object);
+  }
+#endif
+
+  return false;
+}
+
+void *__class_type_info::cast_to(
+                void *obj, const struct __class_type_info *other) const
+{
+  if (this == other)
+  {
+    return obj;
+  }
+  return 0;
+}
+
+void *__si_class_type_info::cast_to(
+                void *obj, const struct __class_type_info *other) const
+{
+  if (this == other)
+  {
+    return obj;
+  }
+  return __base_type->cast_to(obj, other);
+}
+
+bool __si_class_type_info::__do_upcast(const __class_type_info *target,
+                                     void **thrown_object) const
+{
+  if (this == target)
+  {
+    return true;
+  }
+  return __base_type->__do_upcast(target, thrown_object);
+}
+
+void *__vmi_class_type_info::cast_to(
+                void *obj, const struct __class_type_info *other) const
+{
+  if (__do_upcast(other, &obj))
+  {
+    return obj;
+  }
+  return 0;
+}
+
+bool __vmi_class_type_info::__do_upcast(const __class_type_info *target,
+                          void **thrown_object) const
+{
+  if (this == target)
+  {
+    return true;
+  }
+  for (unsigned int i=0 ; i<__base_count ; i++)
+  {
+    const __base_class_type_info *info = &__base_info[i];
+    ptrdiff_t offset = info->offset();
+
+    /* If this is a virtual superclass, the offset is stored in the
+     * object's vtable at the offset requested; 2.9.5.6.c:
+     *
+     * '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).'
+     */
+
+    void *obj = *thrown_object;
+    if (info->is_virtual())
+    {
+      // Object's vtable
+      ptrdiff_t *off = *static_cast<ptrdiff_t**>(obj);
+      // Offset location in vtable
+      off = ADD_TO_PTR(off, offset);
+      offset = *off;
+    }
+    void *cast = ADD_TO_PTR(obj, offset);
+
+    if (info->__base_type == target ||
+        (info->__base_type->__do_upcast(target, &cast)))
+    {
+      *thrown_object = cast;
+      return true;
+    }
+  }
+  return 0;
+}
+
+#ifdef CONFIG_CXX_RTTI
+extern "C" void* __dynamic_cast(const void *sub,
+                                const __class_type_info *src,
+                                const __class_type_info *dst,
+                                ptrdiff_t src2dst_offset)
+{
+  const char *vtable_location = *static_cast<const char * const *>(sub);
+  const vtable_header *header =
+    reinterpret_cast<const vtable_header*>(vtable_location - 
sizeof(vtable_header));
+  void *leaf = ADD_TO_PTR(const_cast<void *>(sub), header->leaf_offset);
+  return header->type->cast_to(leaf, dst);
+}
+#endif
diff --git a/libs/libxx/libcxxmini/libxx_typeinfo.cxx 
b/libs/libxx/libcxxmini/libxx_typeinfo.cxx
new file mode 100644
index 0000000000..662dcad790
--- /dev/null
+++ b/libs/libxx/libcxxmini/libxx_typeinfo.cxx
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * libs/libxx/libcxxmini/libxx_typeinfo.cxx
+ *
+ * Copyright 2010-2011 PathScale, Inc. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include "libxx_typeinfo.h"
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+using std::type_info;
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+type_info::~type_info() {}
+
+bool type_info::operator==(const type_info &other) const
+{
+  return __type_name == other.__type_name;
+}
+
+bool type_info::operator!=(const type_info &other) const
+{
+  return __type_name != other.__type_name;
+}
+
+bool type_info::before(const type_info &other) const
+{
+  return __type_name < other.__type_name;
+}
+
+const char* type_info::name() const
+{
+  return __type_name;
+}
+
+type_info::type_info (const type_info& rhs)
+{
+  __type_name = rhs.__type_name;
+}
+
+type_info& type_info::operator= (const type_info& rhs)
+{
+  return *new type_info(rhs);
+}
+
+__cxxabiv1::__class_type_info::~__class_type_info() {}
+__cxxabiv1::__si_class_type_info::~__si_class_type_info() {}
+__cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info() {}
diff --git a/libs/libxx/libcxxmini/libxx_typeinfo.h 
b/libs/libxx/libcxxmini/libxx_typeinfo.h
new file mode 100644
index 0000000000..8feb10ed9f
--- /dev/null
+++ b/libs/libxx/libcxxmini/libxx_typeinfo.h
@@ -0,0 +1,273 @@
+/****************************************************************************
+ * libs/libxx/libcxxmini/libxx_typeinfo.h
+ *
+ * Copyright 2010-2011 PathScale, Inc. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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 _LIBCPPMINI_TYPEINFO_H
+#define _LIBCPPMINI_TYPEINFO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <stddef.h>
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+namespace __cxxabiv1
+{
+  struct __class_type_info;
+}
+
+namespace std
+{
+  /* Standard type info class.  The layout of this class is specified by the
+   * ABI.  The layout of the vtable is not, but is intended to be
+   * compatible with the GNU ABI.
+   *
+   * Unlike the GNU version, the vtable layout is considered semi-private.
+   */
+
+  class type_info
+    {
+      public:
+
+      /* Virtual destructor.  This class must have one virtual function to
+       * ensure that it has a vtable.
+       */
+
+      virtual ~type_info();
+      bool operator == (const type_info &rhs) const;
+      bool operator != (const type_info &rhs) const;
+      bool before(const type_info &rhs) const;
+      const char *name() const;
+      type_info();
+      private:
+      type_info(const type_info &rhs);
+      type_info &operator = (const type_info &rhs);
+      const char *__type_name;
+
+      /* The following functions are in this order to match the
+       * vtable layout of libsupc++.  This allows libcxxrt to be used
+       * with libraries that depend on this.
+       *
+       * These functions are in the public headers for libstdc++, so
+       * we have to assume that someone will probably call them and
+       * expect them to work.  Their names must also match the names used in
+       * libsupc++, so that code linking against this library can subclass
+       * type_info and correctly fill in the values in the vtables.
+       */
+
+      public:
+
+      /* Returns true if this is some pointer type, false otherwise. */
+
+      virtual bool __is_pointer_p() const
+        {
+          return false;
+        }
+
+      /* Returns true if this is some function type, false otherwise. */
+
+      virtual bool __is_function_p() const
+        {
+          return false;
+        }
+
+      /* Catch function.  Allows external libraries to implement
+       * their own basic types.  This is used, for example, in the
+       * GNUstep Objective-C runtime to allow Objective-C types to be
+       * caught in G++ catch blocks.
+       *
+       * The outer parameter indicates the number of outer pointers
+       * in the high bits.  The low bit indicates whether the
+       * pointers are const qualified.
+       */
+
+      virtual bool __do_catch(const type_info *thrown_type,
+                              void **thrown_object,
+                              unsigned outer) const;
+
+      /* Performs an upcast.  This is used in exception handling to
+       * cast from subclasses to superclasses.  If the upcast is
+       * possible, it returns true and adjusts the pointer.  If the
+       * upcast is not possible, it returns false and does not adjust
+       * the pointer.
+       */
+
+      virtual bool __do_upcast(
+                      const __cxxabiv1::__class_type_info *target,
+                      void **thrown_object) const
+      {
+        return false;
+      }
+    };
+}
+
+namespace __cxxabiv1
+{
+  /* Base class for class type info.  Used only for tentative definitions. */
+
+  struct __class_type_info : public std::type_info
+  {
+    virtual ~__class_type_info();
+
+    /* Function implementing dynamic casts. */
+
+    virtual void *cast_to(
+                    void *obj, const struct __class_type_info *other) const;
+    virtual bool __do_upcast(const __class_type_info *target,
+                            void **thrown_object) const
+    {
+      return this == target;
+    }
+  };
+
+  /* Single-inheritance class type info.  This is used for classes containing
+   * a single non-virtual base class at offset 0.
+   */
+
+  struct __si_class_type_info : public __class_type_info
+  {
+    virtual ~__si_class_type_info();
+    const __class_type_info *__base_type;
+    virtual bool __do_upcast(
+                    const __cxxabiv1::__class_type_info *target,
+                    void **thrown_object) const;
+    virtual void *cast_to(
+                    void *obj, const struct __class_type_info *other) const;
+  };
+
+  /* Type info for base classes.  Classes with multiple bases store an array
+   * of these, one for each superclass.
+   */
+
+  struct __base_class_type_info
+  {
+    const __class_type_info *__base_type;
+    private:
+
+      /* The high __offset_shift bits of this store the (signed) offset
+       * of the base class.  The low bits store flags from
+       * __offset_flags_masks.
+       */
+
+      long __offset_flags;
+
+      /* Flags used in the low bits of __offset_flags. */
+
+      enum __offset_flags_masks
+      {
+        /* This base class is virtual. */
+
+        __virtual_mask = 0x1,
+
+        /* This base class is public. */
+
+        __public_mask = 0x2,
+
+        /* The number of bits reserved for flags. */
+
+        __offset_shift = 8
+      };
+    public:
+
+      /* Returns the offset of the base class. */
+
+      long offset() const
+      {
+        return __offset_flags >> __offset_shift;
+      }
+
+      /* Returns the flags. */
+
+      long flags() const
+      {
+        return __offset_flags & ((1 << __offset_shift) - 1);
+      }
+
+      /* Returns whether this is a public base class. */
+
+      bool is_public() const
+      {
+        return flags() & __public_mask;
+      }
+
+      /*  Returns whether this is a virtual base class. */
+
+      bool is_virtual() const
+      {
+        return flags() & __virtual_mask;
+      }
+  };
+
+  /* Type info for classes with virtual bases or multiple superclasses. */
+
+  struct __vmi_class_type_info : public __class_type_info
+  {
+    virtual ~__vmi_class_type_info();
+
+    /* Flags describing this class.  Contains values from __flags_masks. */
+
+    unsigned int __flags;
+
+    /* The number of base classes. */
+
+    unsigned int __base_count;
+
+/* Array of base classes - this actually has __base_count elements, not
+ * 1.
+ */
+
+    __base_class_type_info __base_info[1];
+
+    /* Flags used in the __flags field. */
+
+    enum __flags_masks
+    {
+      /* The class has non-diamond repeated inheritance. */
+
+      __non_diamond_repeat_mask = 0x1,
+
+      /* The class is diamond shaped. */
+
+      __diamond_shaped_mask = 0x2
+    };
+    virtual bool __do_upcast(
+                    const __cxxabiv1::__class_type_info *target,
+                    void **thrown_object) const;
+    virtual void *cast_to(
+                    void *obj, const struct __class_type_info *other) const;
+  };
+}
+
+#endif /* _LIBCPPMINI_TYPEINFO_H */

Reply via email to