1eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
2111e0cbeSNick Kledzik //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6111e0cbeSNick Kledzik //
7111e0cbeSNick Kledzik //===----------------------------------------------------------------------===//
8111e0cbeSNick Kledzik 
9*bbb0f2c7SArthur O'Dwyer #include <typeinfo>
10111e0cbeSNick Kledzik 
11e69290dcSEric Fiselier #if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_ABI_VCRUNTIME)
12*bbb0f2c7SArthur O'Dwyer 
13e7b38cdcSSaleem Abdulrasool #include <string.h>
14e7b38cdcSSaleem Abdulrasool 
__compare(const type_info & __rhs) const155601305fSLouis Dionne int std::type_info::__compare(const type_info &__rhs) const noexcept {
16e7b38cdcSSaleem Abdulrasool   if (&__data == &__rhs.__data)
17e7b38cdcSSaleem Abdulrasool     return 0;
18e7b38cdcSSaleem Abdulrasool   return strcmp(&__data.__decorated_name[1], &__rhs.__data.__decorated_name[1]);
19e7b38cdcSSaleem Abdulrasool }
20e7b38cdcSSaleem Abdulrasool 
name() const215601305fSLouis Dionne const char *std::type_info::name() const noexcept {
22e7b38cdcSSaleem Abdulrasool   // TODO(compnerd) cache demangled &__data.__decorated_name[1]
23e7b38cdcSSaleem Abdulrasool   return &__data.__decorated_name[1];
24e7b38cdcSSaleem Abdulrasool }
25e7b38cdcSSaleem Abdulrasool 
hash_code() const265601305fSLouis Dionne size_t std::type_info::hash_code() const noexcept {
27e7b38cdcSSaleem Abdulrasool #if defined(_WIN64)
28e7b38cdcSSaleem Abdulrasool   constexpr size_t fnv_offset_basis = 14695981039346656037ull;
29e7b38cdcSSaleem Abdulrasool   constexpr size_t fnv_prime = 10995116282110ull;
30e7b38cdcSSaleem Abdulrasool #else
31e7b38cdcSSaleem Abdulrasool   constexpr size_t fnv_offset_basis = 2166136261ull;
32e7b38cdcSSaleem Abdulrasool   constexpr size_t fnv_prime = 16777619ull;
33e7b38cdcSSaleem Abdulrasool #endif
34e7b38cdcSSaleem Abdulrasool 
35e7b38cdcSSaleem Abdulrasool   size_t value = fnv_offset_basis;
36e7b38cdcSSaleem Abdulrasool   for (const char* c = &__data.__decorated_name[1]; *c; ++c) {
37e7b38cdcSSaleem Abdulrasool     value ^= static_cast<size_t>(static_cast<unsigned char>(*c));
38e7b38cdcSSaleem Abdulrasool     value *= fnv_prime;
39e7b38cdcSSaleem Abdulrasool   }
40e7b38cdcSSaleem Abdulrasool 
41e7b38cdcSSaleem Abdulrasool #if defined(_WIN64)
42e7b38cdcSSaleem Abdulrasool   value ^= value >> 32;
43e7b38cdcSSaleem Abdulrasool #endif
44e7b38cdcSSaleem Abdulrasool 
45e7b38cdcSSaleem Abdulrasool   return value;
46e7b38cdcSSaleem Abdulrasool }
47e7b38cdcSSaleem Abdulrasool #endif // _LIBCPP_ABI_MICROSOFT
48e7b38cdcSSaleem Abdulrasool 
49e7b38cdcSSaleem Abdulrasool // FIXME: Remove the _LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY configuration.
50d524fe5bSLouis Dionne #if (!defined(LIBCXX_BUILDING_LIBCXXABI) &&               \
51d524fe5bSLouis Dionne      !defined(LIBCXXRT) &&                                \
52d524fe5bSLouis Dionne      !defined(__GLIBCXX__) &&                             \
53e69290dcSEric Fiselier      !defined(_LIBCPP_ABI_VCRUNTIME)) ||                  \
54e7b38cdcSSaleem Abdulrasool     defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
~type_info()551285e4d6SEric Fiselier std::type_info::~type_info()
561285e4d6SEric Fiselier {
571285e4d6SEric Fiselier }
581285e4d6SEric Fiselier #endif
59