aboutsummaryrefslogtreecommitdiffstats
path: root/community/llvm3.7
diff options
context:
space:
mode:
authorJakub Jirutka <jakub@jirutka.cz>2016-08-17 22:10:34 +0200
committerJakub Jirutka <jakub@jirutka.cz>2016-08-17 22:10:34 +0200
commitc7c00f22fa96aaaed4ef025e8381b44642306281 (patch)
tree854793394d51dc556162c5d44f8662e9eaa2e4cd /community/llvm3.7
parent28eea326ce6605ee708cb1df0c67a3f90cdb5a79 (diff)
downloadaports-c7c00f22fa96aaaed4ef025e8381b44642306281.tar.bz2
aports-c7c00f22fa96aaaed4ef025e8381b44642306281.tar.xz
community/llvm3.7: move from testing
Diffstat (limited to 'community/llvm3.7')
-rw-r--r--community/llvm3.7/APKBUILD221
-rw-r--r--community/llvm3.7/cmake-fix-libLLVM-name.patch76
-rw-r--r--community/llvm3.7/config.guess.patch13
-rw-r--r--community/llvm3.7/llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch112
-rw-r--r--community/llvm3.7/llvm-0002-Fix-build-with-musl-libc.patch35
-rw-r--r--community/llvm3.7/llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch33
-rw-r--r--community/llvm3.7/llvm-nm-workaround.patch27
7 files changed, 517 insertions, 0 deletions
diff --git a/community/llvm3.7/APKBUILD b/community/llvm3.7/APKBUILD
new file mode 100644
index 0000000000..a929ea6dd6
--- /dev/null
+++ b/community/llvm3.7/APKBUILD
@@ -0,0 +1,221 @@
+# Contributor: Travis Tilley <ttilley@gmail.com>
+# Contributor: Mitch Tishmack <mitch.tishmack@gmail.com>
+# Contributor: Jakub Jirutka <jakub@jirutka.cz>
+# Maintainer: Travis Tilley <ttilley@gmail.com>
+pkgname=llvm3.7
+_pkgname=llvm
+_majorver=3.7
+pkgver=$_majorver.1
+pkgrel=4
+pkgdesc="Low Level Virtual Machine compiler system (version $_majorver)"
+arch="all"
+url="http://llvm.org/"
+license="UOI-NCSA"
+depends=""
+depends_dev="$pkgname-libs"
+makedepends="
+ binutils-dev
+ bison
+ chrpath
+ cmake
+ file
+ flex
+ groff
+ isl-dev
+ libffi-dev
+ make
+ paxmark
+ py-sphinx
+ python
+ python-dev
+ zlib-dev
+ "
+subpackages="$pkgname-static $pkgname-libs $pkgname-dev"
+source="http://llvm.org/releases/$pkgver/llvm-$pkgver.src.tar.xz
+ llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch
+ llvm-0002-Fix-build-with-musl-libc.patch
+ llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch
+ llvm-nm-workaround.patch
+ config.guess.patch
+ cmake-fix-libLLVM-name.patch
+ "
+builddir="$srcdir/$_pkgname-$pkgver.src"
+
+# NOTE: It seems that there's no (sane) way how to change includedir, sharedir
+# etc. separately, just the CMAKE_INSTALL_PREFIX. Standard CMake variables and
+# even LLVM-specific variables, that are related to these paths, actually
+# don't work (in llvm 3.7).
+#
+# When building a software that depends on LLVM, utility llvm-config should be
+# used to discover where is LLVM installed. It provides options to print
+# path of bindir, includedir, and libdir separately, but in its source, all
+# these paths are actually hard-coded against INSTALL_PREFIX. We can patch it
+# and move paths manually, but I'm really not sure what it may break...
+#
+# Also note that we should *not* add version suffix to files in llvm bindir!
+# It breaks build system of some software that depends on LLVM, because they
+# don't expect these files to have a sufix.
+#
+# So, we install all the LLVM files into /usr/lib/llvm-$_majorver.
+# BTW, Debian do the same thing.
+#
+_prefix="usr/lib/llvm-$_majorver"
+ldpath="/$_prefix/lib"
+
+prepare() {
+ cd "$builddir"
+ mkdir -p "$builddir"/build
+
+ update_config_sub || return 1
+
+ # Apply patches while ignoring whitespace changes.
+ local i; for i in $source; do
+ case $i in
+ *.patch)
+ msg "Applying $i..."
+ patch --ignore-whitespace -s -p1 -N -i "$srcdir"/$i || return 1
+ ;;
+ esac
+ done
+
+ # Remove some tests that fails.
+ rm test/tools/llvm-objdump/macho-compact-unwind-x86_64.test \
+ test/tools/llvm-objdump/macho-compact-unwind-i386.test \
+ test/Transforms/GlobalOpt/alias-used.ll || return 1
+}
+
+build() {
+ cd "$builddir"/build
+
+ # Auto-detect it by guessing either.
+ local ffi_include_dir="$(pkg-config --cflags-only-I libffi | sed 's|^-I||g')"
+
+ cmake -G "Unix Makefiles" -Wno-dev \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=/$_prefix \
+ -DCMAKE_VERBOSE_MAKEFILE=NO \
+ \
+ -DFFI_INCLUDE_DIR="$ffi_include_dir" \
+ -DLLVM_BINUTILS_INCDIR=/usr/include \
+ -DLLVM_BUILD_DOCS=ON \
+ -DLLVM_BUILD_EXAMPLES=OFF \
+ -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \
+ -DLLVM_BUILD_LLVM_DYLIB=ON \
+ -DLLVM_BUILD_TESTS=ON \
+ -DLLVM_DEFAULT_TARGET_TRIPLE="$CBUILD" \
+ -DLLVM_DYLIB_EXPORT_ALL=ON \
+ -DLLVM_ENABLE_ASSERTIONS=OFF \
+ -DLLVM_ENABLE_CXX1Y=ON \
+ -DLLVM_ENABLE_FFI=ON \
+ -DLLVM_ENABLE_LIBCXX=OFF \
+ -DLLVM_ENABLE_PIC=ON \
+ -DLLVM_ENABLE_RTTI=ON \
+ -DLLVM_ENABLE_SPHINX=OFF \
+ -DLLVM_ENABLE_TERMINFO=ON \
+ -DLLVM_ENABLE_ZLIB=ON \
+ -DLLVM_HOST_TRIPLE="$CHOST" \
+ -DLLVM_INCLUDE_EXAMPLES=OFF \
+ -DLLVM_TARGETS_TO_BUILD=all \
+ \
+ "$builddir" || return 1
+
+ make llvm-tblgen || return 1
+ make || return 1
+
+ paxmark m bin/llvm-rtdyld \
+ bin/lli \
+ bin/lli-child-target \
+ unittests/ExecutionEngine/MCJIT/MCJITTests \
+ unittests/Support/SupportTests || return 1
+
+ case "$CARCH" in
+ arm*)
+ # ARM has few failures in test suite
+ # that we don't care about currently.
+ ;;
+ *)
+ make check-llvm || return 1
+ ;;
+ esac
+}
+
+package() {
+ cd "$builddir"/build
+ make DESTDIR="$pkgdir" install || return 1
+
+ cd "$pkgdir"/$_prefix
+
+ # Remove RPATHs.
+ file lib/*.so bin/* \
+ | awk -F: '$2~/ELF/{print $1}' \
+ | xargs -r chrpath -d || return 1
+
+ # Symlink files in bindir to /usr/bin with version suffix.
+ mkdir -p "$pkgdir"/usr/bin
+ local path; for path in bin/*; do
+ ln -s ../lib/llvm-$_majorver/$path \
+ "$pkgdir"/usr/$path-$_majorver || return 1
+ done
+}
+
+static() {
+ pkgdesc="LLVM $_majorver static libraries"
+
+ _mv "$pkgdir"/$_prefix/lib/*.a "$subpkgdir"/$_prefix/lib/
+}
+
+libs() {
+ pkgdesc="LLVM $_majorver runtime libraries"
+ local soname="libLLVM-$_majorver.so"
+
+ mkdir -p "$subpkgdir"
+ cd "$subpkgdir"
+
+ # libLLVM should be in /usr/lib. This is needed for binaries that are
+ # dynamically linked with libLLVM, so they can find it on default path.
+ _mv "$pkgdir"/$_prefix/lib/$soname usr/lib/ || return 1
+ ln -s $soname usr/lib/${soname/$_majorver/$pkgver} || return 1
+
+ # And also symlink it back to the LLVM prefix.
+ mkdir -p $_prefix/lib
+ ln -s ../../$soname $_prefix/lib/$soname || return 1
+ ln -s ../../$soname $_prefix/lib/${soname/$_majorver/$pkgver}
+}
+
+dev() {
+ default_dev || return 1
+
+ cd "$subpkgdir"
+
+ _mv "$pkgdir"/$_prefix/share "$pkgdir"/$_prefix/lib $_prefix/ || return 1
+ _mv "$pkgdir"/$_prefix/bin/llvm-config $_prefix/bin/ || return 1
+ _mv "$pkgdir"/usr/bin/llvm-config-* usr/bin/
+}
+
+_mv() {
+ local dest; for dest; do true; done # get last argument
+ mkdir -p "$dest"
+ mv $@
+}
+
+md5sums="bf8b3a2c79e61212c5409041dfdbd319 llvm-3.7.1.src.tar.xz
+b370ea6589931c560a92699b890dd888 llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch
+b0cd098117223159b76e96c3f884536b llvm-0002-Fix-build-with-musl-libc.patch
+9cc5050619f764ca9dc842a5ab122290 llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch
+785147afd8ab80fa95955a5637b6582f llvm-nm-workaround.patch
+57d95aabd731eca1c1411ceb1894120c config.guess.patch
+a263b29c441c1c83b12535a3f9fd3410 cmake-fix-libLLVM-name.patch"
+sha256sums="be7794ed0cec42d6c682ca8e3517535b54555a3defabec83554dbc74db545ad5 llvm-3.7.1.src.tar.xz
+6018671b549f3043ab4d7100956f0e05092d83de72b88edea199c91d5755d819 llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch
+e1b0fd5f6918d8c8404f3ec4b8d3ab8fbe8dadc2d6011792349b56e5e8ee51e2 llvm-0002-Fix-build-with-musl-libc.patch
+fc28356bf0d5fcfe9b99e28f4abbc2f49f50d263b44e428e30f33bf5472747b4 llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch
+1870f910a6f5f2ba6144bd079ec55ed879fe8fd8b1b1b384935f36da43e5f114 llvm-nm-workaround.patch
+10a719450c48433756c9f7a51593f415758ac587911349b22f7d440415a0c6d5 config.guess.patch
+e3a9d29441e5a701deb5d89b00ba0b93103ca1aef3f9dffe97f2378aca0e9ef6 cmake-fix-libLLVM-name.patch"
+sha512sums="ac521debc02f6deba96ef975d6a546b0c5c77299c1dbf5e1b87a7974ff5e7fd715bd7e384b92d9adf572ce47130bdbf6d3c648eb0d7f72f16f976292e4909e90 llvm-3.7.1.src.tar.xz
+64388ca3100fd36dfcfa7ba8ec8eb8dd40a7388d4363952ec9b4012e5b82494bd445a1b46506b479283121ec2f74fe3dc07b154f5c76db27b6f5b1af50c265aa llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch
+4cb3fabbb627b596ce398ed717c66ad20bbea7092ba30751520cc5a63d38e1ac53d23e98a6ad82121ddcf2434383ba5cadbc2990f99a4528e99c6e2160c2f725 llvm-0002-Fix-build-with-musl-libc.patch
+19bfb9282455d39d07dbb2b1293b03a45c57d522fbb9c5e58dac034200669628b97e7a90cd4ff5d52d9bb79acfccbef653d8a1140a7f0589ecd6f9b7c4ba0eb6 llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch
+11db6f3c5d697bc536c7d053530f7a5572756185e16399c32c31306861b58046ca9bc14b8d8097758c00a8c1a7026cbfb75636c0e697e59c53dda5848f93b006 llvm-nm-workaround.patch
+caf1c9466e8163f8844bd40095d1c3ce26c9e96dcb639f64833baca65a81708d39496e8c8ea65c7f11476d752265080998f1873b79cbc92b23349258e4dfa3ab config.guess.patch
+52287dd37f62e0b51c487abe62a22440d3e9df2cb6144af45ba9ddc42848495fad533bf6b13f08e1b454ee653be9b8a14e02cf81f430a7d2c9be030889ef7f72 cmake-fix-libLLVM-name.patch"
diff --git a/community/llvm3.7/cmake-fix-libLLVM-name.patch b/community/llvm3.7/cmake-fix-libLLVM-name.patch
new file mode 100644
index 0000000000..600e32777f
--- /dev/null
+++ b/community/llvm3.7/cmake-fix-libLLVM-name.patch
@@ -0,0 +1,76 @@
+From: Jakub Jirutka <jakub@jirutka.cz>
+Date: Sun, 07 Aug 2016 12:37:00 +0200
+Subject: [PATCH] Include version in name of shared libs
+
+This change makes the CMake build system generate libraries for Linux and
+Darwin matching the makefile build system.
+
+libLLVM.so -> libLLVM-$MAJOR.$MINOR.so
+libLTO.so -> libLTO-$MAJOR.$MINOR.so
+
+See https://github.com/llvm-mirror/llvm/commit/61dbca10ea813ea3af447cc7ac2556a5e81211f9
+
+--- a/cmake/modules/AddLLVM.cmake
++++ b/cmake/modules/AddLLVM.cmake
+@@ -313,10 +313,12 @@
+ # Same semantics as target_link_libraries().
+ # ADDITIONAL_HEADERS
+ # May specify header files for IDE generators.
++# SONAME
++# Should set SONAME link flags and create symlinks
+ # )
+ function(llvm_add_library name)
+ cmake_parse_arguments(ARG
+- "MODULE;SHARED;STATIC"
++ "MODULE;SHARED;STATIC;SONAME"
+ "OUTPUT_NAME"
+ "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
+ ${ARGN})
+@@ -418,11 +420,6 @@
+ PREFIX ""
+ )
+ endif()
+-
+- set_target_properties(${name}
+- PROPERTIES
+- SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}
+- VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
+ endif()
+
+ if(ARG_MODULE OR ARG_SHARED)
+@@ -483,7 +480,7 @@
+
+ macro(add_llvm_library name)
+ cmake_parse_arguments(ARG
+- "SHARED"
++ "SHARED;SONAME"
+ ""
+ ""
+ ${ARGN})
+@@ -526,6 +523,15 @@
+ -DCMAKE_INSTALL_COMPONENT=${name}
+ -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
+ endif()
++ if(ARG_SHARED)
++ get_target_property(output_name ${name} OUTPUT_NAME)
++ if(${output_name} STREQUAL "output_name-NOTFOUND")
++ set(output_name ${name})
++ endif()
++ set(library_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}${LLVM_VERSION_SUFFIX})
++ set(api_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
++ set_target_properties(${name} PROPERTIES OUTPUT_NAME ${library_name})
++ endif()
+ endif()
+ set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
+ endif()
+--- a/tools/llvm-shlib/CMakeLists.txt
++++ b/tools/llvm-shlib/CMakeLists.txt
+@@ -95,7 +95,7 @@
+ add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
+ endif()
+
+-add_llvm_library(LLVM SHARED ${SOURCES})
++add_llvm_library(LLVM SHARED SONAME ${SOURCES})
+
+ list(REMOVE_DUPLICATES LIB_NAMES)
+ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"
diff --git a/community/llvm3.7/config.guess.patch b/community/llvm3.7/config.guess.patch
new file mode 100644
index 0000000000..d6dc20b84e
--- /dev/null
+++ b/community/llvm3.7/config.guess.patch
@@ -0,0 +1,13 @@
+--- a/autoconf/config.guess 2016-08-04 01:13:53.941899947 +0200
++++ b/autoconf/config.guess 2016-08-04 01:16:30.084553757 +0200
+@@ -142,6 +142,10 @@
+
+ # Note: order is significant - the case branches are not exclusive.
+
++if [ -n "$CBUILD" ]; then
++ echo "$CBUILD"; exit
++fi
++
+ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
diff --git a/community/llvm3.7/llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch b/community/llvm3.7/llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch
new file mode 100644
index 0000000000..15f255aa38
--- /dev/null
+++ b/community/llvm3.7/llvm-0001-Add-Musl-MuslEABI-and-Musl-EABIHF-triples.patch
@@ -0,0 +1,112 @@
+From 1cec99f6d53d442d8a8c9d2ed9f4a58f8fdc6412 Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Thu, 18 Feb 2016 08:30:07 +0100
+Subject: [PATCH 1/3] Add Musl, MuslEABI and Musl EABIHF triples
+
+---
+ include/llvm/ADT/Triple.h | 11 +++++++++++
+ lib/Support/Triple.cpp | 7 +++++++
+ lib/Target/ARM/ARMSubtarget.h | 3 +++
+ lib/Target/ARM/ARMTargetMachine.cpp | 2 ++
+ 4 files changed, 23 insertions(+)
+
+diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h
+index e01db0a..2fc4fc1 100644
+--- a/include/llvm/ADT/Triple.h
++++ b/include/llvm/ADT/Triple.h
+@@ -174,6 +174,10 @@ public:
+ EABIHF,
+ Android,
+
++ Musl,
++ MuslEABI,
++ MuslEABIHF,
++
+ MSVC,
+ Itanium,
+ Cygnus,
+@@ -544,6 +548,13 @@ public:
+ /// Tests whether the target is Android
+ bool isAndroid() const { return getEnvironment() == Triple::Android; }
+
++ /// Tests whether the target is musl libc
++ bool isMusl() const {
++ return getEnvironment() == Triple::Musl ||
++ getEnvironment() == Triple::MuslEABI ||
++ getEnvironment() == Triple::MuslEABIHF;
++ }
++
+ /// @}
+ /// @name Mutators
+ /// @{
+diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp
+index 11afcf7..d90a06a 100644
+--- a/lib/Support/Triple.cpp
++++ b/lib/Support/Triple.cpp
+@@ -199,6 +199,9 @@ const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
+ case CODE16: return "code16";
+ case EABI: return "eabi";
+ case EABIHF: return "eabihf";
++ case Musl: return "musl";
++ case MuslEABIHF: return "muslgnueabihf";
++ case MuslEABI: return "muslgnueabi";
+ case Android: return "android";
+ case MSVC: return "msvc";
+ case Itanium: return "itanium";
+@@ -454,6 +457,9 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
+ .StartsWith("code16", Triple::CODE16)
+ .StartsWith("gnu", Triple::GNU)
+ .StartsWith("android", Triple::Android)
++ .StartsWith("muslgnueabihf", Triple::MuslEABIHF)
++ .StartsWith("muslgnueabi", Triple::MuslEABI)
++ .StartsWith("musl", Triple::Musl)
+ .StartsWith("msvc", Triple::MSVC)
+ .StartsWith("itanium", Triple::Itanium)
+ .StartsWith("cygnus", Triple::Cygnus)
+@@ -1431,6 +1437,7 @@ StringRef Triple::getARMCPUForArch(StringRef MArch) const {
+ switch (getEnvironment()) {
+ case llvm::Triple::EABIHF:
+ case llvm::Triple::GNUEABIHF:
++ case llvm::Triple::MuslEABIHF:
+ return "arm1176jzf-s";
+ default:
+ return "arm7tdmi";
+diff --git a/lib/Target/ARM/ARMSubtarget.h b/lib/Target/ARM/ARMSubtarget.h
+index 4d54e57..7ed7ab7 100644
+--- a/lib/Target/ARM/ARMSubtarget.h
++++ b/lib/Target/ARM/ARMSubtarget.h
+@@ -405,8 +405,10 @@ public:
+ bool isTargetEHABICompatible() const {
+ return (TargetTriple.getEnvironment() == Triple::EABI ||
+ TargetTriple.getEnvironment() == Triple::GNUEABI ||
++ TargetTriple.getEnvironment() == Triple::MuslEABI ||
+ TargetTriple.getEnvironment() == Triple::EABIHF ||
+ TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
++ TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
+ TargetTriple.getEnvironment() == Triple::Android) &&
+ !isTargetDarwin() && !isTargetWindows();
+ }
+@@ -415,6 +417,7 @@ public:
+ // FIXME: this is invalid for WindowsCE
+ return TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
+ TargetTriple.getEnvironment() == Triple::EABIHF ||
++ TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
+ isTargetWindows();
+ }
+ bool isTargetAndroid() const {
+diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp
+index fca1901..25f5cf9 100644
+--- a/lib/Target/ARM/ARMTargetMachine.cpp
++++ b/lib/Target/ARM/ARMTargetMachine.cpp
+@@ -101,6 +101,8 @@ computeTargetABI(const Triple &TT, StringRef CPU,
+ case llvm::Triple::GNUEABIHF:
+ case llvm::Triple::EABIHF:
+ case llvm::Triple::EABI:
++ case llvm::Triple::MuslEABI:
++ case llvm::Triple::MuslEABIHF:
+ TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS;
+ break;
+ case llvm::Triple::GNU:
+--
+2.7.3
+
diff --git a/community/llvm3.7/llvm-0002-Fix-build-with-musl-libc.patch b/community/llvm3.7/llvm-0002-Fix-build-with-musl-libc.patch
new file mode 100644
index 0000000000..1a69080866
--- /dev/null
+++ b/community/llvm3.7/llvm-0002-Fix-build-with-musl-libc.patch
@@ -0,0 +1,35 @@
+From 5c571082fdaf61f6df19d9b7137dc26d71334058 Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Thu, 18 Feb 2016 10:33:04 +0100
+Subject: [PATCH 2/3] Fix build with musl libc
+
+On musl libc the fopen64 and fopen are the same thing, but for
+compatibility they have a `#define fopen64 fopen`. Same applies for
+fseek64, fstat64, fstatvfs64, ftello64, lstat64, stat64 and tmpfile64.
+---
+ include/llvm/Analysis/TargetLibraryInfo.h | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/include/llvm/Analysis/TargetLibraryInfo.h b/include/llvm/Analysis/TargetLibraryInfo.h
+index 7becdf0..7f14427 100644
+--- a/include/llvm/Analysis/TargetLibraryInfo.h
++++ b/include/llvm/Analysis/TargetLibraryInfo.h
+@@ -18,6 +18,15 @@
+ #include "llvm/IR/Module.h"
+ #include "llvm/Pass.h"
+
++#undef fopen64
++#undef fseeko64
++#undef fstat64
++#undef fstatvfs64
++#undef ftello64
++#undef lstat64
++#undef stat64
++#undef tmpfile64
++
+ namespace llvm {
+ /// VecDesc - Describes a possible vectorization of a function.
+ /// Function 'VectorFnName' is equivalent to 'ScalarFnName' vectorized
+--
+2.7.3
+
diff --git a/community/llvm3.7/llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch b/community/llvm3.7/llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch
new file mode 100644
index 0000000000..d5d7f07b5e
--- /dev/null
+++ b/community/llvm3.7/llvm-0003-Fix-DynamicLibrary-to-build-with-musl-libc.patch
@@ -0,0 +1,33 @@
+From d12ecb83d01dcb580dd94f4d57828f33d3eb4c35 Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Thu, 18 Feb 2016 15:33:21 +0100
+Subject: [PATCH 3/3] Fix DynamicLibrary to build with musl libc
+
+stdin/out/err is part of the libc and not the kernel so we check for the
+specific libc that does the unexpected instead of linux.
+
+This is needed for making it build with musl libc.
+---
+ lib/Support/DynamicLibrary.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp
+index 9a7aeb5..0c1c8f8 100644
+--- a/lib/Support/DynamicLibrary.cpp
++++ b/lib/Support/DynamicLibrary.cpp
+@@ -140,10 +140,10 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) {
+ #define EXPLICIT_SYMBOL(SYM) \
+ if (!strcmp(symbolName, #SYM)) return &SYM
+
+-// On linux we have a weird situation. The stderr/out/in symbols are both
++// On GNU libc we have a weird situation. The stderr/out/in symbols are both
+ // macros and global variables because of standards requirements. So, we
+ // boldly use the EXPLICIT_SYMBOL macro without checking for a #define first.
+-#if defined(__linux__) and !defined(__ANDROID__)
++#if defined(__GLIBC__)
+ {
+ EXPLICIT_SYMBOL(stderr);
+ EXPLICIT_SYMBOL(stdout);
+--
+2.7.3
+
diff --git a/community/llvm3.7/llvm-nm-workaround.patch b/community/llvm3.7/llvm-nm-workaround.patch
new file mode 100644
index 0000000000..5755e57ff3
--- /dev/null
+++ b/community/llvm3.7/llvm-nm-workaround.patch
@@ -0,0 +1,27 @@
+From https://llvm.org/bugs/show_bug.cgi?id=24115
+
+diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp
+index e7ee312..b9e4779 100644
+--- a/tools/llvm-nm/llvm-nm.cpp
++++ b/tools/llvm-nm/llvm-nm.cpp
+@@ -486,7 +486,7 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName,
+ std::string ArchiveName,
+ std::string ArchitectureName) {
+ if (!NoSort) {
+- std::function<bool(const NMSymbol &, const NMSymbol &)> Cmp;
++ bool (*Cmp)(const NMSymbol &, const NMSymbol &);
+ if (NumericSort)
+ Cmp = compareSymbolAddress;
+ else if (SizeSort)
+@@ -495,8 +495,9 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName,
+ Cmp = compareSymbolName;
+
+ if (ReverseSort)
+- Cmp = [=](const NMSymbol &A, const NMSymbol &B) { return Cmp(B, A); };
+- std::sort(SymbolList.begin(), SymbolList.end(), Cmp);
++ std::sort(SymbolList.begin(), SymbolList.end(), [=](const NMSymbol &A, const NMSymbol &B) { return Cmp(B, A); });
++ else
++ std::sort(SymbolList.begin(), SymbolList.end(), Cmp);
+ }
+
+ if (!PrintFileName) {