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
This commit is contained in:
parent
5da10ac71f
commit
b54c93b7b8
@ -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>
|
||||
|
||||
|
@ -102,7 +102,7 @@
|
||||
#define TARGET_BPABI_CPP_BUILTINS() \
|
||||
do \
|
||||
{ \
|
||||
builtin_define ("__GXX_MERGED_TYPEINFO_NAMES=0"); \
|
||||
builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0"); \
|
||||
} \
|
||||
while (false)
|
||||
|
||||
|
@ -79,13 +79,16 @@
|
||||
|
||||
/* 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",
|
||||
|
@ -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 (); \
|
||||
} \
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user