Commit b54c93b7 by Joseph Myers Committed by Joseph Myers

bpapi.h (TARGET_BPABI_CPP_BUILTINS): Define __GXX_TYPEINFO_EQUALITY_INLINE but…

bpapi.h (TARGET_BPABI_CPP_BUILTINS): Define __GXX_TYPEINFO_EQUALITY_INLINE but not __GXX_MERGED_TYPEINFO_NAMES.

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
parent 5da10ac7
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> 2006-11-13 H.J. Lu <hongjiu.lu@intel.com>
Zdenek Dvorak <dvorakz@suse.cz> Zdenek Dvorak <dvorakz@suse.cz>
......
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
#define TARGET_BPABI_CPP_BUILTINS() \ #define TARGET_BPABI_CPP_BUILTINS() \
do \ do \
{ \ { \
builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \ builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); \
} \ } \
while (false) while (false)
......
...@@ -79,13 +79,16 @@ ...@@ -79,13 +79,16 @@
/* Define the __symbian__ macro. */ /* Define the __symbian__ macro. */
#undef TARGET_OS_CPP_BUILTINS #undef TARGET_OS_CPP_BUILTINS
#define TARGET_OS_CPP_BUILTINS() \ #define TARGET_OS_CPP_BUILTINS() \
do \ do \
{ \ { \
/* Include the default BPABI stuff. */ \ /* Include the default BPABI stuff. */ \
TARGET_BPABI_CPP_BUILTINS (); \ TARGET_BPABI_CPP_BUILTINS (); \
builtin_define ("__symbian__"); \ /* Symbian OS does not support merging symbols across DLL \
} \ boundaries. */ \
builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \
builtin_define ("__symbian__"); \
} \
while (false) while (false)
/* On SymbianOS, these sections are not writable, so we use "a", /* On SymbianOS, these sections are not writable, so we use "a",
......
...@@ -70,6 +70,7 @@ Boston, MA 02110-1301, USA. */ ...@@ -70,6 +70,7 @@ Boston, MA 02110-1301, USA. */
/* Even though linkonce works with static libs, this is needed \ /* Even though linkonce works with static libs, this is needed \
to compare typeinfo symbols across dll boundaries. */ \ to compare typeinfo symbols across dll boundaries. */ \
builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \ builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \
builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); \
MAYBE_UWIN_CPP_BUILTINS (); \ MAYBE_UWIN_CPP_BUILTINS (); \
EXTRA_OS_CPP_BUILTINS (); \ EXTRA_OS_CPP_BUILTINS (); \
} \ } \
......
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> 2006-11-12 Paolo Carlini <pcarlini@suse.de>
* include/ext/bitmap_allocator.h: Uglify some names. * include/ext/bitmap_allocator.h: Uglify some names.
......
...@@ -44,13 +44,17 @@ std::type_info:: ...@@ -44,13 +44,17 @@ std::type_info::
std::bad_cast::~bad_cast() throw() { } std::bad_cast::~bad_cast() throw() { }
std::bad_typeid::~bad_typeid() 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. // We can't rely on common symbols being shared between shared objects.
bool std::type_info:: bool std::type_info::
operator== (const std::type_info& arg) const 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); return (&arg == this) || (__builtin_strcmp (name (), arg.name ()) == 0);
#endif
} }
#endif #endif
......
...@@ -38,12 +38,16 @@ extern "C" void abort (); ...@@ -38,12 +38,16 @@ extern "C" void abort ();
using std::type_info; using std::type_info;
#if !__GXX_MERGED_TYPEINFO_NAMES #if !__GXX_TYPEINFO_EQUALITY_INLINE
bool bool
type_info::before (const type_info &arg) const 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; return __builtin_strcmp (name (), arg.name ()) < 0;
#endif
} }
#endif #endif
......
...@@ -46,6 +46,22 @@ namespace __cxxabiv1 ...@@ -46,6 +46,22 @@ namespace __cxxabiv1
class __class_type_info; class __class_type_info;
} // namespace __cxxabiv1 } // 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 #ifndef __GXX_MERGED_TYPEINFO_NAMES
#if !__GXX_WEAK__ #if !__GXX_WEAK__
// If weak symbols are not supported, typeinfo names are not merged. // If weak symbols are not supported, typeinfo names are not merged.
...@@ -56,6 +72,15 @@ namespace __cxxabiv1 ...@@ -56,6 +72,15 @@ namespace __cxxabiv1
#endif #endif
#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 namespace std
{ {
/** /**
...@@ -91,13 +116,16 @@ namespace std ...@@ -91,13 +116,16 @@ namespace std
const char* name() const const char* name() const
{ return __name; } { return __name; }
#if !__GXX_MERGED_TYPEINFO_NAMES #if !__GXX_TYPEINFO_EQUALITY_INLINE
bool before(const type_info& __arg) const; bool before(const type_info& __arg) const;
// In old abi, or when weak symbols are not supported, there can // In old abi, or when weak symbols are not supported, there can
// be multiple instances of a type_info object for one // be multiple instances of a type_info object for one
// type. Uniqueness must use the _name value, not object address. // type. Uniqueness must use the _name value, not object address.
bool operator==(const type_info& __arg) const; bool operator==(const type_info& __arg) const;
#else #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 /** Returns true if @c *this precedes @c __arg in the implementation's
* collation order. */ * collation order. */
// In new abi we can rely on type_info's NTBS being unique, // In new abi we can rely on type_info's NTBS being unique,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment