mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-21 23:30:38 +08:00
libcxx: Use vcruntime declarations for typeinfo on Windows.
We need to use the vcruntime declarations on Windows to avoid an ODR violation involving rtti.obj, which provides the definition of the runtime function implementing dynamic_cast and depends on the vcruntime implementations of bad_cast and bad_typeid. Differential Revision: https://reviews.llvm.org/D42220 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@323491 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -69,6 +69,10 @@ public:
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
|
||||||
|
#include <vcruntime_typeinfo.h>
|
||||||
|
#else
|
||||||
|
|
||||||
#if !defined(_LIBCPP_ABI_MICROSOFT)
|
#if !defined(_LIBCPP_ABI_MICROSOFT)
|
||||||
#if defined(_LIBCPP_NONUNIQUE_RTTI_BIT)
|
#if defined(_LIBCPP_NONUNIQUE_RTTI_BIT)
|
||||||
#define _LIBCPP_HAS_NONUNIQUE_TYPEINFO
|
#define _LIBCPP_HAS_NONUNIQUE_TYPEINFO
|
||||||
@@ -219,6 +223,8 @@ public:
|
|||||||
|
|
||||||
} // std
|
} // std
|
||||||
|
|
||||||
|
#endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||||
void __throw_bad_cast()
|
void __throw_bad_cast()
|
||||||
|
@@ -97,6 +97,7 @@ bad_array_length::what() const _NOEXCEPT
|
|||||||
return "bad_array_length";
|
return "bad_array_length";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_NO_VCRUNTIME)
|
||||||
bad_cast::bad_cast() _NOEXCEPT
|
bad_cast::bad_cast() _NOEXCEPT
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -125,7 +126,6 @@ bad_typeid::what() const _NOEXCEPT
|
|||||||
return "std::bad_typeid";
|
return "std::bad_typeid";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_LIBCPP_NO_VCRUNTIME)
|
|
||||||
exception::~exception() _NOEXCEPT
|
exception::~exception() _NOEXCEPT
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "typeinfo"
|
#include "typeinfo"
|
||||||
|
|
||||||
#if defined(_LIBCPP_ABI_MICROSOFT)
|
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(_LIBCPP_NO_VCRUNTIME)
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
int std::type_info::__compare(const type_info &__rhs) const _NOEXCEPT {
|
int std::type_info::__compare(const type_info &__rhs) const _NOEXCEPT {
|
||||||
@@ -49,7 +49,8 @@ size_t std::type_info::hash_code() const _NOEXCEPT {
|
|||||||
// FIXME: Remove __APPLE__ default here once buildit is gone.
|
// FIXME: Remove __APPLE__ default here once buildit is gone.
|
||||||
// FIXME: Remove the _LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY configuration.
|
// FIXME: Remove the _LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY configuration.
|
||||||
#if (!defined(LIBCXX_BUILDING_LIBCXXABI) && !defined(LIBCXXRT) && \
|
#if (!defined(LIBCXX_BUILDING_LIBCXXABI) && !defined(LIBCXXRT) && \
|
||||||
!defined(__GLIBCXX__) && !defined(__APPLE__)) || \
|
!defined(__GLIBCXX__) && !defined(__APPLE__) && \
|
||||||
|
!(defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME))) || \
|
||||||
defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
|
defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
|
||||||
std::type_info::~type_info()
|
std::type_info::~type_info()
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user