summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-01-02 18:41:48 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-01-02 18:41:48 +0000
commit8bcade547a7be1aa81e9ed2c81b3e120d6a620bb (patch)
tree5d3b99efb17a1407500649b4f239da246f6064c1
parent841261624dd05d33cf1075c4ec0a99cd2d2381c7 (diff)
downloadbcm5719-llvm-8bcade547a7be1aa81e9ed2c81b3e120d6a620bb.tar.gz
bcm5719-llvm-8bcade547a7be1aa81e9ed2c81b3e120d6a620bb.zip
locale: update ctype access for MSVC CRT 14+
Visual C++ 14 and newer split msvcrt into msvcrt and ucrt with flavours of the ucrt for different environments. This changed the access to the ctype table by introducing the `__pctype_func` and `__pwctype_func` accessors. Use this rather than directly accessing `_ctype` which allows us to be safer in threaded situations by going through the libc locking. llvm-svn: 290823
-rw-r--r--libcxx/include/support/win32/locale_win32.h6
-rw-r--r--libcxx/src/locale.cpp11
2 files changed, 14 insertions, 3 deletions
diff --git a/libcxx/include/support/win32/locale_win32.h b/libcxx/include/support/win32/locale_win32.h
index 0f5527e570a..ebf5bda740a 100644
--- a/libcxx/include/support/win32/locale_win32.h
+++ b/libcxx/include/support/win32/locale_win32.h
@@ -11,8 +11,12 @@
#ifndef _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
#define _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
+#include <crtversion.h>
+
+#if _VC_CRT_MAJOR_VERSION < 14
// ctype mask table defined in msvcrt.dll
-extern "C" unsigned short __declspec(dllimport) _ctype[];
+extern "C" unsigned short __declspec(dllimport) _ctype[];
+#endif
#include "support/win32/support.h"
#include "support/win32/locale_mgmt_win32.h"
diff --git a/libcxx/src/locale.cpp b/libcxx/src/locale.cpp
index 5d6ccd5fb02..5c7fa08aa5b 100644
--- a/libcxx/src/locale.cpp
+++ b/libcxx/src/locale.cpp
@@ -24,6 +24,9 @@
#endif
#include "clocale"
#include "cstring"
+#if defined(_LIBCPP_MSVCRT)
+#define _CTYPE_DISABLE_MACROS
+#endif
#include "cwctype"
#include "__sso_allocator"
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
@@ -1108,9 +1111,13 @@ ctype<char>::classic_table() _NOEXCEPT
#elif __sun__
return __ctype_mask;
#elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
+#if _VC_CRT_MAJOR_VERSION < 14
+ // This is assumed to be safe, which is a nonsense assumption because we're
+ // going to end up dereferencing it later...
return _ctype+1; // internal ctype mask table defined in msvcrt.dll
-// This is assumed to be safe, which is a nonsense assumption because we're
-// going to end up dereferencing it later...
+#else
+ return __pctype_func();
+#endif
#elif defined(__EMSCRIPTEN__)
return *__ctype_b_loc();
#elif defined(_NEWLIB_VERSION)
OpenPOWER on IntegriCloud