forked from OSchip/llvm-project
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
This commit is contained in:
parent
27db230ab0
commit
1ec026252b
|
@ -220,10 +220,12 @@
|
||||||
#endif // __NetBSD__
|
#endif // __NetBSD__
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
# define _LIBCPP_WIN32API 1
|
# define _LIBCPP_WIN32API
|
||||||
# define _LIBCPP_LITTLE_ENDIAN 1
|
# define _LIBCPP_LITTLE_ENDIAN 1
|
||||||
# define _LIBCPP_BIG_ENDIAN 0
|
# define _LIBCPP_BIG_ENDIAN 0
|
||||||
# define _LIBCPP_SHORT_WCHAR 1
|
# 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.
|
// If mingw not explicitly detected, assume using MS C runtime only.
|
||||||
# ifndef __MINGW32__
|
# ifndef __MINGW32__
|
||||||
# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
|
# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
# include <support/win32/locale_win32.h>
|
# include <support/win32/locale_win32.h>
|
||||||
#elif defined(_AIX)
|
#elif defined(_AIX)
|
||||||
# include <support/ibm/xlocale.h>
|
# include <support/ibm/xlocale.h>
|
||||||
|
@ -367,7 +367,7 @@ public:
|
||||||
static const mask punct = _ISpunct;
|
static const mask punct = _ISpunct;
|
||||||
static const mask xdigit = _ISxdigit;
|
static const mask xdigit = _ISxdigit;
|
||||||
static const mask blank = _ISblank;
|
static const mask blank = _ISblank;
|
||||||
#elif defined(_LIBCPP_MSVCRT)
|
#elif defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
typedef unsigned short mask;
|
typedef unsigned short mask;
|
||||||
static const mask space = _SPACE;
|
static const mask space = _SPACE;
|
||||||
static const mask print = _BLANK|_PUNCT|_ALPHA|_DIGIT;
|
static const mask print = _BLANK|_PUNCT|_ALPHA|_DIGIT;
|
||||||
|
|
|
@ -192,14 +192,7 @@ template <class charT> class messages_byname;
|
||||||
#endif
|
#endif
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
#include <cstdio>
|
||||||
#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
|
|
||||||
#ifdef _LIBCPP_HAS_CATOPEN
|
#ifdef _LIBCPP_HAS_CATOPEN
|
||||||
#include <nl_types.h>
|
#include <nl_types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -110,10 +110,9 @@ void perror(const char* s);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
// snprintf
|
// snprintf
|
||||||
#if defined(_LIBCPP_MSVCRT)
|
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
int vasprintf(char **sptr, const char *__restrict fmt, va_list ap);
|
int vasprintf(char **sptr, const char *__restrict fmt, va_list ap);
|
||||||
int asprintf(char **sptr, const char *__restrict fmt, ...);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -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);
|
size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc);
|
||||||
wint_t btowc_l( int c, locale_t loc );
|
wint_t btowc_l( int c, locale_t loc );
|
||||||
int wctob_l( wint_t 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 )
|
decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l );
|
||||||
{
|
|
||||||
return ___mb_cur_max_l_func(__l);
|
|
||||||
}
|
|
||||||
|
|
||||||
// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
|
// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
|
||||||
#define mbtowc_l _mbtowc_l
|
#define mbtowc_l _mbtowc_l
|
||||||
#define strtoll_l _strtoi64_l
|
#define strtoll_l _strtoi64_l
|
||||||
#define strtoull_l _strtoui64_l
|
#define strtoull_l _strtoui64_l
|
||||||
#define strtof_l _strtof_l
|
|
||||||
#define strtod_l _strtod_l
|
#define strtod_l _strtod_l
|
||||||
|
#if defined(_LIBCPP_MSVCRT)
|
||||||
|
#define strtof_l _strtof_l
|
||||||
#define strtold_l _strtold_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
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
int
|
int
|
||||||
islower_l(int c, _locale_t loc)
|
islower_l(int c, _locale_t loc)
|
||||||
|
|
|
@ -166,7 +166,7 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_PREFERRED_OVERLOAD
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__cplusplus) && defined(_LIBCPP_MSVCRT)
|
#if defined(__cplusplus) && defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
|
size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
|
||||||
size_t nmc, size_t len, mbstate_t *__restrict ps);
|
size_t nmc, size_t len, mbstate_t *__restrict ps);
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#if defined(_LIBCPP_WIN32API)
|
#if defined(_LIBCPP_WIN32API)
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define VC_EXTRA_LEAN
|
#define VC_EXTRA_LEAN
|
||||||
#include <Windows.h>
|
#include <windows.h>
|
||||||
#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
|
#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
|
||||||
#include <winapifamily.h>
|
#include <winapifamily.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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*))
|
if (static_cast<size_t>(alignment) < sizeof(void*))
|
||||||
alignment = std::align_val_t(sizeof(void*));
|
alignment = std::align_val_t(sizeof(void*));
|
||||||
void* p;
|
void* p;
|
||||||
#if defined(_LIBCPP_MSVCRT)
|
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
|
while ((p = _aligned_malloc(size, static_cast<size_t>(alignment))) == nullptr)
|
||||||
#else
|
#else
|
||||||
while (::posix_memalign(&p, static_cast<size_t>(alignment), size) != 0)
|
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
|
operator delete(void* ptr, std::align_val_t) _NOEXCEPT
|
||||||
{
|
{
|
||||||
if (ptr)
|
if (ptr)
|
||||||
#if defined(_LIBCPP_MSVCRT)
|
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
::_aligned_free(ptr);
|
::_aligned_free(ptr);
|
||||||
#else
|
#else
|
||||||
::free(ptr);
|
::free(ptr);
|
||||||
|
|
|
@ -34,6 +34,18 @@ locale_t uselocale( locale_t newloc )
|
||||||
// uselocale returns the old locale_t
|
// uselocale returns the old locale_t
|
||||||
return old_locale;
|
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 )
|
lconv *localeconv_l( locale_t loc )
|
||||||
{
|
{
|
||||||
__libcpp_locale_guard __current(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);
|
__libcpp_locale_guard __current(loc);
|
||||||
return vasprintf( ret, format, ap );
|
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
|
||||||
|
|
|
@ -15,17 +15,6 @@
|
||||||
#include <cstring> // strcpy, wcsncpy
|
#include <cstring> // strcpy, wcsncpy
|
||||||
#include <cwchar> // mbstate_t
|
#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
|
// Like sprintf, but when return value >= 0 it returns
|
||||||
// a pointer to a malloc'd string in *sptr.
|
// a pointer to a malloc'd string in *sptr.
|
||||||
|
|
|
@ -65,7 +65,7 @@ constexpr size_t strerror_buff_size = 1024;
|
||||||
|
|
||||||
string do_strerror_r(int ev);
|
string do_strerror_r(int ev);
|
||||||
|
|
||||||
#if defined(_LIBCPP_MSVCRT)
|
#if defined(_LIBCPP_MSVCRT_LIKE)
|
||||||
string do_strerror_r(int ev) {
|
string do_strerror_r(int ev) {
|
||||||
char buffer[strerror_buff_size];
|
char buffer[strerror_buff_size];
|
||||||
if (::strerror_s(buffer, strerror_buff_size, ev) == 0)
|
if (::strerror_s(buffer, strerror_buff_size, ev) == 0)
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
#if defined(_LIBCPP_WIN32API)
|
#if defined(_LIBCPP_WIN32API)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif // defined(_LIBCPP_WIN32API)
|
#endif
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue