]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
bpapi.h (TARGET_BPABI_CPP_BUILTINS): Define __GXX_TYPEINFO_EQUALITY_INLINE but not...
authorJoseph Myers <joseph@codesourcery.com>
Mon, 13 Nov 2006 13:10:17 +0000 (13:10 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Mon, 13 Nov 2006 13:10:17 +0000 (13:10 +0000)
gcc:
* config/arm/bpapi.h (TARGET_BPABI_CPP_BUILTINS): Define
__GXX_TYPEINFO_EQUALITY_INLINE but not
__GXX_MERGED_TYPEINFO_NAMES.
* config/arm/symbian.h (TARGET_OS_CPP_BUILTINS): Define
__GXX_MERGED_TYPEINFO_NAMES.
* config/i386/cygming.h (TARGET_OS_CPP_BUILTINS): Define
__GXX_TYPEINFO_EQUALITY_INLINE.

libstdc++-v3:
* libsupc++/typeinfo (__GXX_TYPEINFO_EQUALITY_INLINE): Define.
Use instead of __GXX_MERGED_TYPEINFO_NAMES to condition inline
definitions.
* libsupc++/tinfo.cc (operator==): Condition on
__GXX_TYPEINFO_EQUALITY_INLINE; check __GXX_MERGED_TYPEINFO_NAMES
to determine algorithm.
* libsupc++/tinfo2.cc (type_info::before): Likewise.

From-SVN: r118755

gcc/ChangeLog
gcc/config/arm/bpabi.h
gcc/config/arm/symbian.h
gcc/config/i386/cygming.h
libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/tinfo.cc
libstdc++-v3/libsupc++/tinfo2.cc
libstdc++-v3/libsupc++/typeinfo

index 78798b24fa201e4806d4f0363f94343232a6c852..00039dc0ad9195bdde0fee29e11401bd49cae7e4 100644 (file)
@@ -1,3 +1,13 @@
+2006-11-13  Joseph Myers  <joseph@codesourcery.com>
+
+       * config/arm/bpapi.h (TARGET_BPABI_CPP_BUILTINS): Define
+       __GXX_TYPEINFO_EQUALITY_INLINE but not
+       __GXX_MERGED_TYPEINFO_NAMES.
+       * config/arm/symbian.h (TARGET_OS_CPP_BUILTINS): Define
+       __GXX_MERGED_TYPEINFO_NAMES.
+       * config/i386/cygming.h (TARGET_OS_CPP_BUILTINS): Define
+       __GXX_TYPEINFO_EQUALITY_INLINE.
+
 2006-11-13  H.J. Lu  <hongjiu.lu@intel.com>
            Zdenek Dvorak <dvorakz@suse.cz>
 
index 4c730885ec0e7b38b16e31ce96829182f10fc8f5..71b2ec580c64f11c7698168989eef3389585bd3c 100644 (file)
 #define TARGET_BPABI_CPP_BUILTINS()                    \
   do                                                   \
     {                                                  \
-      builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0");        \
+      builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0");     \
     }                                                  \
   while (false)
 
index af1ba9a64bb7d03c8d1eb41a3a45556ea165b8b5..eca67db655c02e557cc256c55cf6a864cff49d60 100644 (file)
 
 /* Define the __symbian__ macro.  */
 #undef TARGET_OS_CPP_BUILTINS
-#define TARGET_OS_CPP_BUILTINS()               \
-  do                                           \
-    {                                          \
-      /* Include the default BPABI stuff.  */  \
-      TARGET_BPABI_CPP_BUILTINS ();            \
-      builtin_define ("__symbian__");          \
-    }                                          \
+#define TARGET_OS_CPP_BUILTINS()                               \
+  do                                                           \
+    {                                                          \
+      /* Include the default BPABI stuff.  */                  \
+      TARGET_BPABI_CPP_BUILTINS ();                            \
+      /* Symbian OS does not support merging symbols across DLL        \
+        boundaries.  */                                        \
+      builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0");                \
+      builtin_define ("__symbian__");                          \
+    }                                                          \
   while (false)
 
 /* On SymbianOS, these sections are not writable, so we use "a",
index 957c02eaf31198244f2789dc2aac2744c819b8a5..9b0cd7f0c7999a4220aa2f5d03c5eb4da0423aca 100644 (file)
@@ -70,6 +70,7 @@ Boston, MA 02110-1301, USA.  */
        /* Even though linkonce works with static libs, this is needed  \
            to compare typeinfo symbols across dll boundaries.  */      \
        builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0");               \
+       builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0");            \
        MAYBE_UWIN_CPP_BUILTINS ();                                     \
        EXTRA_OS_CPP_BUILTINS ();                                       \
   }                                                                    \
