Build libcxx and libcxxabi (succeeding) and libunwind (patch rebased but build not working).
269 lines
8.4 KiB
Diff
269 lines
8.4 KiB
Diff
From 57d48bf47108014aa5e0c5435c107581e86e3045 Mon Sep 17 00:00:00 2001
|
|
From: Martell Malone <martellmalone@gmail.com>
|
|
Date: Sat, 6 Aug 2016 03:54:22 -0700
|
|
Subject: [PATCH] mingw-w64 hack and slash fixes for libc++
|
|
|
|
CMAKE_HOST_WIN32 change can be upstreamed in a different patch
|
|
|
|
This is very hacky but gets libcxx to compile
|
|
Make sure you only install the headers after building
|
|
Will need to run the test suite and do more work here
|
|
|
|
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
|
|
index 219d1b7..2a9337f 100644
|
|
--- a/include/CMakeLists.txt
|
|
+++ b/include/CMakeLists.txt
|
|
@@ -27,7 +27,7 @@ if (LIBCXX_INSTALL_HEADERS)
|
|
|
|
if (LIBCXX_NEEDS_SITE_CONFIG)
|
|
set(UNIX_CAT cat)
|
|
- if (WIN32)
|
|
+ if (CMAKE_HOST_WIN32)
|
|
set(UNIX_CAT type)
|
|
endif()
|
|
# Generate and install a custom __config header. The new header is created
|
|
diff --git a/include/__config b/include/__config
|
|
index 353ca10..b58c350 100644
|
|
--- a/include/__config
|
|
+++ b/include/__config
|
|
@@ -152,6 +152,8 @@
|
|
# // If mingw not explicitly detected, assume using MS C runtime only.
|
|
# ifndef __MINGW32__
|
|
# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
|
|
+# else
|
|
+# define _LIBCPP_HAS_NO_CONSTEXPR
|
|
# endif
|
|
#endif // _WIN32
|
|
|
|
@@ -177,7 +179,7 @@
|
|
// including accesses to the special files under /dev. C++11's
|
|
// std::random_device is instead exposed through a NaCl syscall.
|
|
# define _LIBCPP_USING_NACL_RANDOM
|
|
-#elif defined(_WIN32)
|
|
+#elif defined(_MSC_VER)
|
|
# define _LIBCPP_USING_WIN32_RANDOM
|
|
#else
|
|
# define _LIBCPP_USING_DEV_RANDOM
|
|
@@ -831,7 +833,8 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|
defined(__linux__) || \
|
|
defined(__APPLE__) || \
|
|
defined(__CloudABI__) || \
|
|
- defined(__sun__)
|
|
+ defined(__sun__) || \
|
|
+ defined(__MINGW32__)
|
|
# define _LIBCPP_HAS_THREAD_API_PTHREAD
|
|
# else
|
|
# error "No thread API"
|
|
diff --git a/include/support/win32/locale_win32.h b/include/support/win32/locale_win32.h
|
|
index 7f3710e..d167309 100644
|
|
--- a/include/support/win32/locale_win32.h
|
|
+++ b/include/support/win32/locale_win32.h
|
|
@@ -64,6 +64,15 @@ isupper_l(int c, _locale_t loc)
|
|
return _isupper_l((int)c, loc);
|
|
}
|
|
|
|
+#define open _open
|
|
+#define close _close
|
|
+#define read _read
|
|
+
|
|
+#define strtod_l _strtod_l
|
|
+
|
|
+// TODO: add _strtof_l to mingw-w64
|
|
+#define strtof_l _strtod_l
|
|
+
|
|
#define isdigit_l _isdigit_l
|
|
#define isxdigit_l _isxdigit_l
|
|
#define strcoll_l _strcoll_l
|
|
@@ -93,6 +102,33 @@ int snprintf_l(char *ret, size_t n, locale_t loc, const char *format, ...);
|
|
int asprintf_l( char **ret, locale_t loc, const char *format, ... );
|
|
int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap );
|
|
|
|
+#ifdef __MINGW32__
|
|
+
|
|
+// Stubs
|
|
+inline _locale_t _get_current_locale(void) {
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+inline _locale_t _create_locale(int _Category,const char *_Locale) {
|
|
+ _locale_t loc;
|
|
+ return loc;
|
|
+}
|
|
+//extern "C" void _free_locale(_locale_t _Locale) {}
|
|
+//void __cdecl _free_locale(_locale_t _Locale);
|
|
+inline _locale_t _free_locale(_locale_t _Locale) {
|
|
+ _locale_t loc;
|
|
+ return loc;
|
|
+}
|
|
+
|
|
+
|
|
+#include <time.h>
|
|
+
|
|
+inline size_t _strftime_l(char* s, size_t n, const char * f, const struct tm * tm, _locale_t l)
|
|
+{
|
|
+ return strftime(s, n, f, tm);
|
|
+}
|
|
+
|
|
+#endif
|
|
|
|
// not-so-pressing FIXME: use locale to determine blank characters
|
|
inline int isblank_l( int c, locale_t /*loc*/ )
|
|
@@ -104,7 +140,7 @@ inline int iswblank_l( wint_t c, locale_t /*loc*/ )
|
|
return ( c == L' ' || c == L'\t' );
|
|
}
|
|
|
|
-#if defined(_LIBCPP_MSVCRT)
|
|
+#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
|
inline int isblank( int c, locale_t /*loc*/ )
|
|
{ return ( c == ' ' || c == '\t' ); }
|
|
inline int iswblank( wint_t c, locale_t /*loc*/ )
|
|
diff --git a/include/support/win32/support.h b/include/support/win32/support.h
|
|
index 5765bab..4955b3a 100644
|
|
--- a/include/support/win32/support.h
|
|
+++ b/include/support/win32/support.h
|
|
@@ -37,12 +37,13 @@ extern "C" {
|
|
|
|
int vasprintf(char **sptr, const char *__restrict fmt, va_list ap);
|
|
int asprintf(char **sptr, const char *__restrict fmt, ...);
|
|
+}
|
|
+#endif // __MINGW32__
|
|
+
|
|
size_t mbsnrtowcs(wchar_t *__restrict dst, const char **__restrict src,
|
|
size_t nmc, size_t len, mbstate_t *__restrict ps);
|
|
size_t wcsnrtombs(char *__restrict dst, const wchar_t **__restrict src,
|
|
size_t nwc, size_t len, mbstate_t *__restrict ps);
|
|
-}
|
|
-#endif // __MINGW32__
|
|
|
|
#if defined(_LIBCPP_MSVCRT)
|
|
#define snprintf _snprintf
|
|
diff --git a/include/type_traits b/include/type_traits
|
|
index 0d578bb..88dfd99 100644
|
|
--- a/include/type_traits
|
|
+++ b/include/type_traits
|
|
@@ -1671,7 +1671,7 @@ _CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800);
|
|
_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000);
|
|
_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000);
|
|
// MSDN says that MSVC does not support alignment beyond 8192 (=0x2000)
|
|
-#if !defined(_LIBCPP_MSVC)
|
|
+#if !defined(_LIBCPP_MSVC) && !defined(__MINGW32__)
|
|
_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000);
|
|
#endif // !_LIBCPP_MSVC
|
|
|
|
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
|
|
index cabf2e6..8729707 100644
|
|
--- a/lib/CMakeLists.txt
|
|
+++ b/lib/CMakeLists.txt
|
|
@@ -33,9 +33,11 @@ add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}"
|
|
|
|
add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")
|
|
|
|
+if(NOT MINGW)
|
|
add_library_flags_if(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "-Wl,--whole-archive" "-Wl,-Bstatic")
|
|
add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}")
|
|
add_library_flags_if(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "-Wl,-Bdynamic" "-Wl,--no-whole-archive")
|
|
+endif()
|
|
|
|
if (APPLE AND LLVM_USE_SANITIZER)
|
|
if ("${LLVM_USE_SANITIZER}" STREQUAL "Address")
|
|
@@ -71,9 +73,14 @@ add_library_flags_if(LIBCXX_HAS_RT_LIB rt)
|
|
add_library_flags_if(LIBCXX_HAS_GCC_S_LIB gcc_s)
|
|
add_library_flags_if(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB atomic)
|
|
|
|
-# Setup flags.
|
|
add_flags_if_supported(-fPIC)
|
|
-add_link_flags_if_supported(-nodefaultlibs)
|
|
+
|
|
+# Setup flags.
|
|
+if (NOT MINGW)
|
|
+ add_link_flags_if_supported(-nodefaultlibs)
|
|
+else()
|
|
+ add_library_flags(-lc++abi)
|
|
+endif()
|
|
|
|
if ( APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR
|
|
LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"))
|
|
diff --git a/src/locale.cpp b/src/locale.cpp
|
|
index da2fd11..03696a7 100644
|
|
--- a/src/locale.cpp
|
|
+++ b/src/locale.cpp
|
|
@@ -26,9 +26,9 @@
|
|
#include "cstring"
|
|
#include "cwctype"
|
|
#include "__sso_allocator"
|
|
-#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
|
+#if defined(_LIBCPP_MSVCRT)
|
|
#include "support/win32/locale_win32.h"
|
|
-#elif !defined(__ANDROID__)
|
|
+#elif !defined(__ANDROID__) && !defined(__MINGW32__)
|
|
#include <langinfo.h>
|
|
#endif
|
|
#include <stdlib.h>
|
|
diff --git a/src/support/win32/locale_win32.cpp b/src/support/win32/locale_win32.cpp
|
|
index 5a43743..b220afe 100644
|
|
--- a/src/support/win32/locale_win32.cpp
|
|
+++ b/src/support/win32/locale_win32.cpp
|
|
@@ -8,6 +8,11 @@
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
+#ifdef __MINGW32__
|
|
+#define _GNU_SOURCE
|
|
+#include <support/win32/support.h>
|
|
+#endif
|
|
+
|
|
#include <locale>
|
|
#include <cstdarg> // va_start, va_end
|
|
|
|
diff --git a/src/support/win32/support.cpp b/src/support/win32/support.cpp
|
|
index e989681..0d60ef4 100644
|
|
--- a/src/support/win32/support.cpp
|
|
+++ b/src/support/win32/support.cpp
|
|
@@ -8,6 +8,10 @@
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
+#ifdef __MINGW32__
|
|
+#define _GNU_SOURCE
|
|
+#endif
|
|
+
|
|
#include <cstdarg> // va_start, va_end
|
|
#include <cstddef> // size_t
|
|
#include <cstdlib> // malloc
|
|
@@ -17,6 +21,7 @@
|
|
|
|
// Some of these functions aren't standard or if they conform, the name does not.
|
|
|
|
+#ifndef __MINGW32__
|
|
int asprintf(char **sptr, const char *__restrict format, ...)
|
|
{
|
|
va_list ap;
|
|
@@ -51,6 +56,7 @@ int vasprintf( char **sptr, const char *__restrict format, va_list ap )
|
|
*sptr = p;
|
|
return count;
|
|
}
|
|
+#endif
|
|
|
|
// Returns >= 0: the number of wide characters found in the
|
|
// multi byte sequence src (of src_size_bytes), that fit in the buffer dst
|
|
diff --git a/src/system_error.cpp b/src/system_error.cpp
|
|
index 87f35ae..fdd56ea 100644
|
|
--- a/src/system_error.cpp
|
|
+++ b/src/system_error.cpp
|
|
@@ -70,6 +70,12 @@ string do_strerror_r(int ev) {
|
|
char* ret = ::strerror_r(ev, buffer, strerror_buff_size);
|
|
return string(ret);
|
|
}
|
|
+#elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
|
+string do_strerror_r(int ev) {
|
|
+ char buffer[strerror_buff_size];
|
|
+ std::snprintf(buffer, strerror_buff_size, "Win32 Unsupported %d", ev);
|
|
+ return string(buffer);
|
|
+}
|
|
#else
|
|
// POSIX version
|
|
string do_strerror_r(int ev) {
|
|
--
|
|
2.8.3
|
|
|