summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2017-05-31 22:14:05 +0000
committerEric Fiselier <eric@efcs.ca>2017-05-31 22:14:05 +0000
commit1ec026252b3027f06c8a561d93fc0a3801107bba (patch)
tree1f2f3fb8bb2fcac2fa57ada4189b42c73f0d0fe4
parent27db230ab05a685268b94f7296a99d380ab04611 (diff)
downloadbcm5719-llvm-1ec026252b3027f06c8a561d93fc0a3801107bba.tar.gz
bcm5719-llvm-1ec026252b3027f06c8a561d93fc0a3801107bba.zip
Fix Libc++ build with MinGW64
Summary: This patch corrects the build errors I encountered when building on MinGW64. Reviewers: mati865, rnk, compnerd, smeenai, bcraig Reviewed By: mati865, smeenai Subscribers: martell, chapuni, cfe-commits Differential Revision: https://reviews.llvm.org/D33082 llvm-svn: 304360
-rw-r--r--libcxx/include/__config4
-rw-r--r--libcxx/include/__locale4
-rw-r--r--libcxx/include/locale9
-rw-r--r--libcxx/include/stdio.h3
-rw-r--r--libcxx/include/support/win32/locale_win32.h15
-rw-r--r--libcxx/include/wchar.h2
-rw-r--r--libcxx/src/chrono.cpp2
-rw-r--r--libcxx/src/new.cpp4
-rw-r--r--libcxx/src/support/win32/locale_win32.cpp24
-rw-r--r--libcxx/src/support/win32/support.cpp11
-rw-r--r--libcxx/src/system_error.cpp2
-rw-r--r--libcxx/src/thread.cpp2
12 files changed, 45 insertions, 37 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config
index ec007907c73..212a2d53136 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -220,10 +220,12 @@
#endif // __NetBSD__
#if defined(_WIN32)
-# define _LIBCPP_WIN32API 1
+# define _LIBCPP_WIN32API
# define _LIBCPP_LITTLE_ENDIAN 1
# define _LIBCPP_BIG_ENDIAN 0
# define _LIBCPP_SHORT_WCHAR 1
+// Both MinGW and native MSVC provide a "MSVC"-like enviroment
+# define _LIBCPP_MSVCRT_LIKE
// If mingw not explicitly detected, assume using MS C runtime only.
# ifndef __MINGW32__
# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
diff --git a/libcxx/include/__locale b/libcxx/include/__locale
index cf3ba23b909..766842294ca 100644
--- a/libcxx/include/__locale
+++ b/libcxx/include/__locale
@@ -19,7 +19,7 @@
#include <cstdint>
#include <cctype>
#include <locale.h>
-#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
+#if defined(_LIBCPP_MSVCRT_LIKE)
# include <support/win32/locale_win32.h>
#elif defined(_AIX)
# include <support/ibm/xlocale.h>
@@ -367,7 +367,7 @@ public:
static const mask punct = _ISpunct;
static const mask xdigit = _ISxdigit;
static const mask blank = _ISblank;
-#elif defined(_LIBCPP_MSVCRT)
+#elif defined(_LIBCPP_MSVCRT_LIKE)
typedef unsigned short mask;
static const mask space = _SPACE;
static const mask print = _BLANK|_PUNCT|_ALPHA|_DIGIT;
diff --git a/libcxx/include/locale b/libcxx/include/locale
index bdedbeae246..6aaa22ccaa1 100644
--- a/libcxx/include/locale
+++ b/libcxx/include/locale
@@ -192,14 +192,7 @@ template <class charT> class messages_byname;
#endif
#include <cstdlib>
#include <ctime>
-#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
-#include <support/win32/locale_win32.h>
-#elif defined(_NEWLIB_VERSION)
-// FIXME: replace all the uses of _NEWLIB_VERSION with __NEWLIB__ preceded by an
-// include of <sys/cdefs.h> once https://sourceware.org/ml/newlib-cvs/2014-q3/msg00038.html
-// has had a chance to bake for a bit
-#include <support/newlib/xlocale.h>
-#endif
+#include <cstdio>
#ifdef _LIBCPP_HAS_CATOPEN
#include <nl_types.h>
#endif
diff --git a/libcxx/include/stdio.h b/libcxx/include/stdio.h
index dc534970f9d..f1241764016 100644
--- a/libcxx/include/stdio.h
+++ b/libcxx/include/stdio.h
@@ -110,10 +110,9 @@ void perror(const char* s);
#ifdef __cplusplus
// snprintf
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
extern "C" {
int vasprintf(char **sptr, const char *__restrict fmt, va_list ap);
-int asprintf(char **sptr, const char *__restrict fmt, ...);
}
#endif
diff --git a/libcxx/include/support/win32/locale_win32.h b/libcxx/include/support/win32/locale_win32.h
index 7a6c44ca900..b2b3ac4c799 100644
--- a/libcxx/include/support/win32/locale_win32.h
+++ b/libcxx/include/support/win32/locale_win32.h
@@ -52,20 +52,21 @@ size_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src,
size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc);
wint_t btowc_l( int c, locale_t loc );
int wctob_l( wint_t c, locale_t loc );
-inline _LIBCPP_ALWAYS_INLINE
-decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
-{
- return ___mb_cur_max_l_func(__l);
-}
+
+decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l );
// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
#define mbtowc_l _mbtowc_l
#define strtoll_l _strtoi64_l
#define strtoull_l _strtoui64_l
-#define strtof_l _strtof_l
#define strtod_l _strtod_l
+#if defined(_LIBCPP_MSVCRT)
+#define strtof_l _strtof_l
#define strtold_l _strtold_l
-
+#else
+float strtof_l(const char*, char**, locale_t);
+long double strtold_l(const char*, char**, locale_t);
+#endif
inline _LIBCPP_INLINE_VISIBILITY
int
islower_l(int c, _locale_t loc)
diff --git a/libcxx/include/wchar.h b/libcxx/include/wchar.h
index 25a318faff2..a5666e193a5 100644
--- a/libcxx/include/wchar.h
+++ b/libcxx/include/wchar.h
@@ -166,7 +166,7 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
}
#endif
-#if defined(__cplusplus) && defined(_LIBCPP_MSVCRT)
+#if defined(__cplusplus) && defined(_LIBCPP_MSVCRT_LIKE)
extern "C" {
size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
size_t nmc, size_t len, mbstate_t *__restrict ps);
diff --git a/libcxx/src/chrono.cpp b/libcxx/src/chrono.cpp
index 9b277a610cd..d0e184ad32f 100644
--- a/libcxx/src/chrono.cpp
+++ b/libcxx/src/chrono.cpp
@@ -37,7 +37,7 @@
#if defined(_LIBCPP_WIN32API)
#define WIN32_LEAN_AND_MEAN
#define VC_EXTRA_LEAN
-#include <Windows.h>
+#include <windows.h>
#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
#include <winapifamily.h>
#endif
diff --git a/libcxx/src/new.cpp b/libcxx/src/new.cpp
index 21b30740196..2b2682fa661 100644
--- a/libcxx/src/new.cpp
+++ b/libcxx/src/new.cpp
@@ -183,7 +183,7 @@ operator new(std::size_t size, std::align_val_t alignment) _THROW_BAD_ALLOC
if (static_cast<size_t>(alignment) < sizeof(void*))
alignment = std::align_val_t(sizeof(void*));
void* p;
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
#else
while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
@@ -256,7 +256,7 @@ void
operator delete(void* ptr, std::align_val_t) _NOEXCEPT
{
if (ptr)
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
::_aligned_free(ptr);
#else
::free(ptr);
diff --git a/libcxx/src/support/win32/locale_win32.cpp b/libcxx/src/support/win32/locale_win32.cpp
index 28cb4491781..13a6eaedacb 100644
--- a/libcxx/src/support/win32/locale_win32.cpp
+++ b/libcxx/src/support/win32/locale_win32.cpp
@@ -34,6 +34,18 @@ locale_t uselocale( locale_t newloc )
// uselocale returns the old locale_t
return old_locale;
}
+
+decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
+{
+#if defined(_LIBCPP_MSVCRT)
+ return ___mb_cur_max_l_func(__l);
+#else
+ __libcpp_locale_guard __current(__l);
+ return MB_CUR_MAX;
+#endif
+}
+
+
lconv *localeconv_l( locale_t loc )
{
__libcpp_locale_guard __current(loc);
@@ -109,3 +121,15 @@ int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap )
__libcpp_locale_guard __current(loc);
return vasprintf( ret, format, ap );
}
+
+#if !defined(_LIBCPP_MSVCRT)
+float strtof_l(const char* nptr, char** endptr, locale_t loc) {
+ __libcpp_locale_guard __current(loc);
+ return strtof(nptr, endptr);
+}
+
+long double strtold_l(const char* nptr, char** endptr, locale_t loc) {
+ __libcpp_locale_guard __current(loc);
+ return strtold(nptr, endptr);
+}
+#endif
diff --git a/libcxx/src/support/win32/support.cpp b/libcxx/src/support/win32/support.cpp
index e989681a6d5..dbd1c4c418a 100644
--- a/libcxx/src/support/win32/support.cpp
+++ b/libcxx/src/support/win32/support.cpp
@@ -15,17 +15,6 @@
#include <cstring> // strcpy, wcsncpy
#include <cwchar> // mbstate_t
-// Some of these functions aren't standard or if they conform, the name does not.
-
-int asprintf(char **sptr, const char *__restrict format, ...)
-{
- va_list ap;
- va_start(ap, format);
- int result;
- result = vasprintf(sptr, format, ap);
- va_end(ap);
- return result;
-}
// Like sprintf, but when return value >= 0 it returns
// a pointer to a malloc'd string in *sptr.
diff --git a/libcxx/src/system_error.cpp b/libcxx/src/system_error.cpp
index cbbbb5dcd15..17f2c9a5ba7 100644
--- a/libcxx/src/system_error.cpp
+++ b/libcxx/src/system_error.cpp
@@ -65,7 +65,7 @@ constexpr size_t strerror_buff_size = 1024;
string do_strerror_r(int ev);
-#if defined(_LIBCPP_MSVCRT)
+#if defined(_LIBCPP_MSVCRT_LIKE)
string do_strerror_r(int ev) {
char buffer[strerror_buff_size];
if (::strerror_s(buffer, strerror_buff_size, ev) == 0)
diff --git a/libcxx/src/thread.cpp b/libcxx/src/thread.cpp
index 412a8fa0a62..550da8ea71f 100644
--- a/libcxx/src/thread.cpp
+++ b/libcxx/src/thread.cpp
@@ -34,7 +34,7 @@
#if defined(_LIBCPP_WIN32API)
#include <windows.h>
-#endif // defined(_LIBCPP_WIN32API)
+#endif
_LIBCPP_BEGIN_NAMESPACE_STD
OpenPOWER on IntegriCloud