index 0cb34970347e70538b1274b7230ee6de960e157a..bb9d08ce52c785f2b92448fa1876fa8c9d29bf8e 100644 (file)
@@ -1,3 +1,13 @@
+2006-11-13  Joseph Myers  <joseph@codesourcery.com>
+
+       * libsupc++/typeinfo (__GXX_TYPEINFO_EQUALITY_INLINE): Define.
+       Use instead of __GXX_MERGED_TYPEINFO_NAMES to condition inline
+       definitions.
+       * libsupc++/tinfo.cc (operator==): Condition on
+       __GXX_TYPEINFO_EQUALITY_INLINE; check __GXX_MERGED_TYPEINFO_NAMES
+       to determine algorithm.
+       * libsupc++/tinfo2.cc (type_info::before): Likewise.
+
 2006-11-12  Paolo Carlini  <pcarlini@suse.de>
 
        * include/ext/bitmap_allocator.h: Uglify some names.
index a16488b5fbeaf261c696709ce3171b39d4e08767..a153c2d4d4c533c2ae32ebc0ac8edd9160b53fc8 100644 (file)
@@ -44,13 +44,17 @@ std::type_info::
 std::bad_cast::~bad_cast() throw() { }
 std::bad_typeid::~bad_typeid() throw() { }
 
-#if !__GXX_MERGED_TYPEINFO_NAMES
+#if !__GXX_TYPEINFO_EQUALITY_INLINE
 
 // We can't rely on common symbols being shared between shared objects.
 bool std::type_info::
 operator== (const std::type_info& arg) const
 {
+#if __GXX_MERGED_TYPEINFO_NAMES
+  return name () == arg.name ();
+#else
   return (&arg == this) || (__builtin_strcmp (name (), arg.name ()) == 0);
+#endif
 }
 
 #endif
index 2f5a2cd32bcba23d65ad9401ea0e4a6388f8f514..8fdcac3604a7f019115881a0224f4d7efae98e0b 100644 (file)
@@ -38,12 +38,16 @@ extern "C" void abort ();
 
 using std::type_info;
 
-#if !__GXX_MERGED_TYPEINFO_NAMES
+#if !__GXX_TYPEINFO_EQUALITY_INLINE
 
 bool
 type_info::before (const type_info &arg) const
 {
+#if __GXX_MERGED_TYPEINFO_NAMES
+  return name () < arg.name ();
+#else
   return __builtin_strcmp (name (), arg.name ()) < 0;
+#endif
 }
 
 #endif
index bd7ce6767a7f0de983d2555800147e9b445f0608..fb5957d30dd8944b7a4ede28756f9b32802c6748 100644 (file)
@@ -46,6 +46,22 @@ namespace __cxxabiv1
   class __class_type_info;
 } // namespace __cxxabiv1
 
+// Determine whether typeinfo names for the same type are merged (in which
+// case comparison can just compare pointers) or not (in which case
+// strings must be compared and g++.dg/abi/local1.C will fail), and
+// whether comparison is to be implemented inline or not.  By default we
+// use inline pointer comparison if weak symbols are available, and
+// out-of-line strcmp if not.  Out-of-line pointer comparison is used
+// where the object files are to be portable to multiple systems, some of
+// which may not be able to use pointer comparison, but the particular
+// system for which libstdc++ is being built can use pointer comparison;
+// in particular for most ARM EABI systems, where the ABI specifies
+// out-of-line comparison.  Inline strcmp is not currently supported.  The
+// compiler's target configuration can override the defaults by defining
+// __GXX_TYPEINFO_EQUALITY_INLINE to 1 or 0 to indicate whether or not
+// comparison is inline, and __GXX_MERGED_TYPEINFO_NAMES to 1 or 0 to
+// indicate whether or not pointer comparison can be used.
+
 #ifndef __GXX_MERGED_TYPEINFO_NAMES
   #if !__GXX_WEAK__
     // If weak symbols are not supported, typeinfo names are not merged.
@@ -56,6 +72,15 @@ namespace __cxxabiv1
   #endif
 #endif
 
+// By default follow the same rules as for __GXX_MERGED_TYPEINFO_NAMES.
+#ifndef __GXX_TYPEINFO_EQUALITY_INLINE
+  #if !__GXX_WEAK__
+    #define __GXX_TYPEINFO_EQUALITY_INLINE 0
+  #else
+    #define __GXX_TYPEINFO_EQUALITY_INLINE 1
+  #endif
+#endif
+
 namespace std 
 {
   /**
@@ -91,13 +116,16 @@ namespace std
     const char* name() const
     { return __name; }
 
-#if !__GXX_MERGED_TYPEINFO_NAMES
+#if !__GXX_TYPEINFO_EQUALITY_INLINE
     bool before(const type_info& __arg) const;
     // In old abi, or when weak symbols are not supported, there can
     // be multiple instances of a type_info object for one
     // type. Uniqueness must use the _name value, not object address.
     bool operator==(const type_info& __arg) const;
 #else
+  #if !__GXX_MERGED_TYPEINFO_NAMES
+    #error "Inline implementation of type_info comparision requires merging of type_info objects"
+  #endif
     /** Returns true if @c *this precedes @c __arg in the implementation's
      *  collation order.  */
     // In new abi we can rely on type_info's NTBS being unique,