Skip to content

Commit

Permalink
libcxx: Use vcruntime declarations for typeinfo on Windows.
Browse files Browse the repository at this point in the history
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

llvm-svn: 323491
  • Loading branch information
pcc committed Jan 26, 2018
1 parent 0aa71a4 commit 1634c15
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 3 deletions.
6 changes: 6 additions & 0 deletions libcxx/include/typeinfo
Expand Up @@ -69,6 +69,10 @@ public:
#pragma GCC system_header
#endif

#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
#include <vcruntime_typeinfo.h>
#else

#if !defined(_LIBCPP_ABI_MICROSOFT)
#if defined(_LIBCPP_NONUNIQUE_RTTI_BIT)
#define _LIBCPP_HAS_NONUNIQUE_TYPEINFO
Expand Down Expand Up @@ -219,6 +223,8 @@ public:

} // std

#endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)

_LIBCPP_BEGIN_NAMESPACE_STD
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
void __throw_bad_cast()
Expand Down
2 changes: 1 addition & 1 deletion libcxx/src/support/runtime/exception_msvc.ipp
Expand Up @@ -97,6 +97,7 @@ bad_array_length::what() const _NOEXCEPT
return "bad_array_length";
}

#if defined(_LIBCPP_NO_VCRUNTIME)
bad_cast::bad_cast() _NOEXCEPT
{
}
Expand Down Expand Up @@ -125,7 +126,6 @@ bad_typeid::what() const _NOEXCEPT
return "std::bad_typeid";
}

#if defined(_LIBCPP_NO_VCRUNTIME)
exception::~exception() _NOEXCEPT
{
}
Expand Down
5 changes: 3 additions & 2 deletions libcxx/src/typeinfo.cpp
Expand Up @@ -9,7 +9,7 @@

#include "typeinfo"

#if defined(_LIBCPP_ABI_MICROSOFT)
#if defined(_LIBCPP_ABI_MICROSOFT) && defined(_LIBCPP_NO_VCRUNTIME)
#include <string.h>

int std::type_info::__compare(const type_info &__rhs) const _NOEXCEPT {
Expand Down Expand Up @@ -49,7 +49,8 @@ size_t std::type_info::hash_code() const _NOEXCEPT {
// FIXME: Remove __APPLE__ default here once buildit is gone.
// FIXME: Remove the _LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY configuration.
#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)
std::type_info::~type_info()
{
Expand Down

0 comments on commit 1634c15

Please sign in to comment.