├── .gitattributes ├── Dockerfile ├── README.MD ├── patches ├── libcxx │ └── 0001-libcxx-Move-Windows-threading-support-into-a-.cpp-fi.patch └── llvm │ ├── 0001-cmake-Don-t-build-Native-llvm-config-when-cross-comp.patch │ ├── 0001-fixup-tblgen.patch │ ├── 0002-CMAKE-apply-O3-for-mingw-clang.patch │ └── 0003-CMAKE-disable-mbig-obj-for-mingw-clang-asm.patch ├── scripts ├── build-compiler-rt-armv7-git ├── build-compiler-rt-i686-git ├── build-compiler-rt-x86_64-git ├── build-libcxx-armv7 ├── build-libcxx-headers ├── build-libcxx-i686 ├── build-libcxx-x86_64 ├── build-libcxx-x86_64-threads ├── build-libcxxabi-armv7 ├── build-libcxxabi-i686 ├── build-libcxxabi-x86_64 ├── build-libunwind-x86_64 ├── build-llvm.sh ├── build-mingw-w64-llvm-armv7 ├── build-mingw-w64-llvm-i686 ├── build-mingw-w64-llvm-x86_64 ├── build-mingw-w64-tools ├── build-mingw-w64-x86_64-winpthreads └── build-mingw-w64.sh ├── tests ├── test-exception.cpp ├── test-tors.c ├── test.c └── test.cpp └── wrappers └── clang-target-wrapper /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.7 2 | 3 | WORKDIR /build 4 | 5 | RUN apk --no-cache update && apk --no-cache upgrade && apk add --no-cache git 6 | 7 | RUN git config --global user.name "Mingw" && \ 8 | git config --global user.email root@localhost 9 | 10 | RUN git clone -b release_60 https://github.com/llvm-mirror/llvm.git && \ 11 | cd llvm/tools && \ 12 | git clone -b release_60 https://github.com/llvm-mirror/clang.git && \ 13 | git clone -b release_60 https://github.com/llvm-mirror/lld.git 14 | 15 | RUN apk add --no-cache clang clang-dev linux-headers cmake \ 16 | build-base ninja make python2 python2-dev tar 17 | 18 | ENV TOOLCHAIN_PREFIX=/build/prefix 19 | ENV CMAKE_BUILD_TYPE=MinSizeRel 20 | 21 | COPY ./scripts/build-llvm.sh build-llvm.sh 22 | RUN ./build-llvm.sh $TOOLCHAIN_PREFIX $CMAKE_BUILD_TYPE 23 | 24 | ENV ORIG_PATH=$PATH 25 | ENV PATH=$TOOLCHAIN_PREFIX/bin:$ORIG_PATH 26 | 27 | RUN git clone git://git.code.sf.net/p/mingw-w64/mingw-w64 28 | ENV TOOLCHAIN_ARCHS="i686 x86_64 armv7" 29 | 30 | # configure of the mingw-w64 crt needs bash :/ 31 | RUN apk --no-cache update && apk --no-cache upgrade && apk add --no-cache bash 32 | 33 | # Install the wrapper scripts 34 | COPY wrappers/clang-target-wrapper $TOOLCHAIN_PREFIX/bin 35 | RUN cd $TOOLCHAIN_PREFIX/bin && \ 36 | for arch in $TOOLCHAIN_ARCHS; do \ 37 | for exec in clang clang++; do \ 38 | ln -s clang-target-wrapper $arch-w64-mingw32-$exec; \ 39 | done; \ 40 | done 41 | 42 | COPY ./scripts/build-mingw-w64.sh build-mingw-w64.sh 43 | RUN ./build-mingw-w64.sh $TOOLCHAIN_PREFIX $TOOLCHAIN_ARCHS 44 | 45 | #TODO: rework compiler-rt libunwind and native mingw-w64 toolchain into scripts 46 | 47 | RUN git clone -b release_60 https://github.com/llvm-mirror/compiler-rt.git 48 | 49 | #TODO: Support i686 for mingw-w64 50 | # Martell is working on a patch to force i686 like android does 51 | RUN cd $TOOLCHAIN_PREFIX && ln -s i686-w64-mingw32 i386-w64-mingw32 52 | 53 | # Manually build compiler-rt as a standalone project 54 | RUN cd compiler-rt && \ 55 | for arch in $TOOLCHAIN_ARCHS; do \ 56 | buildarchname=$arch && \ 57 | libarchname=$arch && \ 58 | case $arch in \ 59 | armv7) \ 60 | libarchname=arm \ 61 | ;; \ 62 | i686) \ 63 | buildarchname=i386 \ 64 | libarchname=i386 \ 65 | ;; \ 66 | esac && \ 67 | mkdir build-$arch && cd build-$arch && cmake -G"Ninja" \ 68 | -DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \ 69 | -DCMAKE_SYSTEM_NAME=Windows \ 70 | -DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \ 71 | -DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \ 72 | -DCMAKE_C_COMPILER_WORKS=1 \ 73 | -DCMAKE_C_COMPILER_TARGET=$buildarchname-windows-gnu \ 74 | -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \ 75 | ../lib/builtins && \ 76 | ninja && \ 77 | mkdir -p $TOOLCHAIN_PREFIX/lib/clang/6.0.0/lib/windows && \ 78 | cp lib/windows/libclang_rt.builtins-$buildarchname.a $TOOLCHAIN_PREFIX/lib/clang/6.0.0/lib/windows/libclang_rt.builtins-$libarchname.a && \ 79 | cd .. && rm -rf build-$arch || exit 1; \ 80 | done 81 | 82 | COPY tests/test.c tests/test-tors.c /build/test/ 83 | 84 | RUN cd test && \ 85 | for arch in $TOOLCHAIN_ARCHS; do \ 86 | $arch-w64-mingw32-clang test.c -o test-c-$arch.exe || exit 1; \ 87 | done 88 | 89 | RUN cd test && \ 90 | for arch in $TOOLCHAIN_ARCHS; do \ 91 | $arch-w64-mingw32-clang test-tors.c -o test-tors-$arch.exe || exit 1; \ 92 | done 93 | 94 | RUN git clone -b release_60 https://github.com/llvm-mirror/libcxx.git && \ 95 | git clone -b release_60 https://github.com/llvm-mirror/libcxxabi.git && \ 96 | git clone -b release_60 https://github.com/llvm-mirror/libunwind.git 97 | 98 | RUN cd libunwind && \ 99 | for arch in $TOOLCHAIN_ARCHS; do \ 100 | mkdir build-$arch && cd build-$arch && cmake -G"Ninja" \ 101 | -DCMAKE_BUILD_TYPE=Release \ 102 | -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 \ 103 | -DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \ 104 | -DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \ 105 | -DCMAKE_CROSSCOMPILING=TRUE \ 106 | -DCMAKE_SYSTEM_NAME=Windows \ 107 | -DCMAKE_C_COMPILER_WORKS=TRUE \ 108 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 109 | -DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \ 110 | -DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \ 111 | -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ 112 | -DCXX_SUPPORTS_CXX11=TRUE \ 113 | -DLIBUNWIND_USE_COMPILER_RT=TRUE \ 114 | -DLIBUNWIND_ENABLE_THREADS=TRUE \ 115 | -DLIBUNWIND_ENABLE_SHARED=FALSE \ 116 | -DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \ 117 | -DCMAKE_CXX_FLAGS="-I/build/libcxx/include" \ 118 | .. && \ 119 | ninja && ninja install && \ 120 | cd .. && rm -rf build-$arch || exit 1; \ 121 | done 122 | 123 | RUN cd libcxxabi && \ 124 | for arch in $TOOLCHAIN_ARCHS; do \ 125 | mkdir build-$arch && cd build-$arch && cmake -G"Ninja" \ 126 | -DCMAKE_BUILD_TYPE=Release \ 127 | -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 \ 128 | -DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \ 129 | -DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \ 130 | -DCMAKE_CROSSCOMPILING=TRUE \ 131 | -DCMAKE_SYSTEM_NAME=Windows \ 132 | -DCMAKE_C_COMPILER_WORKS=TRUE \ 133 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 134 | -DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \ 135 | -DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \ 136 | -DLIBCXXABI_USE_COMPILER_RT=ON \ 137 | -DLIBCXXABI_ENABLE_EXCEPTIONS=ON \ 138 | -DLIBCXXABI_ENABLE_THREADS=ON \ 139 | -DLIBCXXABI_INCLUDE_TESTS=OFF \ 140 | -DLIBCXXABI_TARGET_TRIPLE=$arch-w64-mingw32 \ 141 | -DLIBCXXABI_ENABLE_SHARED=OFF \ 142 | -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include \ 143 | -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ 144 | -DCXX_SUPPORTS_CXX11=TRUE \ 145 | -DCMAKE_CXX_FLAGS="-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" \ 146 | .. && \ 147 | ninja && \ 148 | cd .. || exit 1; \ 149 | done 150 | 151 | COPY patches/libcxx/0001-libcxx-Move-Windows-threading-support-into-a-.cpp-fi.patch /build/ 152 | RUN cd libcxx && git am ../0001-libcxx-Move-Windows-threading-support-into-a-.cpp-fi.patch 153 | 154 | RUN cd libcxx && \ 155 | for arch in $TOOLCHAIN_ARCHS; do \ 156 | mkdir build-$arch && cd build-$arch && cmake -G"Ninja" \ 157 | -DCMAKE_BUILD_TYPE=Release \ 158 | -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 \ 159 | -DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \ 160 | -DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \ 161 | -DCMAKE_CROSSCOMPILING=TRUE \ 162 | -DCMAKE_SYSTEM_NAME=Windows \ 163 | -DCMAKE_C_COMPILER_WORKS=TRUE \ 164 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 165 | -DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \ 166 | -DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \ 167 | -DLIBCXX_USE_COMPILER_RT=ON \ 168 | -DLIBCXX_INSTALL_HEADERS=ON \ 169 | -DLIBCXX_ENABLE_EXCEPTIONS=ON \ 170 | -DLIBCXX_ENABLE_THREADS=ON \ 171 | -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \ 172 | -DLIBCXX_ENABLE_SHARED=OFF \ 173 | -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ 174 | -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ 175 | -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ 176 | -DLIBCXX_ENABLE_FILESYSTEM=OFF \ 177 | -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ 178 | -DLIBCXX_CXX_ABI=libcxxabi \ 179 | -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include \ 180 | -DLIBCXX_CXX_ABI_LIBRARY_PATH=../../libcxxabi/build-$arch/lib \ 181 | -DCMAKE_CXX_FLAGS="-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \ 182 | .. && \ 183 | ninja && ninja install && \ 184 | ../utils/merge_archives.py \ 185 | --ar llvm-ar \ 186 | -o $TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libc++.a \ 187 | $TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libc++.a \ 188 | $TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libunwind.a && \ 189 | cd .. && rm -rf build-$arch || exit 1; \ 190 | done 191 | 192 | # TODO: actually install c++ headers into c++ 193 | RUN cd $TOOLCHAIN_PREFIX/include && ln -s ../$(echo $TOOLCHAIN_ARCHS | awk '{print $1}')-w64-mingw32/include/c++ . 194 | 195 | COPY tests/test.cpp tests/test-exception.cpp /build/test/ 196 | 197 | RUN cd test && \ 198 | for arch in $TOOLCHAIN_ARCHS; do \ 199 | $arch-w64-mingw32-clang++ test.cpp -o test-cpp-$arch.exe -fno-exceptions -lpsapi || exit 1; \ 200 | done 201 | 202 | RUN cd test && \ 203 | for arch in $TOOLCHAIN_ARCHS; do \ 204 | $arch-w64-mingw32-clang++ test-exception.cpp -o test-exception-$arch.exe -lpsapi || exit 1; \ 205 | done 206 | 207 | ENV CROSS_TOOLCHAIN_PREFIX=/build/cross 208 | # ENV PATH=$CROSS_TOOLCHAIN_PREFIX-$arch/bin:$ORIG_PATH 209 | ENV AR=llvm-ar 210 | ENV RANLIB=llvm-ranlib 211 | ENV AS=llvm-as 212 | ENV NM=llvm-nm 213 | 214 | RUN apk --no-cache update && apk --no-cache upgrade && apk add --no-cache wine 215 | 216 | COPY patches/llvm/0001-cmake-Don-t-build-Native-llvm-config-when-cross-comp.patch /build/ 217 | RUN cd llvm && git am ../0001-cmake-Don-t-build-Native-llvm-config-when-cross-comp.patch 218 | 219 | #COPY patches/llvm/0001-fixup-tblgen.patch /build/ 220 | #RUN cd llvm && git am ../0001-fixup-tblgen.patch 221 | 222 | COPY patches/llvm/0002-CMAKE-apply-O3-for-mingw-clang.patch /build/ 223 | RUN cd llvm && git am ../0002-CMAKE-apply-O3-for-mingw-clang.patch 224 | 225 | COPY patches/llvm/0003-CMAKE-disable-mbig-obj-for-mingw-clang-asm.patch /build/ 226 | RUN cd llvm && git am ../0003-CMAKE-disable-mbig-obj-for-mingw-clang-asm.patch 227 | 228 | #COPY patches/lld/0001-LLD-Protect-COFF.h-from-winnt-defines.patch /build/ 229 | #RUN cd llvm/tools/lld && git am ../../../0001-LLD-Protect-COFF.h-from-winnt-defines.patch 230 | 231 | # Only cross building to x86_64 for now, change this to add i386/i686 if you wish. 232 | ENV HOST_TOOLCHAIN_ARCHS="x86_64" 233 | 234 | # Build LLVM, Clang and LLD for mingw-w64 235 | RUN cd llvm && \ 236 | for arch in $HOST_TOOLCHAIN_ARCHS; do \ 237 | mkdir build-cross-$arch && cd build-cross-$arch && cmake -G"Ninja" \ 238 | -DCMAKE_C_COMPILER=$TOOLCHAIN_PREFIX/bin/$arch-w64-mingw32-clang \ 239 | -DCMAKE_CXX_COMPILER=$TOOLCHAIN_PREFIX/bin/$arch-w64-mingw32-clang++ \ 240 | -DCMAKE_INSTALL_PREFIX=$CROSS_TOOLCHAIN_PREFIX-$arch \ 241 | -DCMAKE_BUILD_TYPE=Release \ 242 | -DCMAKE_CROSSCOMPILING=TRUE \ 243 | -DCMAKE_SYSTEM_NAME=Windows \ 244 | -DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \ 245 | -DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \ 246 | -DLLVM_ENABLE_ASSERTIONS=ON \ 247 | -DLLVM_TARGETS_TO_BUILD="ARM;X86" \ 248 | -DCLANG_DEFAULT_CXX_STDLIB=libc++ \ 249 | -DCLANG_DEFAULT_LINKER=lld \ 250 | -DCLANG_DEFAULT_RTLIB=compiler-rt \ 251 | -DBUILD_SHARED_LIBS=OFF \ 252 | -DCMAKE_CXX_FLAGS="-D_GNU_SOURCE -Wl,-lpsapi" \ 253 | -DLLVM_CONFIG_PATH=$TOOLCHAIN_PREFIX/bin/llvm-config \ 254 | -DLLVM_TABLEGEN=$TOOLCHAIN_PREFIX/bin/llvm-tblgen \ 255 | -DCLANG_TABLEGEN=$TOOLCHAIN_PREFIX/bin/clang-tblgen \ 256 | -DCMAKE_SYSTEM_PROGRAM_PATH=$TOOLCHAIN_PREFIX/bin \ 257 | -DCMAKE_FIND_ROOT_PATH=$TOOLCHAIN_PREFIX \ 258 | -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \ 259 | -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \ 260 | -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \ 261 | ../ && ninja && ninja install && \ 262 | cd .. && rm -rf build-cross-$arch || exit 1; \ 263 | done 264 | 265 | # Transfer mingw-w64-headers 266 | RUN cd mingw-w64/mingw-w64-headers && \ 267 | for host in $HOST_TOOLCHAIN_ARCHS; do \ 268 | for arch in $TOOLCHAIN_ARCHS; do \ 269 | cd build-$arch && \ 270 | DESTDIR=$CROSS_TOOLCHAIN_PREFIX-$host/$arch-w64-mingw32 \ 271 | make install && cd .. || exit 1; \ 272 | done; \ 273 | done 274 | 275 | # Install the $TUPLE-clang binaries 276 | COPY wrappers/clang-target-wrapper $CROSS_TOOLCHAIN_PREFIX-i686/bin 277 | RUN for host in $HOST_TOOLCHAIN_ARCHS; do \ 278 | cd $CROSS_TOOLCHAIN_PREFIX-$host/bin && \ 279 | for arch in $TOOLCHAIN_ARCHS; do \ 280 | for exec in clang clang++; do \ 281 | ln -s clang-target-wrapper $arch-w64-mingw32-$exec; \ 282 | done; \ 283 | done; \ 284 | done 285 | 286 | # Transfer mingw-w64-crt, libcxx and libcxxabi 287 | RUN cd mingw-w64/mingw-w64-crt && \ 288 | for host in $HOST_TOOLCHAIN_ARCHS; do \ 289 | for arch in $TOOLCHAIN_ARCHS; do \ 290 | cd build-$arch && \ 291 | DESTDIR=$CROSS_TOOLCHAIN_PREFIX-$host/$arch-w64-mingw32 \ 292 | make install && cd .. || exit 1; \ 293 | done; \ 294 | done 295 | 296 | # Transfer compiler-rt 297 | RUN cd compiler-rt && \ 298 | for host in $HOST_TOOLCHAIN_ARCHS; do \ 299 | for arch in $TOOLCHAIN_ARCHS; do \ 300 | buildarchname=$arch && \ 301 | libarchname=$arch && \ 302 | case $arch in \ 303 | armv7) \ 304 | libarchname=arm \ 305 | ;; \ 306 | i686) \ 307 | buildarchname=i386 \ 308 | libarchname=i386 \ 309 | ;; \ 310 | esac && \ 311 | mkdir -p $CROSS_TOOLCHAIN_PREFIX-$host/lib/clang/6.0.0/lib/windows && \ 312 | cp $TOOLCHAIN_PREFIX/lib/clang/6.0.0/lib/windows/libclang_rt.builtins-$libarchname.a $CROSS_TOOLCHAIN_PREFIX-$host/lib/clang/6.0.0/lib/windows/libclang_rt.builtins-$libarchname.a && \ 313 | cd .. && rm -rf build-$arch || exit 1; \ 314 | done; \ 315 | done 316 | 317 | RUN apk add --no-cache wine freetype 318 | RUN WINEARCH=win64 winecfg 319 | 320 | COPY tests/test.c tests/test-tors.c /build/test/ 321 | 322 | # wine currently fails when calling clang 323 | # https://bugs.winehq.org/show_bug.cgi?id=44061 324 | # fixme:crypt:CRYPT_LoadProvider Failed to load dll L"C:\\windows\\system32\\rsaenh.dll" 325 | # LLVM ERROR: Could not acquire a cryptographic context: Unknown error (0x8009001D) 326 | 327 | RUN cd test && \ 328 | for arch in $TOOLCHAIN_ARCHS; do \ 329 | wine64 $CROSS_TOOLCHAIN_PREFIX-x86_64/bin/clang -target x86_64-windows-gnu test.c -o test-c-$arch.exe || exit 1; \ 330 | done 331 | 332 | RUN cd test && \ 333 | for arch in $TOOLCHAIN_ARCHS; do \ 334 | wine64 $CROSS_TOOLCHAIN_PREFIX-x86_64/bin/clang -target x86_64-windows-gnu test-tors.c -o test-tors-$arch.exe || exit 1; \ 335 | done 336 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Mingw-w64-Clang 2 | 3 | __The llvm port of mingw-w64.__ 4 | 5 | Now self contained in a unified alpine Docker script :) 6 | 7 | The stack is as follows. 8 | 9 | * [__Compiler__] : __llvm__ __clang__ __clang++__ 10 | * [__Linker__] : __lld__ 11 | * [__C__ __Runtime__] : __compiler-rt__ __mingw-w64__ 12 | * [__C++__ __Runtime__] : __libc++__ __libc++abi__ 13 | * [__Exceptions__] : __libunwind__ 14 | 15 | Work has and will continue to be upstreamed where possible 16 | 17 | ### Todos 18 | 19 | - __libcxx__ - enable test suite testing on cross compile 20 | - __mingw-w64__ - add support for aarch64 when devices become available 21 | - __wine__ - update alpine wine to 3.0 on release so x64 can test properly 22 | 23 | 24 | ### Status 25 | 26 | - llvm - __works__ 27 | - clang - __works__ 28 | - clang++ - __works__ 29 | - compiler-rt - __works__ 30 | - mingw-w64 - __works__ 31 | - libcxx - __builds__ 32 | - libcxxabi - __works__ 33 | - libunwind - __works__ (needs support for seh but dwarf works and sjlj for i686) 34 | -------------------------------------------------------------------------------- /patches/libcxx/0001-libcxx-Move-Windows-threading-support-into-a-.cpp-fi.patch: -------------------------------------------------------------------------------- 1 | From 59f2389874a3c22734ce14ae493c369aefd26c54 Mon Sep 17 00:00:00 2001 2 | From: Peter Collingbourne 3 | Date: Tue, 23 Jan 2018 01:59:43 +0000 4 | Subject: [PATCH] libcxx: Move Windows threading support into a .cpp file. 5 | 6 | This allows us to avoid polluting the namespace of users of 7 | with the definitions in windows.h. 8 | 9 | Differential Revision: https://reviews.llvm.org/D42214 10 | 11 | git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@323169 91177308-0d34-0410-b5e6-96231b3b80d8 12 | --- 13 | include/__threading_support | 298 ++++--------------------------------- 14 | src/support/win32/thread_win32.cpp | 275 ++++++++++++++++++++++++++++++++++ 15 | 2 files changed, 307 insertions(+), 266 deletions(-) 16 | create mode 100644 src/support/win32/thread_win32.cpp 17 | 18 | diff --git a/include/__threading_support b/include/__threading_support 19 | index 5d4c90796..c20123d56 100644 20 | --- a/include/__threading_support 21 | +++ b/include/__threading_support 22 | @@ -26,23 +26,11 @@ 23 | #if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 24 | # include 25 | # include 26 | -#elif defined(_LIBCPP_HAS_THREAD_API_WIN32) 27 | -#include 28 | -#include 29 | -#include 30 | #endif 31 | 32 | _LIBCPP_PUSH_MACROS 33 | #include <__undef_macros> 34 | 35 | - 36 | -#if defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ 37 | - defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) 38 | -#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS 39 | -#else 40 | -#define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY 41 | -#endif 42 | - 43 | #if defined(__FreeBSD__) && defined(__clang__) && __has_attribute(no_thread_safety_analysis) 44 | #define _LIBCPP_NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis)) 45 | #else 46 | @@ -51,7 +39,15 @@ _LIBCPP_PUSH_MACROS 47 | 48 | _LIBCPP_BEGIN_NAMESPACE_STD 49 | 50 | -#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 51 | +#if defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ 52 | + defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) 53 | + 54 | +#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS 55 | + 56 | +#elif defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 57 | + 58 | +#define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY 59 | + 60 | // Mutex 61 | typedef pthread_mutex_t __libcpp_mutex_t; 62 | #define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER 63 | @@ -79,32 +75,41 @@ typedef pthread_key_t __libcpp_tls_key; 64 | 65 | #define _LIBCPP_TLS_DESTRUCTOR_CC 66 | #else 67 | + 68 | +#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS 69 | + 70 | // Mutex 71 | -typedef SRWLOCK __libcpp_mutex_t; 72 | -#define _LIBCPP_MUTEX_INITIALIZER SRWLOCK_INIT 73 | +typedef void* __libcpp_mutex_t; 74 | +#define _LIBCPP_MUTEX_INITIALIZER 0 75 | 76 | -typedef CRITICAL_SECTION __libcpp_recursive_mutex_t; 77 | +#if defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || defined(__arm__) 78 | +typedef void* __libcpp_recursive_mutex_t[6]; 79 | +#elif defined(_M_AMD64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__) 80 | +typedef void* __libcpp_recursive_mutex_t[5]; 81 | +#else 82 | +# error Unsupported architecture 83 | +#endif 84 | 85 | // Condition Variable 86 | -typedef CONDITION_VARIABLE __libcpp_condvar_t; 87 | -#define _LIBCPP_CONDVAR_INITIALIZER CONDITION_VARIABLE_INIT 88 | +typedef void* __libcpp_condvar_t; 89 | +#define _LIBCPP_CONDVAR_INITIALIZER 0 90 | 91 | // Execute Once 92 | -typedef INIT_ONCE __libcpp_exec_once_flag; 93 | -#define _LIBCPP_EXEC_ONCE_INITIALIZER INIT_ONCE_STATIC_INIT 94 | +typedef void* __libcpp_exec_once_flag; 95 | +#define _LIBCPP_EXEC_ONCE_INITIALIZER 0 96 | 97 | // Thread ID 98 | -typedef DWORD __libcpp_thread_id; 99 | +typedef long __libcpp_thread_id; 100 | 101 | // Thread 102 | #define _LIBCPP_NULL_THREAD 0U 103 | 104 | -typedef HANDLE __libcpp_thread_t; 105 | +typedef void* __libcpp_thread_t; 106 | 107 | // Thread Local Storage 108 | -typedef DWORD __libcpp_tls_key; 109 | +typedef long __libcpp_tls_key; 110 | 111 | -#define _LIBCPP_TLS_DESTRUCTOR_CC WINAPI 112 | +#define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall 113 | #endif 114 | 115 | // Mutex 116 | @@ -201,10 +206,9 @@ void *__libcpp_tls_get(__libcpp_tls_key __key); 117 | _LIBCPP_THREAD_ABI_VISIBILITY 118 | int __libcpp_tls_set(__libcpp_tls_key __key, void *__p); 119 | 120 | -#if !defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ 121 | - defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL) 122 | - 123 | -#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 124 | +#if (!defined(_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL) || \ 125 | + defined(_LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL)) && \ 126 | + defined(_LIBCPP_HAS_THREAD_API_PTHREAD) 127 | 128 | int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m) 129 | { 130 | @@ -390,244 +394,6 @@ int __libcpp_tls_set(__libcpp_tls_key __key, void *__p) 131 | return pthread_setspecific(__key, __p); 132 | } 133 | 134 | -#elif defined(_LIBCPP_HAS_THREAD_API_WIN32) 135 | - 136 | -// Mutex 137 | -int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m) 138 | -{ 139 | - InitializeCriticalSection(__m); 140 | - return 0; 141 | -} 142 | - 143 | -int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m) 144 | -{ 145 | - EnterCriticalSection(__m); 146 | - return 0; 147 | -} 148 | - 149 | -bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m) 150 | -{ 151 | - return TryEnterCriticalSection(__m) != 0; 152 | -} 153 | - 154 | -int __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t *__m) 155 | -{ 156 | - LeaveCriticalSection(__m); 157 | - return 0; 158 | -} 159 | - 160 | -int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m) 161 | -{ 162 | - DeleteCriticalSection(__m); 163 | - return 0; 164 | -} 165 | - 166 | -int __libcpp_mutex_lock(__libcpp_mutex_t *__m) 167 | -{ 168 | - AcquireSRWLockExclusive(__m); 169 | - return 0; 170 | -} 171 | - 172 | -bool __libcpp_mutex_trylock(__libcpp_mutex_t *__m) 173 | -{ 174 | - return TryAcquireSRWLockExclusive(__m) != 0; 175 | -} 176 | - 177 | -int __libcpp_mutex_unlock(__libcpp_mutex_t *__m) 178 | -{ 179 | - ReleaseSRWLockExclusive(__m); 180 | - return 0; 181 | -} 182 | - 183 | -int __libcpp_mutex_destroy(__libcpp_mutex_t *__m) 184 | -{ 185 | - static_cast(__m); 186 | - return 0; 187 | -} 188 | - 189 | -// Condition Variable 190 | -int __libcpp_condvar_signal(__libcpp_condvar_t *__cv) 191 | -{ 192 | - WakeConditionVariable(__cv); 193 | - return 0; 194 | -} 195 | - 196 | -int __libcpp_condvar_broadcast(__libcpp_condvar_t *__cv) 197 | -{ 198 | - WakeAllConditionVariable(__cv); 199 | - return 0; 200 | -} 201 | - 202 | -int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m) 203 | -{ 204 | - SleepConditionVariableSRW(__cv, __m, INFINITE, 0); 205 | - return 0; 206 | -} 207 | - 208 | -int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, 209 | - timespec *__ts) 210 | -{ 211 | - using namespace _VSTD::chrono; 212 | - 213 | - auto duration = seconds(__ts->tv_sec) + nanoseconds(__ts->tv_nsec); 214 | - auto abstime = 215 | - system_clock::time_point(duration_cast(duration)); 216 | - auto timeout_ms = duration_cast(abstime - system_clock::now()); 217 | - 218 | - if (!SleepConditionVariableSRW(__cv, __m, 219 | - timeout_ms.count() > 0 ? timeout_ms.count() 220 | - : 0, 221 | - 0)) 222 | - { 223 | - auto __ec = GetLastError(); 224 | - return __ec == ERROR_TIMEOUT ? ETIMEDOUT : __ec; 225 | - } 226 | - return 0; 227 | -} 228 | - 229 | -int __libcpp_condvar_destroy(__libcpp_condvar_t *__cv) 230 | -{ 231 | - static_cast(__cv); 232 | - return 0; 233 | -} 234 | - 235 | -// Execute Once 236 | -static inline _LIBCPP_ALWAYS_INLINE BOOL CALLBACK 237 | -__libcpp_init_once_execute_once_thunk(PINIT_ONCE __init_once, PVOID __parameter, 238 | - PVOID *__context) 239 | -{ 240 | - static_cast(__init_once); 241 | - static_cast(__context); 242 | - 243 | - void (*init_routine)(void) = reinterpret_cast(__parameter); 244 | - init_routine(); 245 | - return TRUE; 246 | -} 247 | - 248 | -int __libcpp_execute_once(__libcpp_exec_once_flag *__flag, 249 | - void (*__init_routine)(void)) 250 | -{ 251 | - if (!InitOnceExecuteOnce(__flag, __libcpp_init_once_execute_once_thunk, 252 | - reinterpret_cast(__init_routine), NULL)) 253 | - return GetLastError(); 254 | - return 0; 255 | -} 256 | - 257 | -// Thread ID 258 | -bool __libcpp_thread_id_equal(__libcpp_thread_id __lhs, 259 | - __libcpp_thread_id __rhs) 260 | -{ 261 | - return __lhs == __rhs; 262 | -} 263 | - 264 | -bool __libcpp_thread_id_less(__libcpp_thread_id __lhs, __libcpp_thread_id __rhs) 265 | -{ 266 | - return __lhs < __rhs; 267 | -} 268 | - 269 | -// Thread 270 | -struct __libcpp_beginthreadex_thunk_data 271 | -{ 272 | - void *(*__func)(void *); 273 | - void *__arg; 274 | -}; 275 | - 276 | -static inline _LIBCPP_ALWAYS_INLINE unsigned WINAPI 277 | -__libcpp_beginthreadex_thunk(void *__raw_data) 278 | -{ 279 | - auto *__data = 280 | - static_cast<__libcpp_beginthreadex_thunk_data *>(__raw_data); 281 | - auto *__func = __data->__func; 282 | - void *__arg = __data->__arg; 283 | - delete __data; 284 | - return static_cast(reinterpret_cast(__func(__arg))); 285 | -} 286 | - 287 | -bool __libcpp_thread_isnull(const __libcpp_thread_t *__t) { 288 | - return *__t == 0; 289 | -} 290 | - 291 | -int __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *), 292 | - void *__arg) 293 | -{ 294 | - auto *__data = new __libcpp_beginthreadex_thunk_data; 295 | - __data->__func = __func; 296 | - __data->__arg = __arg; 297 | - 298 | - *__t = reinterpret_cast(_beginthreadex(nullptr, 0, 299 | - __libcpp_beginthreadex_thunk, 300 | - __data, 0, nullptr)); 301 | - 302 | - if (*__t) 303 | - return 0; 304 | - return GetLastError(); 305 | -} 306 | - 307 | -__libcpp_thread_id __libcpp_thread_get_current_id() 308 | -{ 309 | - return GetCurrentThreadId(); 310 | -} 311 | - 312 | -__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t) 313 | -{ 314 | - return GetThreadId(*__t); 315 | -} 316 | - 317 | -int __libcpp_thread_join(__libcpp_thread_t *__t) 318 | -{ 319 | - if (WaitForSingleObjectEx(*__t, INFINITE, FALSE) == WAIT_FAILED) 320 | - return GetLastError(); 321 | - if (!CloseHandle(*__t)) 322 | - return GetLastError(); 323 | - return 0; 324 | -} 325 | - 326 | -int __libcpp_thread_detach(__libcpp_thread_t *__t) 327 | -{ 328 | - if (!CloseHandle(*__t)) 329 | - return GetLastError(); 330 | - return 0; 331 | -} 332 | - 333 | -void __libcpp_thread_yield() 334 | -{ 335 | - SwitchToThread(); 336 | -} 337 | - 338 | -void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns) 339 | -{ 340 | - using namespace chrono; 341 | - // round-up to the nearest milisecond 342 | - milliseconds __ms = 343 | - duration_cast(__ns + chrono::nanoseconds(999999)); 344 | - // FIXME(compnerd) this should be an alertable sleep (WFSO or SleepEx) 345 | - Sleep(__ms.count()); 346 | -} 347 | - 348 | -// Thread Local Storage 349 | -int __libcpp_tls_create(__libcpp_tls_key* __key, 350 | - void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*)) 351 | -{ 352 | - *__key = FlsAlloc(__at_exit); 353 | - if (*__key == FLS_OUT_OF_INDEXES) 354 | - return GetLastError(); 355 | - return 0; 356 | -} 357 | - 358 | -void *__libcpp_tls_get(__libcpp_tls_key __key) 359 | -{ 360 | - return FlsGetValue(__key); 361 | -} 362 | - 363 | -int __libcpp_tls_set(__libcpp_tls_key __key, void *__p) 364 | -{ 365 | - if (!FlsSetValue(__key, __p)) 366 | - return GetLastError(); 367 | - return 0; 368 | -} 369 | - 370 | -#endif // _LIBCPP_HAS_THREAD_API_PTHREAD 371 | - 372 | #endif // !_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL || _LIBCPP_BUILDING_THREAD_LIBRARY_EXTERNAL 373 | 374 | _LIBCPP_END_NAMESPACE_STD 375 | diff --git a/src/support/win32/thread_win32.cpp b/src/support/win32/thread_win32.cpp 376 | new file mode 100644 377 | index 000000000..3f479443e 378 | --- /dev/null 379 | +++ b/src/support/win32/thread_win32.cpp 380 | @@ -0,0 +1,275 @@ 381 | +// -*- C++ -*- 382 | +//===-------------------- support/win32/thread_win32.cpp ------------------===// 383 | +// 384 | +// The LLVM Compiler Infrastructure 385 | +// 386 | +// This file is dual licensed under the MIT and the University of Illinois Open 387 | +// Source Licenses. See LICENSE.TXT for details. 388 | +// 389 | +//===----------------------------------------------------------------------===// 390 | + 391 | +#include <__threading_support> 392 | +#include 393 | +#include 394 | +#include 395 | + 396 | +_LIBCPP_BEGIN_NAMESPACE_STD 397 | + 398 | +static_assert(sizeof(__libcpp_mutex_t) == sizeof(SRWLOCK), ""); 399 | +static_assert(alignof(__libcpp_mutex_t) == alignof(SRWLOCK), ""); 400 | + 401 | +static_assert(sizeof(__libcpp_recursive_mutex_t) == sizeof(CRITICAL_SECTION), 402 | + ""); 403 | +static_assert(alignof(__libcpp_recursive_mutex_t) == alignof(CRITICAL_SECTION), 404 | + ""); 405 | + 406 | +static_assert(sizeof(__libcpp_condvar_t) == sizeof(CONDITION_VARIABLE), ""); 407 | +static_assert(alignof(__libcpp_condvar_t) == alignof(CONDITION_VARIABLE), ""); 408 | + 409 | +static_assert(sizeof(__libcpp_exec_once_flag) == sizeof(INIT_ONCE), ""); 410 | +static_assert(alignof(__libcpp_exec_once_flag) == alignof(INIT_ONCE), ""); 411 | + 412 | +static_assert(sizeof(__libcpp_thread_id) == sizeof(DWORD), ""); 413 | +static_assert(alignof(__libcpp_thread_id) == alignof(DWORD), ""); 414 | + 415 | +static_assert(sizeof(__libcpp_thread_t) == sizeof(HANDLE), ""); 416 | +static_assert(alignof(__libcpp_thread_t) == alignof(HANDLE), ""); 417 | + 418 | +static_assert(sizeof(__libcpp_tls_key) == sizeof(DWORD), ""); 419 | +static_assert(alignof(__libcpp_tls_key) == alignof(DWORD), ""); 420 | + 421 | +// Mutex 422 | +int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m) 423 | +{ 424 | + InitializeCriticalSection((LPCRITICAL_SECTION)__m); 425 | + return 0; 426 | +} 427 | + 428 | +int __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t *__m) 429 | +{ 430 | + EnterCriticalSection((LPCRITICAL_SECTION)__m); 431 | + return 0; 432 | +} 433 | + 434 | +bool __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t *__m) 435 | +{ 436 | + return TryEnterCriticalSection((LPCRITICAL_SECTION)__m) != 0; 437 | +} 438 | + 439 | +int __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t *__m) 440 | +{ 441 | + LeaveCriticalSection((LPCRITICAL_SECTION)__m); 442 | + return 0; 443 | +} 444 | + 445 | +int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t *__m) 446 | +{ 447 | + DeleteCriticalSection((LPCRITICAL_SECTION)__m); 448 | + return 0; 449 | +} 450 | + 451 | +int __libcpp_mutex_lock(__libcpp_mutex_t *__m) 452 | +{ 453 | + AcquireSRWLockExclusive((PSRWLOCK)__m); 454 | + return 0; 455 | +} 456 | + 457 | +bool __libcpp_mutex_trylock(__libcpp_mutex_t *__m) 458 | +{ 459 | + return TryAcquireSRWLockExclusive((PSRWLOCK)__m) != 0; 460 | +} 461 | + 462 | +int __libcpp_mutex_unlock(__libcpp_mutex_t *__m) 463 | +{ 464 | + ReleaseSRWLockExclusive((PSRWLOCK)__m); 465 | + return 0; 466 | +} 467 | + 468 | +int __libcpp_mutex_destroy(__libcpp_mutex_t *__m) 469 | +{ 470 | + static_cast(__m); 471 | + return 0; 472 | +} 473 | + 474 | +// Condition Variable 475 | +int __libcpp_condvar_signal(__libcpp_condvar_t *__cv) 476 | +{ 477 | + WakeConditionVariable((PCONDITION_VARIABLE)__cv); 478 | + return 0; 479 | +} 480 | + 481 | +int __libcpp_condvar_broadcast(__libcpp_condvar_t *__cv) 482 | +{ 483 | + WakeAllConditionVariable((PCONDITION_VARIABLE)__cv); 484 | + return 0; 485 | +} 486 | + 487 | +int __libcpp_condvar_wait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m) 488 | +{ 489 | + SleepConditionVariableSRW((PCONDITION_VARIABLE)__cv, (PSRWLOCK)__m, INFINITE, 0); 490 | + return 0; 491 | +} 492 | + 493 | +int __libcpp_condvar_timedwait(__libcpp_condvar_t *__cv, __libcpp_mutex_t *__m, 494 | + timespec *__ts) 495 | +{ 496 | + using namespace _VSTD::chrono; 497 | + 498 | + auto duration = seconds(__ts->tv_sec) + nanoseconds(__ts->tv_nsec); 499 | + auto abstime = 500 | + system_clock::time_point(duration_cast(duration)); 501 | + auto timeout_ms = duration_cast(abstime - system_clock::now()); 502 | + 503 | + if (!SleepConditionVariableSRW((PCONDITION_VARIABLE)__cv, (PSRWLOCK)__m, 504 | + timeout_ms.count() > 0 ? timeout_ms.count() 505 | + : 0, 506 | + 0)) 507 | + { 508 | + auto __ec = GetLastError(); 509 | + return __ec == ERROR_TIMEOUT ? ETIMEDOUT : __ec; 510 | + } 511 | + return 0; 512 | +} 513 | + 514 | +int __libcpp_condvar_destroy(__libcpp_condvar_t *__cv) 515 | +{ 516 | + static_cast(__cv); 517 | + return 0; 518 | +} 519 | + 520 | +// Execute Once 521 | +static inline _LIBCPP_ALWAYS_INLINE BOOL CALLBACK 522 | +__libcpp_init_once_execute_once_thunk(PINIT_ONCE __init_once, PVOID __parameter, 523 | + PVOID *__context) 524 | +{ 525 | + static_cast(__init_once); 526 | + static_cast(__context); 527 | + 528 | + void (*init_routine)(void) = reinterpret_cast(__parameter); 529 | + init_routine(); 530 | + return TRUE; 531 | +} 532 | + 533 | +int __libcpp_execute_once(__libcpp_exec_once_flag *__flag, 534 | + void (*__init_routine)(void)) 535 | +{ 536 | + if (!InitOnceExecuteOnce((PINIT_ONCE)__flag, __libcpp_init_once_execute_once_thunk, 537 | + reinterpret_cast(__init_routine), NULL)) 538 | + return GetLastError(); 539 | + return 0; 540 | +} 541 | + 542 | +// Thread ID 543 | +bool __libcpp_thread_id_equal(__libcpp_thread_id __lhs, 544 | + __libcpp_thread_id __rhs) 545 | +{ 546 | + return __lhs == __rhs; 547 | +} 548 | + 549 | +bool __libcpp_thread_id_less(__libcpp_thread_id __lhs, __libcpp_thread_id __rhs) 550 | +{ 551 | + return __lhs < __rhs; 552 | +} 553 | + 554 | +// Thread 555 | +struct __libcpp_beginthreadex_thunk_data 556 | +{ 557 | + void *(*__func)(void *); 558 | + void *__arg; 559 | +}; 560 | + 561 | +static inline _LIBCPP_ALWAYS_INLINE unsigned WINAPI 562 | +__libcpp_beginthreadex_thunk(void *__raw_data) 563 | +{ 564 | + auto *__data = 565 | + static_cast<__libcpp_beginthreadex_thunk_data *>(__raw_data); 566 | + auto *__func = __data->__func; 567 | + void *__arg = __data->__arg; 568 | + delete __data; 569 | + return static_cast(reinterpret_cast(__func(__arg))); 570 | +} 571 | + 572 | +bool __libcpp_thread_isnull(const __libcpp_thread_t *__t) { 573 | + return *__t == 0; 574 | +} 575 | + 576 | +int __libcpp_thread_create(__libcpp_thread_t *__t, void *(*__func)(void *), 577 | + void *__arg) 578 | +{ 579 | + auto *__data = new __libcpp_beginthreadex_thunk_data; 580 | + __data->__func = __func; 581 | + __data->__arg = __arg; 582 | + 583 | + *__t = reinterpret_cast(_beginthreadex(nullptr, 0, 584 | + __libcpp_beginthreadex_thunk, 585 | + __data, 0, nullptr)); 586 | + 587 | + if (*__t) 588 | + return 0; 589 | + return GetLastError(); 590 | +} 591 | + 592 | +__libcpp_thread_id __libcpp_thread_get_current_id() 593 | +{ 594 | + return GetCurrentThreadId(); 595 | +} 596 | + 597 | +__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t *__t) 598 | +{ 599 | + return GetThreadId(*__t); 600 | +} 601 | + 602 | +int __libcpp_thread_join(__libcpp_thread_t *__t) 603 | +{ 604 | + if (WaitForSingleObjectEx(*__t, INFINITE, FALSE) == WAIT_FAILED) 605 | + return GetLastError(); 606 | + if (!CloseHandle(*__t)) 607 | + return GetLastError(); 608 | + return 0; 609 | +} 610 | + 611 | +int __libcpp_thread_detach(__libcpp_thread_t *__t) 612 | +{ 613 | + if (!CloseHandle(*__t)) 614 | + return GetLastError(); 615 | + return 0; 616 | +} 617 | + 618 | +void __libcpp_thread_yield() 619 | +{ 620 | + SwitchToThread(); 621 | +} 622 | + 623 | +void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns) 624 | +{ 625 | + using namespace chrono; 626 | + // round-up to the nearest milisecond 627 | + milliseconds __ms = 628 | + duration_cast(__ns + chrono::nanoseconds(999999)); 629 | + // FIXME(compnerd) this should be an alertable sleep (WFSO or SleepEx) 630 | + Sleep(__ms.count()); 631 | +} 632 | + 633 | +// Thread Local Storage 634 | +int __libcpp_tls_create(__libcpp_tls_key* __key, 635 | + void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*)) 636 | +{ 637 | + *__key = FlsAlloc(__at_exit); 638 | + if (*__key == FLS_OUT_OF_INDEXES) 639 | + return GetLastError(); 640 | + return 0; 641 | +} 642 | + 643 | +void *__libcpp_tls_get(__libcpp_tls_key __key) 644 | +{ 645 | + return FlsGetValue(__key); 646 | +} 647 | + 648 | +int __libcpp_tls_set(__libcpp_tls_key __key, void *__p) 649 | +{ 650 | + if (!FlsSetValue(__key, __p)) 651 | + return GetLastError(); 652 | + return 0; 653 | +} 654 | + 655 | +_LIBCPP_END_NAMESPACE_STD 656 | -- 657 | 2.14.3 (Apple Git-98) 658 | 659 | -------------------------------------------------------------------------------- /patches/llvm/0001-cmake-Don-t-build-Native-llvm-config-when-cross-comp.patch: -------------------------------------------------------------------------------- 1 | From 18789ab5c48dce7cfdfbfcb63f86f51225ced536 Mon Sep 17 00:00:00 2001 2 | From: Don Hinton 3 | Date: Sun, 21 Jan 2018 00:29:00 +0000 4 | Subject: [PATCH] [cmake] Don't build Native llvm-config when cross compiling 5 | if passed by user. 6 | 7 | Summary: 8 | Rename LLVM_CONFIG_EXE to LLVM_CONFIG_PATH, and avoid building it if 9 | passed in by user. This is the same way CLANG_TABLEGEN and 10 | LLVM_TABLEGEN are handled, e.g., when -DLLVM_OPTIMIZED_TABLEGEN=ON is 11 | passed. 12 | 13 | Differential Revision: https://reviews.llvm.org/D41806 14 | 15 | This is a stripped down version of this patch. 16 | 17 | git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@323053 91177308-0d34-0410-b5e6-96231b3b80d8 18 | --- 19 | cmake/modules/LLVMExternalProjectUtils.cmake | 2 +- 20 | tools/llvm-config/CMakeLists.txt | 15 +++++++-------- 21 | 2 files changed, 8 insertions(+), 9 deletions(-) 22 | 23 | diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt 24 | index 25f99cec978..d7bebfc6ffa 100644 25 | --- a/tools/llvm-config/CMakeLists.txt 26 | +++ b/tools/llvm-config/CMakeLists.txt 27 | @@ -64,18 +64,17 @@ endif() 28 | # Add the dependency on the generation step. 29 | add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH}) 30 | 31 | -if(CMAKE_CROSSCOMPILING) 32 | - set(${project}_LLVM_CONFIG_EXE "${LLVM_NATIVE_BUILD}/bin/llvm-config") 33 | - set(${project}_LLVM_CONFIG_EXE ${${project}_LLVM_CONFIG_EXE} PARENT_SCOPE) 34 | +if(CMAKE_CROSSCOMPILING AND NOT LLVM_CONFIG_PATH) 35 | + set(LLVM_CONFIG_PATH "${LLVM_NATIVE_BUILD}/bin/llvm-config" CACHE STRING "") 36 | 37 | - add_custom_command(OUTPUT "${${project}_LLVM_CONFIG_EXE}" 38 | + add_custom_command(OUTPUT "${LLVM_CONFIG_PATH}" 39 | COMMAND ${CMAKE_COMMAND} --build . --target llvm-config --config $ 40 | DEPENDS ${LLVM_NATIVE_BUILD}/CMakeCache.txt 41 | WORKING_DIRECTORY ${LLVM_NATIVE_BUILD} 42 | COMMENT "Building native llvm-config..." 43 | USES_TERMINAL) 44 | - add_custom_target(${project}NativeLLVMConfig DEPENDS ${${project}_LLVM_CONFIG_EXE}) 45 | - add_dependencies(${project}NativeLLVMConfig CONFIGURE_LLVM_NATIVE) 46 | + add_custom_target(NativeLLVMConfig DEPENDS ${LLVM_CONFIG_PATH}) 47 | + add_dependencies(NativeLLVMConfig CONFIGURE_LLVM_NATIVE) 48 | 49 | - add_dependencies(llvm-config ${project}NativeLLVMConfig) 50 | -endif(CMAKE_CROSSCOMPILING) 51 | + add_dependencies(llvm-config NativeLLVMConfig) 52 | +endif() 53 | -- 54 | 2.14.3 (Apple Git-98) 55 | 56 | -------------------------------------------------------------------------------- /patches/llvm/0001-fixup-tblgen.patch: -------------------------------------------------------------------------------- 1 | From 41302b461f7491cd7326e33c456c8b4c0fa3a69f Mon Sep 17 00:00:00 2001 2 | From: Martell Malone 3 | Date: Tue, 26 Dec 2017 10:46:35 -0800 4 | Subject: [PATCH] fixup tblgen 5 | 6 | 7 | diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake 8 | index 241140a36d0..7f833c34b67 100644 9 | --- a/cmake/modules/TableGen.cmake 10 | +++ b/cmake/modules/TableGen.cmake 11 | @@ -133,10 +133,10 @@ macro(add_tablegen target project) 12 | set(${project}_TABLEGEN "${target}" CACHE 13 | STRING "Native TableGen executable. Saves building one when cross-compiling.") 14 | 15 | - # Upgrade existing LLVM_TABLEGEN setting. 16 | - if(${project} STREQUAL LLVM) 17 | - if(${LLVM_TABLEGEN} STREQUAL tblgen) 18 | - set(LLVM_TABLEGEN "${target}" CACHE 19 | + # Upgrade existing TABLEGEN setting. 20 | + if(${project} STREQUAL LLVM OR ${project} STREQUAL CLANG) 21 | + if(${${project}_TABLEGEN} STREQUAL tblgen) 22 | + set(${project}_TABLEGEN "${target}" CACHE 23 | STRING "Native TableGen executable. Saves building one when cross-compiling." 24 | FORCE) 25 | endif() 26 | @@ -146,7 +146,7 @@ macro(add_tablegen target project) 27 | set(${project}_TABLEGEN_EXE ${${project}_TABLEGEN} PARENT_SCOPE) 28 | set(${project}_TABLEGEN_TARGET ${${project}_TABLEGEN} PARENT_SCOPE) 29 | 30 | - if(LLVM_USE_HOST_TOOLS AND NOT HAVE_NATIVE_${project}_TABLEGEN) 31 | + if(LLVM_USE_HOST_TOOLS) 32 | if( ${${project}_TABLEGEN} STREQUAL "${target}" ) 33 | if (NOT CMAKE_CONFIGURATION_TYPES) 34 | set(${project}_TABLEGEN_EXE "${LLVM_NATIVE_BUILD}/bin/${target}") 35 | diff --git a/tools/llvm-config/CMakeLists.txt b/tools/llvm-config/CMakeLists.txt 36 | index a6603e65865..da1a18a7761 100644 37 | --- a/tools/llvm-config/CMakeLists.txt 38 | +++ b/tools/llvm-config/CMakeLists.txt 39 | @@ -64,7 +64,7 @@ endif() 40 | # Add the dependency on the generation step. 41 | add_file_dependencies(${CMAKE_CURRENT_SOURCE_DIR}/llvm-config.cpp ${BUILDVARIABLES_OBJPATH}) 42 | 43 | -if(CMAKE_CROSSCOMPILING AND NOT HAVE_NATIVE_LLVM_CONFIG) 44 | +if(CMAKE_CROSSCOMPILING AND NOT LLVM_CONFIG) 45 | set(${project}_LLVM_CONFIG_EXE "${LLVM_NATIVE_BUILD}/bin/llvm-config") 46 | set(${project}_LLVM_CONFIG_EXE ${${project}_LLVM_CONFIG_EXE} PARENT_SCOPE) 47 | 48 | @@ -78,4 +78,4 @@ if(CMAKE_CROSSCOMPILING AND NOT HAVE_NATIVE_LLVM_CONFIG) 49 | add_dependencies(${project}NativeLLVMConfig CONFIGURE_LLVM_NATIVE) 50 | 51 | add_dependencies(llvm-config ${project}NativeLLVMConfig) 52 | -endif(CMAKE_CROSSCOMPILING) 53 | +endif(CMAKE_CROSSCOMPILING AND NOT LLVM_CONFIG) 54 | -- 55 | 2.15.1 56 | 57 | -------------------------------------------------------------------------------- /patches/llvm/0002-CMAKE-apply-O3-for-mingw-clang.patch: -------------------------------------------------------------------------------- 1 | From e180a9b8e861f3fcdd4fc9cb7c69fc0cf21d34a9 Mon Sep 17 00:00:00 2001 2 | From: Martell Malone 3 | Date: Sun, 24 Dec 2017 11:00:14 -0800 4 | Subject: [PATCH 2/2] CMAKE: apply -O3 for mingw clang 5 | 6 | 7 | diff --git a/CMakeLists.txt b/CMakeLists.txt 8 | index c100adef258..22f3c5a7936 100644 9 | --- a/CMakeLists.txt 10 | +++ b/CMakeLists.txt 11 | @@ -829,7 +829,7 @@ endif() 12 | include(AddLLVM) 13 | include(TableGen) 14 | 15 | -if( MINGW ) 16 | +if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) 17 | # People report that -O3 is unreliable on MinGW. The traditional 18 | # build also uses -O2 for that reason: 19 | llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2") 20 | -- 21 | 2.15.1 22 | 23 | -------------------------------------------------------------------------------- /patches/llvm/0003-CMAKE-disable-mbig-obj-for-mingw-clang-asm.patch: -------------------------------------------------------------------------------- 1 | From a18f8e282a79e61b401c60cde47b048c4f9c6590 Mon Sep 17 00:00:00 2001 2 | From: Martell Malone 3 | Date: Sun, 24 Dec 2017 11:14:27 -0800 4 | Subject: [PATCH 3/3] CMAKE: disable -mbig-obj for mingw clang asm 5 | 6 | 7 | diff --git a/cmake/modules/HandleLLVMOptions.cmake b/cmake/modules/HandleLLVMOptions.cmake 8 | index f77600a4830..fb5766e739d 100644 9 | --- a/cmake/modules/HandleLLVMOptions.cmake 10 | +++ b/cmake/modules/HandleLLVMOptions.cmake 11 | @@ -312,7 +312,7 @@ elseif(MINGW) # FIXME: Also cygwin? 12 | # Pass -mbig-obj to mingw gas on Win64. COFF has a 2**16 section limit, and 13 | # on Win64, every COMDAT function creates at least 3 sections: .text, .pdata, 14 | # and .xdata. 15 | - if (CMAKE_SIZEOF_VOID_P EQUAL 8) 16 | + if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT "${CMAKE_ASM_COMPILER_ID}" MATCHES "Clang") 17 | append("-Wa,-mbig-obj" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 18 | endif() 19 | endif() 20 | -- 21 | 2.15.1 22 | 23 | -------------------------------------------------------------------------------- /scripts/build-compiler-rt-armv7-git: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | export USRPREFIX=$PREFIX/usr 6 | 7 | TARGET=armv7-w64-mingw32 8 | 9 | export PATH=$PREFIX/usr/bin:$PATH 10 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar RANLIB=$PREFIX/usr/bin/llvm-ranlib 11 | 12 | cd .. 13 | mkdir build-compiler-rt-armv7-git 14 | cd build-compiler-rt-armv7-git 15 | 16 | cmake -G"Ninja" \ 17 | -DCMAKE_C_COMPILER=$CC \ 18 | -DCMAKE_CXX_COMPILER=$CXX \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_AR=$AR \ 21 | -DCMAKE_RANLIB=$RANLIB \ 22 | -DCMAKE_C_COMPILER_WORKS=1 \ 23 | -DLLVM_CONFIG_PATH=$PREFIX/usr/bin/llvm-config \ 24 | -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE="armv7--windows-gnu" \ 25 | -DCMAKE_SIZEOF_VOID_P=4 \ 26 | ../compiler-rt/lib/builtins 27 | 28 | ninja 29 | 30 | mkdir -p $USRPREFIX/lib/clang/4.0.0/lib/windows 31 | cp lib/windows/libclang_rt.builtins-arm.a $USRPREFIX/lib/clang/4.0.0/lib/windows/libclang_rt.builtins-arm.a 32 | -------------------------------------------------------------------------------- /scripts/build-compiler-rt-i686-git: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | export USRPREFIX=$PREFIX/usr 6 | 7 | TARGET=i686-w64-mingw32 8 | 9 | export PATH=$PREFIX/usr/bin:$PATH 10 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 11 | 12 | cd .. 13 | mkdir build-compiler-rt-i686-git 14 | cd build-compiler-rt-i686-git 15 | 16 | cmake -G"Ninja" \ 17 | -DCMAKE_C_COMPILER=$CC \ 18 | -DCMAKE_CXX_COMPILER=$CXX \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_AR=$AR \ 21 | -DCMAKE_RANLIB=$RANLIB \ 22 | -DCMAKE_C_COMPILER_WORKS=1 \ 23 | -DLLVM_CONFIG_PATH=$PREFIX/usr/bin/llvm-config \ 24 | -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE="i686--windows-gnu" \ 25 | -DCMAKE_SIZEOF_VOID_P=4 \ 26 | ../compiler-rt/lib/builtins 27 | 28 | ninja 29 | 30 | mkdir -p $USRPREFIX/lib/clang/4.0.0/lib/windows 31 | cp lib/windows/libclang_rt.builtins-i686.a $USRPREFIX/lib/clang/4.0.0/lib/windows/libclang_rt.builtins-i686.a 32 | -------------------------------------------------------------------------------- /scripts/build-compiler-rt-x86_64-git: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | export USRPREFIX=$PREFIX/usr 6 | 7 | TARGET=x86_64-w64-mingw32 8 | 9 | export PATH=$PREFIX/usr/bin:$PATH 10 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar RANLIB=$PREFIX/usr/bin/llvm-ranlib 11 | 12 | cd .. 13 | mkdir build-compiler-rt-x86_64-git 14 | cd build-compiler-rt-x86_64-git 15 | 16 | cmake -G"Ninja" \ 17 | -DCMAKE_C_COMPILER=$CC \ 18 | -DCMAKE_CXX_COMPILER=$CXX \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_AR=$AR \ 21 | -DCMAKE_RANLIB=$RANLIB \ 22 | -DCMAKE_C_COMPILER_WORKS=1 \ 23 | -DLLVM_CONFIG_PATH=$PREFIX/usr/bin/llvm-config \ 24 | -DCOMPILER_RT_DEFAULT_TARGET_TRIPLE="x86_64--windows-gnu" \ 25 | -DCMAKE_SIZEOF_VOID_P=8 \ 26 | ../compiler-rt/lib/builtins 27 | 28 | ninja 29 | 30 | mkdir -p $USRPREFIX/lib/clang/4.0.0/lib/windows 31 | cp lib/windows/libclang_rt.builtins-x86_64.a $USRPREFIX/lib/clang/4.0.0/lib/windows/libclang_rt.builtins-x86_64.a 32 | -------------------------------------------------------------------------------- /scripts/build-libcxx-armv7: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=armv7-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar RANLIB=$PREFIX/usr/bin/llvm-ranlib 10 | 11 | cd .. 12 | mkdir build-libcxx-armv7-git 13 | cd build-libcxx-armv7-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CROSSCOMPILING=TRUE \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 21 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 22 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 23 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 24 | -DLIBCXX_INSTALL_HEADERS=OFF \ 25 | -DLIBCXX_ENABLE_EXCEPTIONS=OFF \ 26 | -DLIBCXX_ENABLE_THREADS=OFF \ 27 | -DLIBCXX_ENABLE_MONOTONIC_CLOCK=OFF \ 28 | -DLIBCXX_ENABLE_SHARED=OFF \ 29 | -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ 30 | -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ 31 | -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ 32 | -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ 33 | ../libcxx 34 | 35 | ninja -j1 36 | DESTDIR=$PREFIX ninja install 37 | -------------------------------------------------------------------------------- /scripts/build-libcxx-headers: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | mkdir -p $PREFIX/usr/include/c++/v1 7 | cd .. 8 | cp -r libcxx/include/* $PREFIX/usr/include/c++/v1 9 | -------------------------------------------------------------------------------- /scripts/build-libcxx-i686: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=i686-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar RANLIB=$PREFIX/usr/bin/llvm-ranlib 10 | 11 | cd .. 12 | mkdir build-libcxx-i686-git 13 | cd build-libcxx-i686-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CROSSCOMPILING=TRUE \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 21 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 22 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 23 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 24 | -DLIBCXX_INSTALL_HEADERS=OFF \ 25 | -DLIBCXX_ENABLE_EXCEPTIONS=OFF \ 26 | -DLIBCXX_ENABLE_THREADS=OFF \ 27 | -DLIBCXX_ENABLE_MONOTONIC_CLOCK=OFF \ 28 | -DLIBCXX_ENABLE_SHARED=OFF \ 29 | -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ 30 | -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ 31 | -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ 32 | -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ 33 | ../libcxx 34 | 35 | ninja -j1 36 | DESTDIR=$PREFIX ninja install 37 | -------------------------------------------------------------------------------- /scripts/build-libcxx-x86_64: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=x86_64-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar RANLIB=$PREFIX/usr/bin/llvm-ranlib 10 | 11 | cd .. 12 | mkdir build-libcxx-x86_64-git 13 | cd build-libcxx-x86_64-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CROSSCOMPILING=TRUE \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 21 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 22 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 23 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 24 | -DLIBCXX_INSTALL_HEADERS=OFF \ 25 | -DLIBCXX_ENABLE_EXCEPTIONS=OFF \ 26 | -DLIBCXX_ENABLE_THREADS=OFF \ 27 | -DLIBCXX_ENABLE_MONOTONIC_CLOCK=OFF \ 28 | -DLIBCXX_ENABLE_SHARED=OFF \ 29 | -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ 30 | -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ 31 | -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ 32 | -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ 33 | ../libcxx 34 | 35 | ninja -j1 36 | DESTDIR=$PREFIX ninja install 37 | -------------------------------------------------------------------------------- /scripts/build-libcxx-x86_64-threads: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=x86_64-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar RANLIB=$PREFIX/usr/bin/llvm-ranlib 10 | 11 | cd .. 12 | mkdir build-libcxx-x86_64-threads-git 13 | cd build-libcxx-x86_64-threads-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CROSSCOMPILING=TRUE \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 21 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 22 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 23 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 24 | -DLIBCXX_INSTALL_HEADERS=OFF \ 25 | -DLIBCXX_ENABLE_EXCEPTIONS=OFF \ 26 | -DLIBCXX_ENABLE_THREADS=ON \ 27 | -DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \ 28 | -DLIBCXX_ENABLE_SHARED=OFF \ 29 | -DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \ 30 | -DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \ 31 | -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \ 32 | -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \ 33 | ../libcxx 34 | 35 | ninja -j1 36 | DESTDIR=$PREFIX ninja install 37 | -------------------------------------------------------------------------------- /scripts/build-libcxxabi-armv7: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=armv7-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-libcxxabi-armv7-git 13 | cd build-libcxxabi-armv7-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CXX_COMPILER_WORKS=1 \ 19 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 20 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 21 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 22 | -DLIBCXXABI_USE_COMPILER_RT=ON \ 23 | -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF \ 24 | -DLIBCXXABI_ENABLE_THREADS=OFF \ 25 | -DLIBCXXABI_TARGET_TRIPLE=$TARGET \ 26 | -DLIBCXXABI_SYSROOT=$PREFIX/usr \ 27 | -DLIBCXXABI_ENABLE_SHARED=OFF \ 28 | -DLIBCXXABI_LIBCXX_INCLUDES="../libcxx/include" \ 29 | -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ 30 | -DCXX_SUPPORTS_CXX11=TRUE \ 31 | ../libcxxabi 32 | 33 | ninja 34 | DESTDIR=$PREFIX ninja install -------------------------------------------------------------------------------- /scripts/build-libcxxabi-i686: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=i686-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-libcxxabi-i686-git 13 | cd build-libcxxabi-i686-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CXX_COMPILER_WORKS=1 \ 19 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 20 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 21 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 22 | -DLIBCXXABI_USE_COMPILER_RT=ON \ 23 | -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF \ 24 | -DLIBCXXABI_ENABLE_THREADS=OFF \ 25 | -DLIBCXXABI_TARGET_TRIPLE=$TARGET \ 26 | -DLIBCXXABI_SYSROOT=$PREFIX/usr \ 27 | -DLIBCXXABI_ENABLE_SHARED=OFF \ 28 | -DLIBCXXABI_LIBCXX_INCLUDES="../libcxx/include" \ 29 | -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ 30 | -DCXX_SUPPORTS_CXX11=TRUE \ 31 | ../libcxxabi 32 | 33 | ninja 34 | DESTDIR=$PREFIX ninja install -------------------------------------------------------------------------------- /scripts/build-libcxxabi-x86_64: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=x86_64-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$TARGET-clang CXX=$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-libcxxabi-x86_64-git 13 | cd build-libcxxabi-x86_64-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CXX_COMPILER_WORKS=1 \ 19 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 20 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 21 | -DCMAKE_INSTALL_PREFIX=/usr/$TARGET \ 22 | -DLIBCXXABI_USE_COMPILER_RT=ON \ 23 | -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF \ 24 | -DLIBCXXABI_ENABLE_THREADS=OFF \ 25 | -DLIBCXXABI_TARGET_TRIPLE=$TARGET \ 26 | -DLIBCXXABI_SYSROOT=$PREFIX/usr \ 27 | -DLIBCXXABI_ENABLE_SHARED=OFF \ 28 | -DLIBCXXABI_LIBCXX_INCLUDES="../libcxx/include" \ 29 | -DLLVM_NO_OLD_LIBSTDCXX=TRUE \ 30 | -DCXX_SUPPORTS_CXX11=TRUE \ 31 | ../libcxxabi 32 | 33 | ninja 34 | DESTDIR=$PREFIX ninja install -------------------------------------------------------------------------------- /scripts/build-libunwind-x86_64: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | export USRPREFIX=$PREFIX/usr 6 | 7 | export PATH=$PREFIX/usr/bin:$PATH 8 | 9 | cd .. 10 | mkdir build-compiler-rt-git 11 | cd build-compiler-rt-git 12 | 13 | cmake -G"Ninja" \ 14 | -DCMAKE_TOOLCHAIN_FILE=../scripts/mingw.toolchain \ 15 | -DCMAKE_C_COMPILER=$PREFIX/usr/bin/clang \ 16 | -DCMAKE_CXX_COMPILER=$PREFIX/usr/bin/clang++ \ 17 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar \ 18 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib \ 19 | -DCMAKE_INSTALL_PREFIX="/usr" \ 20 | -DCMAKE_BUILD_TYPE=Release \ 21 | -DCMAKE_C_COMPILER_WORKS=ON \ 22 | ../compiler-rt/lib/builtins 23 | 24 | ninja 25 | DESTDIR=/Users/martell/llvm ninja install 26 | 27 | mkdir -p $USRPREFIX/lib/clang/3.9.0/lib/windows 28 | cp $USRPREFIX/lib/windows/libclang_rt.builtins-x86_64.a $USRPREFIX/lib/clang/3.9.0/lib/windows/libclang_rt.builtins-x86_64.a 29 | cp $USRPREFIX/lib/windows/libclang_rt.builtins-i386.a $USRPREFIX/lib/clang/3.9.0/lib/windows/libclang_rt.builtins-i386.a 30 | cp $USRPREFIX/lib/windows/libclang_rt.builtins-arm.a $USRPREFIX/lib/clang/3.9.0/lib/windows/libclang_rt.builtins-arm.a -------------------------------------------------------------------------------- /scripts/build-llvm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | # arguments:defaults 4 | # toolchain_prefix:mingw-w64-toolchain cmake_build_type:release 5 | DEFAULT_PREFIX="$(pwd)/mingw-w64-toolchain" 6 | 7 | if [ "$1" != "" ]; then 8 | TOOLCHAIN_PREFIX="${1}" 9 | else 10 | TOOLCHAIN_PREFIX="$(pwd)/mingw-w64-cross-toolchain" 11 | fi 12 | 13 | CMAKE_BUILD_TYPE="${2:Release}" 14 | 15 | # TODO: check the clang version being used 16 | if [ "$(which clang)" != "" ]; then 17 | CMAKE_COMPILER="-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++" 18 | fi 19 | 20 | if [ "$(which ninja)" != "" ]; then 21 | CMAKE_GENERATOR="-G Ninja" 22 | NINJA=1 23 | fi 24 | 25 | # Build LLVM, Clang and LLD 26 | cd llvm 27 | mkdir -p build 28 | cd build 29 | cmake $CMAKE_GENERATOR \ 30 | $CMAKE_COMPILER \ 31 | -DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX \ 32 | -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \ 33 | -DLLVM_ENABLE_ASSERTIONS=ON \ 34 | -DLLVM_TARGETS_TO_BUILD="ARM;X86" \ 35 | -DCLANG_DEFAULT_CXX_STDLIB=libc++ \ 36 | -DCLANG_DEFAULT_LINKER=lld \ 37 | -DCLANG_DEFAULT_RTLIB=compiler-rt \ 38 | ../ 39 | ninja 40 | ninja install 41 | # clang-tblgen is not part of install so we manually install it. 42 | cp bin/clang-tblgen $TOOLCHAIN_PREFIX/bin/clang-tblgen 43 | # cleanup build folder 44 | cd .. && rm -rf build 45 | -------------------------------------------------------------------------------- /scripts/build-mingw-w64-llvm-armv7: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=armv7-w64-mingw32 7 | 8 | #export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$PREFIX/usr/bin/$TARGET-clang CXX=$PREFIX/usr/bin/$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-mingw-armv7-llvm-git 13 | cd build-mingw-armv7-llvm-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_C_FLAGS="-D__CRT__NO_INLINE" \ 19 | -DCMAKE_CXX_FLAGS="-D_GNU_SOURCE -D_LIBCPP_HAS_NO_CONSTEXPR -D__CRT__NO_INLINE" \ 20 | -DCMAKE_CROSSCOMPILING=TRUE \ 21 | -DCMAKE_SYSTEM_NAME=Windows \ 22 | -DMINGW=TRUE \ 23 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 24 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 25 | -DCMAKE_INSTALL_PREFIX="/usr" \ 26 | -DCMAKE_BUILD_TYPE=Release \ 27 | -DLLVM_TABLEGEN=$PREFIX/usr/bin/llvm-tblgen \ 28 | -DLLVM_CONFIG_PATH=$PREFIX/usr/bin/llvm-config \ 29 | -DLLVM_DEFAULT_TARGET_TRIPLE="armv7--windows-gnu" \ 30 | -DLLVM_TARGET_ARCH=X86 \ 31 | -DLLVM_TARGETS_TO_BUILD=X86 \ 32 | -DLLVM_ENABLE_ASSERTIONS=OFF \ 33 | -DLLVM_ENABLE_THREADS=0 \ 34 | -DPYTHON_EXECUTABLE=/usr/bin/python \ 35 | -DLLVM_ENABLE_FFI=OFF \ 36 | -DLLVM_ENABLE_SPHINX=OFF \ 37 | -DCMAKE_VERBOSE_MAKEFILE=ON \ 38 | -DLLVM_BUILD_TESTS=OFF \ 39 | -DLLVM_BUILD_STATIC=TRUE \ 40 | ../llvm 41 | 42 | 43 | # -DCLANG_TABLEGEN=$PREFIX/usr/bin/clang-tblgen \ 44 | # -DLLVM_ON_WIN32=TRUE \ 45 | 46 | ninja 47 | #DESTDIR=/Users/martell/llvm ninja install 48 | -------------------------------------------------------------------------------- /scripts/build-mingw-w64-llvm-i686: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=i686-w64-mingw32 7 | 8 | #export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$PREFIX/usr/bin/$TARGET-clang CXX=$PREFIX/usr/bin/$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-mingw-i686-llvm-git 13 | cd build-mingw-i686-llvm-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_CROSSCOMPILING=TRUE \ 19 | -DCMAKE_SYSTEM_NAME=Windows \ 20 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 21 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 22 | -DCMAKE_INSTALL_PREFIX="/usr" \ 23 | -DCMAKE_BUILD_TYPE=Release \ 24 | -DLLVM_TABLEGEN=$PREFIX/usr/bin/llvm-tblgen \ 25 | -DLLVM_DEFAULT_TARGET_TRIPLE="i686--windows-gnu" \ 26 | -DLLVM_TARGET_ARCH=X86 \ 27 | -DLLVM_TARGETS_TO_BUILD=X86 \ 28 | -DLLVM_ENABLE_ASSERTIONS=OFF \ 29 | -DLLVM_ENABLE_THREADS=0 \ 30 | -DPYTHON_EXECUTABLE=/usr/bin/python \ 31 | -DLLVM_ENABLE_FFI=OFF \ 32 | -DLLVM_ENABLE_SPHINX=OFF \ 33 | -DCMAKE_VERBOSE_MAKEFILE=ON \ 34 | ../llvm 35 | 36 | 37 | # -DCLANG_TABLEGEN=$PREFIX/usr/bin/clang-tblgen \ 38 | # -DLLVM_ON_WIN32=TRUE \ 39 | 40 | ninja 41 | #DESTDIR=/Users/martell/llvm ninja install 42 | -------------------------------------------------------------------------------- /scripts/build-mingw-w64-llvm-x86_64: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=x86_64-w64-mingw32 7 | 8 | #export PATH=$PREFIX/usr/bin:$PATH 9 | export CC=$PREFIX/usr/bin/$TARGET-clang CXX=$PREFIX/usr/bin/$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-mingw-x86_64-llvm-git 13 | cd build-mingw-x86_64-llvm-git 14 | 15 | cmake -G"Ninja" \ 16 | -DCMAKE_C_COMPILER=$CC \ 17 | -DCMAKE_CXX_COMPILER=$CXX \ 18 | -DCMAKE_C_FLAGS="-D__CRT__NO_INLINE" \ 19 | -DCMAKE_CXX_FLAGS="-D__CRT__NO_INLINE" \ 20 | -DCMAKE_CROSSCOMPILING=TRUE \ 21 | -DCMAKE_SYSTEM_NAME=Windows \ 22 | -DCMAKE_BASE_NAME=GNU \ 23 | -DCMAKE_AR=$PREFIX/usr/bin/llvm-ar-gnu \ 24 | -DCMAKE_RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu \ 25 | -DCMAKE_INSTALL_PREFIX="/usr" \ 26 | -DCMAKE_BUILD_TYPE=Release \ 27 | -DLLVM_TABLEGEN=$PREFIX/usr/bin/llvm-tblgen \ 28 | -DCLANG_TABLEGEN=$PREFIX/usr/bin/clang-tblgen \ 29 | -DLLVM_DEFAULT_TARGET_TRIPLE="x86_64--windows-gnu" \ 30 | -DLLVM_TARGET_ARCH=X86 \ 31 | -DLLVM_TARGETS_TO_BUILD=X86 \ 32 | -DLLVM_ENABLE_ASSERTIONS=OFF \ 33 | -DLLVM_ENABLE_THREADS=0 \ 34 | -DPYTHON_EXECUTABLE=/usr/bin/python \ 35 | -DLLVM_ENABLE_FFI=OFF \ 36 | -DLLVM_ENABLE_SPHINX=OFF \ 37 | -DCMAKE_VERBOSE_MAKEFILE=ON \ 38 | -DLLVM_BUILD_TESTS=OFF \ 39 | -DLLVM_BUILD_STATIC=TRUE \ 40 | -DCLANG_ENABLE_ARCMT=OFF \ 41 | -DLLVM_INCLUDE_TESTS=OFF \ 42 | -DCLANG_INCLUDE_TESTS=OFF \ 43 | -DLIBCLANG_BUILD_STATIC=ON \ 44 | -DBUILD_SHARED_LIBS=OFF \ 45 | ../llvm 46 | 47 | #-DCMAKE_C_FLAGS="-D__CRT__NO_INLINE" \ 48 | #-DCMAKE_CXX_FLAGS="-D_GNU_SOURCE -D_LIBCPP_HAS_NO_CONSTEXPR -D__CRT__NO_INLINE" \ 49 | 50 | 51 | # -DCLANG_TABLEGEN=$PREFIX/usr/bin/clang-tblgen \ 52 | # -DLLVM_ON_WIN32=TRUE \ 53 | 54 | ninja 55 | DESTDIR=/Users/martell/llvm/mingw-w64-x86_64 ninja install 56 | -------------------------------------------------------------------------------- /scripts/build-mingw-w64-tools: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | #TARGET=i686-w64-mingw32 7 | #export CC=clang CXX=clang++ 8 | tools="gendef genlib" 9 | 10 | cd .. 11 | mkdir build-mingw-w64-tools 12 | 13 | local cur= 14 | for cur in ${tools}; do 15 | mkdir -p build-mingw-w64-tools/${cur} 16 | cd build-mingw-w64-tools/${cur} 17 | ../../mingw-w64/mingw-w64-tools/${cur}/configure \ 18 | --prefix=/usr 19 | make 20 | cd ../.. 21 | done 22 | 23 | local cur= 24 | for cur in ${tools}; do 25 | cd build-mingw-w64-tools/${cur} 26 | make DESTDIR=$PREFIX install 27 | cd ../.. 28 | done 29 | -------------------------------------------------------------------------------- /scripts/build-mingw-w64-x86_64-winpthreads: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PREFIX=~/llvm 4 | eval PREFIX=$PREFIX 5 | 6 | TARGET=x86_64-w64-mingw32 7 | 8 | export PATH=$PREFIX/usr/bin:$PATH 9 | export MAKE=/usr/bin/make CC=$PREFIX/usr/bin/$TARGET-clang CXX=$PREFIX/usr/bin/$TARGET-clang++ AR=$PREFIX/usr/bin/llvm-ar-gnu RANLIB=$PREFIX/usr/bin/llvm-ranlib-gnu 10 | 11 | cd .. 12 | mkdir build-$TARGET-winpthreads 13 | cd build-$TARGET-winpthreads 14 | 15 | AR="llvm-ar -format gnu" \ 16 | ../mingw-w64/mingw-w64-libraries/winpthreads/configure \ 17 | --host=$TARGET \ 18 | --prefix=$PREFIX/usr/$TARGET \ 19 | --disable-shared 20 | 21 | make -j1 22 | make -j1 install 23 | -------------------------------------------------------------------------------- /scripts/build-mingw-w64.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | # arguments:defaults 4 | # toolchain_prefix:mingw-w64-toolchain toolchain_archs:i686 x86_64 arm 5 | DEFAULT_PREFIX="$(pwd)/mingw-w64-toolchain" 6 | 7 | if [ "$1" != "" ]; then 8 | TOOLCHAIN_PREFIX="${1}" 9 | else 10 | TOOLCHAIN_PREFIX="$(pwd)/mingw-w64-cross-toolchain" 11 | fi 12 | 13 | if [ "$2" != "" ]; then 14 | shift 15 | TOOLCHAIN_ARCHS="$@" 16 | else 17 | TOOLCHAIN_ARCHS="i686 x86_64 armv7" 18 | fi 19 | 20 | cd mingw-w64/mingw-w64-headers 21 | for arch in $TOOLCHAIN_ARCHS; do 22 | mkdir build-$arch && cd build-$arch 23 | ../configure --host=$arch-w64-mingw32 \ 24 | --enable-secure-api \ 25 | --enable-idl \ 26 | --prefix= \ 27 | --with-default-win32-winnt=0x600 28 | DESTDIR=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 make install 29 | cd .. && rm -rf build-$arch 30 | done 31 | cd ../.. 32 | 33 | 34 | # Build Mingw-w64 with our freshly built Clang 35 | cd mingw-w64/mingw-w64-crt 36 | for arch in $TOOLCHAIN_ARCHS; do 37 | mkdir build-$arch && cd build-$arch 38 | case $arch in 39 | armv7) 40 | FLAGS="--disable-lib32 --disable-lib64 --enable-libarm32" 41 | ;; 42 | i686) 43 | FLAGS="--enable-lib32 --disable-lib64" 44 | ;; 45 | x86_64) 46 | FLAGS="--disable-lib32 --enable-lib64" 47 | ;; 48 | esac 49 | CC=$arch-w64-mingw32-clang \ 50 | CXX=$arch-w64-mingw32-clang++ \ 51 | AS=llvm-as \ 52 | AR=llvm-ar \ 53 | RANLIB=llvm-ranlib \ 54 | DLLTOOL=llvm-dlltool \ 55 | ../configure \ 56 | --prefix= \ 57 | --host=$arch-w64-mingw32 \ 58 | $FLAGS 59 | make 60 | DESTDIR=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 make install 61 | cd .. && rm -rf build-$arch 62 | done -------------------------------------------------------------------------------- /tests/test-exception.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main(int argc, char* argv[]) { 5 | try { 6 | throw std::exception(); 7 | } catch (std::exception& e) { 8 | printf("caught std::exception\n"); 9 | } 10 | return 0; 11 | } 12 | -------------------------------------------------------------------------------- /tests/test-tors.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void ctorTest(void) __attribute__ ((constructor)); 4 | void dtorTest(void) __attribute__ ((destructor)); 5 | 6 | void ctorTest(void) { 7 | printf ("ctor before main\n"); 8 | } 9 | 10 | void dtorTest(void) { 11 | printf ("dtor after main\n"); 12 | } 13 | 14 | int main() { 15 | printf("hello world\n"); 16 | return 0; 17 | } 18 | -------------------------------------------------------------------------------- /tests/test.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) { 4 | printf("hello world\n"); 5 | return 0; 6 | } 7 | -------------------------------------------------------------------------------- /tests/test.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int main(int argc, char* argv[]) { 4 | std::cout<<"Hello world from C++"<