added alarm/llvm37

This commit is contained in:
Kevin Mihelich 2016-06-12 16:08:57 +00:00
parent 3239ba0be2
commit d9dd59f356
9 changed files with 2240 additions and 0 deletions

View file

@ -0,0 +1,142 @@
From 0bee2d927c97454e629b0789c7f4e3d509cf4178 Mon Sep 17 00:00:00 2001
From: Evgeniy Stepanov <eugeni.stepanov@gmail.com>
Date: Thu, 8 Oct 2015 21:35:34 +0000
Subject: [PATCH] New MSan mapping layout (compiler-rt part).
This is an implementation of
https://github.com/google/sanitizers/issues/579
It has a number of advantages over the current mapping:
* Works for non-PIE executables.
* Does not require ASLR; as a consequence, debugging MSan programs in
gdb no longer requires "set disable-randomization off".
* Supports linux kernels >=4.1.2.
* The code is marginally faster and smaller.
This is an ABI break. We never really promised ABI stability, but
this patch includes a courtesy escape hatch: a compile-time macro
that reverts back to the old mapping layout.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@249754 91177308-0d34-0410-b5e6-96231b3b80d8
---
lib/msan/msan.h | 23 ++++++++++++++++++++++
lib/msan/msan_allocator.cc | 8 +++++++-
test/msan/mmap.cc | 4 +++-
test/msan/strlen_of_shadow.cc | 2 +-
.../TestCases/Posix/decorate_proc_maps.cc | 4 ++--
5 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/lib/msan/msan.h b/lib/msan/msan.h
index 3776fa9..2d77983 100644
--- a/lib/msan/msan.h
+++ b/lib/msan/msan.h
@@ -135,6 +135,7 @@ const MappingDesc kMemoryLayout[] = {
#elif SANITIZER_LINUX && SANITIZER_WORDSIZE == 64
+#ifdef MSAN_LINUX_X86_64_OLD_MAPPING
// Requries PIE binary and ASLR enabled.
// Main thread stack and DSOs at 0x7f0000000000 (sometimes 0x7e0000000000).
// Heap at 0x600000000000.
@@ -146,6 +147,28 @@ const MappingDesc kMemoryLayout[] = {
#define MEM_TO_SHADOW(mem) (((uptr)(mem)) & ~0x400000000000ULL)
#define SHADOW_TO_ORIGIN(mem) (((uptr)(mem)) + 0x200000000000ULL)
+#else // MSAN_LINUX_X86_64_OLD_MAPPING
+// All of the following configurations are supported.
+// ASLR disabled: main executable and DSOs at 0x555550000000
+// PIE and ASLR: main executable and DSOs at 0x7f0000000000
+// non-PIE: main executable below 0x100000000, DSOs at 0x7f0000000000
+// Heap at 0x700000000000.
+const MappingDesc kMemoryLayout[] = {
+ {0x000000000000ULL, 0x010000000000ULL, MappingDesc::APP, "app-1"},
+ {0x010000000000ULL, 0x100000000000ULL, MappingDesc::SHADOW, "shadow-2"},
+ {0x100000000000ULL, 0x110000000000ULL, MappingDesc::INVALID, "invalid"},
+ {0x110000000000ULL, 0x200000000000ULL, MappingDesc::ORIGIN, "origin-2"},
+ {0x200000000000ULL, 0x300000000000ULL, MappingDesc::SHADOW, "shadow-3"},
+ {0x300000000000ULL, 0x400000000000ULL, MappingDesc::ORIGIN, "origin-3"},
+ {0x400000000000ULL, 0x500000000000ULL, MappingDesc::INVALID, "invalid"},
+ {0x500000000000ULL, 0x510000000000ULL, MappingDesc::SHADOW, "shadow-1"},
+ {0x510000000000ULL, 0x600000000000ULL, MappingDesc::APP, "app-2"},
+ {0x600000000000ULL, 0x610000000000ULL, MappingDesc::ORIGIN, "origin-1"},
+ {0x610000000000ULL, 0x700000000000ULL, MappingDesc::INVALID, "invalid"},
+ {0x700000000000ULL, 0x800000000000ULL, MappingDesc::APP, "app-3"}};
+#define MEM_TO_SHADOW(mem) (((uptr)(mem)) ^ 0x500000000000ULL)
+#define SHADOW_TO_ORIGIN(mem) (((uptr)(mem)) + 0x100000000000ULL)
+#endif // MSAN_LINUX_X86_64_OLD_MAPPING
#else
#error "Unsupported platform"
diff --git a/lib/msan/msan_allocator.cc b/lib/msan/msan_allocator.cc
index 865a458..b7d3947 100644
--- a/lib/msan/msan_allocator.cc
+++ b/lib/msan/msan_allocator.cc
@@ -49,15 +49,21 @@ struct MsanMapUnmapCallback {
typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE, sizeof(Metadata),
SizeClassMap, kRegionSizeLog, ByteMap,
MsanMapUnmapCallback> PrimaryAllocator;
+
#elif defined(__x86_64__)
+#if SANITIZER_LINUX && !defined(MSAN_LINUX_X86_64_OLD_MAPPING)
+ static const uptr kAllocatorSpace = 0x700000000000ULL;
+#else
static const uptr kAllocatorSpace = 0x600000000000ULL;
- static const uptr kAllocatorSize = 0x80000000000; // 8T.
+#endif
+ static const uptr kAllocatorSize = 0x80000000000; // 8T.
static const uptr kMetadataSize = sizeof(Metadata);
static const uptr kMaxAllowedMallocSize = 8UL << 30;
typedef SizeClassAllocator64<kAllocatorSpace, kAllocatorSize, kMetadataSize,
DefaultSizeClassMap,
MsanMapUnmapCallback> PrimaryAllocator;
+
#elif defined(__powerpc64__)
static const uptr kAllocatorSpace = 0x300000000000;
static const uptr kAllocatorSize = 0x020000000000; // 2T
diff --git a/test/msan/mmap.cc b/test/msan/mmap.cc
index 250ce34..962836c 100644
--- a/test/msan/mmap.cc
+++ b/test/msan/mmap.cc
@@ -15,7 +15,9 @@ bool AddrIsApp(void *p) {
#if defined(__FreeBSD__) && defined(__x86_64__)
return addr < 0x010000000000ULL || addr >= 0x600000000000ULL;
#elif defined(__x86_64__)
- return addr >= 0x600000000000ULL;
+ return (addr >= 0x000000000000ULL && addr < 0x010000000000ULL) ||
+ (addr >= 0x510000000000ULL && addr < 0x600000000000ULL) ||
+ (addr >= 0x700000000000ULL && addr < 0x800000000000ULL);
#elif defined(__mips64)
return addr >= 0x00e000000000ULL;
#elif defined(__powerpc64__)
diff --git a/test/msan/strlen_of_shadow.cc b/test/msan/strlen_of_shadow.cc
index fee9223..0594f00 100644
--- a/test/msan/strlen_of_shadow.cc
+++ b/test/msan/strlen_of_shadow.cc
@@ -12,7 +12,7 @@
const char *mem_to_shadow(const char *p) {
#if defined(__x86_64__)
- return (char *)((uintptr_t)p & ~0x400000000000ULL);
+ return (char *)((uintptr_t)p ^ 0x500000000000ULL);
#elif defined (__mips64)
return (char *)((uintptr_t)p & ~0x4000000000ULL);
#elif defined(__powerpc64__)
diff --git a/test/sanitizer_common/TestCases/Posix/decorate_proc_maps.cc b/test/sanitizer_common/TestCases/Posix/decorate_proc_maps.cc
index 8744c3f..36d4df5 100644
--- a/test/sanitizer_common/TestCases/Posix/decorate_proc_maps.cc
+++ b/test/sanitizer_common/TestCases/Posix/decorate_proc_maps.cc
@@ -47,8 +47,8 @@ int main(void) {
// CHECK-asan: rw-p {{.*}} [high shadow]
// CHECK-msan: ---p {{.*}} [invalid]
-// CHECK-msan: rw-p {{.*}} [shadow]
-// CHECK-msan: ---p {{.*}} [origin]
+// CHECK-msan: rw-p {{.*}} [shadow{{.*}}]
+// CHECK-msan: ---p {{.*}} [origin{{.*}}]
// CHECK-tsan: rw-p {{.*}} [shadow]
// CHECK-tsan: rw-p {{.*}} [meta shadow]
--
2.6.1

View file

@ -0,0 +1,115 @@
From 2c87d24da09ecd2c14c38a0b4f7a0e3f332b08ee Mon Sep 17 00:00:00 2001
From: Evgeniy Stepanov <eugeni.stepanov@gmail.com>
Date: Thu, 8 Oct 2015 21:35:26 +0000
Subject: [PATCH] New MSan mapping layout (llvm part).
This is an implementation of
https://github.com/google/sanitizers/issues/579
It has a number of advantages over the current mapping:
* Works for non-PIE executables.
* Does not require ASLR; as a consequence, debugging MSan programs in
gdb no longer requires "set disable-randomization off".
* Supports linux kernels >=4.1.2.
* The code is marginally faster and smaller.
This is an ABI break. We never really promised ABI stability, but
this patch includes a courtesy escape hatch: a compile-time macro
that reverts back to the old mapping layout.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249753 91177308-0d34-0410-b5e6-96231b3b80d8
---
lib/Transforms/Instrumentation/MemorySanitizer.cpp | 22 +++++++++++++++-------
.../MemorySanitizer/origin-alignment.ll | 10 ++++++----
2 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 9d4c7de..bc6da5a 100644
--- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -232,10 +232,17 @@ static const MemoryMapParams Linux_I386_MemoryMapParams = {
// x86_64 Linux
static const MemoryMapParams Linux_X86_64_MemoryMapParams = {
+#ifdef MSAN_LINUX_X86_64_OLD_MAPPING
0x400000000000, // AndMask
0, // XorMask (not used)
0, // ShadowBase (not used)
0x200000000000, // OriginBase
+#else
+ 0, // AndMask (not used)
+ 0x500000000000, // XorMask
+ 0, // ShadowBase (not used)
+ 0x100000000000, // OriginBase
+#endif
};
// mips64 Linux
@@ -926,16 +933,17 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
///
/// Offset = (Addr & ~AndMask) ^ XorMask
Value *getShadowPtrOffset(Value *Addr, IRBuilder<> &IRB) {
+ Value *OffsetLong = IRB.CreatePointerCast(Addr, MS.IntptrTy);
+
uint64_t AndMask = MS.MapParams->AndMask;
- assert(AndMask != 0 && "AndMask shall be specified");
- Value *OffsetLong =
- IRB.CreateAnd(IRB.CreatePointerCast(Addr, MS.IntptrTy),
- ConstantInt::get(MS.IntptrTy, ~AndMask));
+ if (AndMask)
+ OffsetLong =
+ IRB.CreateAnd(OffsetLong, ConstantInt::get(MS.IntptrTy, ~AndMask));
uint64_t XorMask = MS.MapParams->XorMask;
- if (XorMask != 0)
- OffsetLong = IRB.CreateXor(OffsetLong,
- ConstantInt::get(MS.IntptrTy, XorMask));
+ if (XorMask)
+ OffsetLong =
+ IRB.CreateXor(OffsetLong, ConstantInt::get(MS.IntptrTy, XorMask));
return OffsetLong;
}
diff --git a/test/Instrumentation/MemorySanitizer/origin-alignment.ll b/test/Instrumentation/MemorySanitizer/origin-alignment.ll
index ce0dbfc..562d194 100644
--- a/test/Instrumentation/MemorySanitizer/origin-alignment.ll
+++ b/test/Instrumentation/MemorySanitizer/origin-alignment.ll
@@ -24,7 +24,7 @@ entry:
; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]])
-; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 add (i64 and (i64 ptrtoint {{.*}} to i32*), align 8
+; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 add (i64 xor (i64 ptrtoint (i8* @a8 to i64), i64 {{.*}}), i64 {{.*}}) to i32*), align 8
; CHECK: ret void
@@ -39,7 +39,7 @@ entry:
; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]])
-; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 add (i64 and (i64 ptrtoint {{.*}} to i32*), align 4
+; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 add (i64 xor (i64 ptrtoint (i8* @a4 to i64), i64 {{.*}}), i64 {{.*}}) to i32*), align 4
; CHECK: ret void
@@ -54,7 +54,8 @@ entry:
; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]])
-; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 and (i64 add (i64 and (i64 ptrtoint {{.*}} i64 -4) to i32*), align 4
+; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 and (i64 add (i64 xor (i64 ptrtoint (i8* @a2 to i64), i64 {{.*}}), i64 {{.*}}), i64 -4) to i32*), align 4
+
; CHECK: ret void
@@ -69,5 +70,6 @@ entry:
; CHECK-ORIGINS1: [[ORIGIN:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN0:%[01-9a-z]+]] = load {{.*}} @__msan_param_origin_tls
; CHECK-ORIGINS2: [[ORIGIN:%[01-9a-z]+]] = call i32 @__msan_chain_origin(i32 [[ORIGIN0]])
-; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 and (i64 add (i64 and (i64 ptrtoint {{.*}} i64 -4) to i32*), align 4
+; CHECK: store i32 [[ORIGIN]], i32* inttoptr (i64 and (i64 add (i64 xor (i64 ptrtoint (i8* @a1 to i64), i64 {{.*}}), i64 {{.*}}), i64 -4) to i32*), align 4
+
; CHECK: ret void
--
2.6.1

227
alarm/llvm37/PKGBUILD Normal file
View file

@ -0,0 +1,227 @@
# $Id$
# Maintainer: Evangelos Foutras <evangelos@foutrelis.com>
# Contributor: Jan "heftig" Steffens <jan.steffens@gmail.com>
# Contributor: Sebastian Nowicki <sebnow@gmail.com>
# Contributor: Devin Cofer <ranguvar{AT]archlinux[DOT}us>
# Contributor: Tobias Kieslich <tobias@justdreams.de>
# Contributor: Geoffroy Carrier <geoffroy.carrier@aur.archlinux.org>
# Contributor: Tomas Lindquist Olsen <tomas@famolsen.dk>
# Contributor: Roberto Alsina <ralsina@kde.org>
# Contributor: Gerardo Exequiel Pozzi <vmlinuz386@yahoo.com.ar>
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
# - v5: disable compiler-rt, don't install in clang package
# - v8: disable lldb, unsupported architecture
# - this package only exists for GHC
buildarch=4
pkgname=('llvm37' 'llvm37-libs' 'clang37' )
pkgver=3.7.1
pkgrel=1
_ocaml_ver=4.02.3
arch=('i686' 'x86_64')
url="http://llvm.org/"
license=('custom:University of Illinois/NCSA Open Source License')
makedepends=('cmake' 'libffi' 'python2' "ocaml=$_ocaml_ver" 'python-sphinx'
'ocaml-ctypes' 'ocaml-findlib' 'libedit' 'swig')
# Use gcc-multilib to build 32-bit compiler-rt libraries on x86_64 (FS#41911)
makedepends_x86_64=('gcc-multilib')
options=('staticlibs')
source=(http://llvm.org/releases/$pkgver/llvm-$pkgver.src.tar.xz{,.sig}
http://llvm.org/releases/$pkgver/cfe-$pkgver.src.tar.xz{,.sig}
http://llvm.org/releases/$pkgver/clang-tools-extra-$pkgver.src.tar.xz{,.sig}
http://llvm.org/releases/$pkgver/compiler-rt-$pkgver.src.tar.xz{,.sig}
http://llvm.org/releases/$pkgver/lldb-$pkgver.src.tar.xz{,.sig}
llvm-3.7.0-link-tools-against-libLLVM.patch
llvm-3.7.0-export-more-symbols.patch
clang-3.7.0-add-gcc-abi-tag-support.patch
clang-tools-extra-3.7.0-install-clang-query.patch
lldb-3.7.0-avoid-linking-to-libLLVM.patch
0001-New-MSan-mapping-layout-llvm-part.patch
0001-New-MSan-mapping-layout-compiler-rt-part.patch
llvm-Config-llvm-config.h)
sha256sums=('be7794ed0cec42d6c682ca8e3517535b54555a3defabec83554dbc74db545ad5'
'SKIP'
'56e2164c7c2a1772d5ed2a3e57485ff73ff06c97dff12edbeea1acc4412b0674'
'SKIP'
'4a91edaccad1ce984c7c49a4a87db186b7f7b21267b2b03bcf4bd7820715bc6b'
'SKIP'
'9d4769e4a927d3824bcb7a9c82b01e307c68588e6de4e7f04ab82d82c5af8181'
'SKIP'
'9a0bc315ef55f44c98cdf92d064df0847f453ed156dd0ef6a87e04f5fd6a0e01'
'SKIP'
'cf9c8b4d70b4547eda162644658c5c203c3139fcea6c75003b6cd7dc11a8cccc'
'a1c9f36b97c639666ab6a1bd647a08a027e93e3d3cfd6f5af9c36e757599ce81'
'5ed52d54612829402b63bc500bfefae75b3dc444a1524849c26cadf7e0ae4b7d'
'3abf85430c275ecb8dbb526ecb82b1c9f4b4f782a8a43b5a06d040ec0baba7e7'
'2d53b6ed4c7620eeade87e7761b98093a0434801ddd599056daed7881141fb01'
'c5f4e329143bef36b623ba5daf311b5a73fa99ab05fed4ba506c1c3bc4cf5ee7'
'f44e8fe3cef9b6f706d651f443922261e1dcf53bcaabdd0ac7edb1758e4bc44d'
'597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48')
validpgpkeys=('11E521D646982372EB577A1F8F0871F202119294'
'B6C8F98282B944E3B0D5C2530FC3042E345AD05D')
prepare() {
cd "$srcdir/llvm-$pkgver.src"
# At the present, clang must reside inside the LLVM source code tree to build
# See http://llvm.org/bugs/show_bug.cgi?id=4840
mv "$srcdir/cfe-$pkgver.src" tools/clang
mv "$srcdir/clang-tools-extra-$pkgver.src" tools/clang/tools/extra
mv "$srcdir/compiler-rt-$pkgver.src" projects/compiler-rt
mv "$srcdir/lldb-$pkgver.src" tools/lldb
# Backport LLVM_LINK_LLVM_DYLIB option
# https://bugs.archlinux.org/task/46392
patch -Np1 -i ../llvm-3.7.0-link-tools-against-libLLVM.patch
# https://llvm.org/bugs/show_bug.cgi?id=24157
patch -Np2 -i ../llvm-3.7.0-export-more-symbols.patch
# https://llvm.org/bugs/show_bug.cgi?id=23529
# http://reviews.llvm.org/D12834
patch -d tools/clang -Np0 <../clang-3.7.0-add-gcc-abi-tag-support.patch
# https://llvm.org/bugs/show_bug.cgi?id=24046
# Upstreamed - http://reviews.llvm.org/D13206
patch -d tools/clang/tools/extra -Np1 <../clang-tools-extra-3.7.0-install-clang-query.patch
# https://llvm.org/bugs/show_bug.cgi?id=24953
patch -d tools/lldb -Np1 <../lldb-3.7.0-avoid-linking-to-libLLVM.patch
# https://llvm.org/bugs/show_bug.cgi?id=24155
patch -Np1 -i ../0001-New-MSan-mapping-layout-llvm-part.patch
patch -d projects/compiler-rt -Np1 <../0001-New-MSan-mapping-layout-compiler-rt-part.patch
# Use Python 2
find tools/lldb -name Makefile -exec sed -i 's/python-config/python2-config/' {} +
sed -i 's|/usr/bin/env python|&2|' \
tools/lldb/scripts/Python/{build-swig-Python,finish-swig-Python-LLDB}.sh
mkdir build
}
build() {
cd "$srcdir/llvm-$pkgver.src/build"
[[ $CARCH == "arm" ]] && CONFIG="-DLLVM_EXTERNAL_COMPILER_RT_BUILD=OFF"
[[ $CARCH == "aarch64" ]] && CONFIG="-DLLVM_EXTERNAL_LLDB_BUILD=OFF"
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DLLVM_DYLIB_EXPORT_ALL=ON \
-DLLVM_LINK_LLVM_DYLIB=ON \
-DLLVM_ENABLE_RTTI=ON \
-DLLVM_ENABLE_FFI=ON \
-DLLVM_BUILD_TESTS=ON \
-DLLVM_BUILD_DOCS=ON \
-DLLVM_ENABLE_SPHINX=ON \
-DLLVM_ENABLE_DOXYGEN=OFF \
-DSPHINX_WARNINGS_AS_ERRORS=OFF \
-DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \
-DLLVM_BINUTILS_INCDIR=/usr/include \
$CONFIG ..
make
make ocaml_doc
# Disable automatic installation of components that go into subpackages
sed -i '/\(clang\|lldb\)\/cmake_install.cmake/d' tools/cmake_install.cmake
sed -i '/extra\/cmake_install.cmake/d' tools/clang/tools/cmake_install.cmake
sed -i '/compiler-rt\/cmake_install.cmake/d' projects/cmake_install.cmake
}
check() {
cd "$srcdir/llvm-$pkgver.src/build"
make check
make check-clang || warning \
'Ignoring Clang test failures caused by name mangling differences'
}
package_llvm37() {
pkgdesc="Low Level Virtual Machine"
depends=("llvm37-libs=$pkgver-$pkgrel" 'perl')
conflicts=('llvm' 'llvm35')
cd "$srcdir/llvm-$pkgver.src"
make -C build DESTDIR="$pkgdir" install
# Remove documentation sources
rm -r "$pkgdir"/usr/share/doc/llvm/html/{_sources,.buildinfo}
# The runtime libraries go into llvm-libs
mv -f "$pkgdir"/usr/lib/lib{LLVM,LTO}.so* "$srcdir"
mv -f "$pkgdir"/usr/lib/LLVMgold.so "$srcdir"
# OCaml bindings go to a separate package
rm -rf "$srcdir"/ocaml.{lib,doc}
mv "$pkgdir/usr/lib/ocaml" "$srcdir/ocaml.lib"
mv "$pkgdir/usr/docs/ocaml/html" "$srcdir/ocaml.doc"
rm -r "$pkgdir/usr/docs"
if [[ $CARCH == x86_64 ]]; then
# Needed for multilib (https://bugs.archlinux.org/task/29951)
# Header stub is taken from Fedora
mv "$pkgdir/usr/include/llvm/Config/llvm-config"{,-64}.h
cp "$srcdir/llvm-Config-llvm-config.h" \
"$pkgdir/usr/include/llvm/Config/llvm-config.h"
fi
install -Dm644 LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
package_llvm37-libs() {
pkgdesc="Low Level Virtual Machine (runtime libraries)"
depends=('gcc-libs' 'zlib' 'libffi' 'libedit' 'ncurses')
install -d "$pkgdir/usr/lib"
cp -P \
"$srcdir"/lib{LLVM,LTO}.so* \
"$srcdir"/LLVMgold.so \
"$pkgdir/usr/lib/"
# Symlink LLVMgold.so from /usr/lib/bfd-plugins
# https://bugs.archlinux.org/task/28479
install -d "$pkgdir/usr/lib/bfd-plugins"
ln -s ../LLVMgold.so "$pkgdir/usr/lib/bfd-plugins/LLVMgold.so"
install -Dm644 "$srcdir/llvm-$pkgver.src/LICENSE.TXT" \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
package_clang37() {
pkgdesc="C language family frontend for LLVM"
url="http://clang.llvm.org/"
depends=("llvm37-libs=$pkgver-$pkgrel" 'gcc')
optdepends=('python2: for git-clang-format')
conflicts=('clang' 'clang35')
cd "$srcdir/llvm-$pkgver.src"
make -C build/tools/clang DESTDIR="$pkgdir" install
[[ $CARCH != "arm" ]] && make -C build/projects/compiler-rt DESTDIR="$pkgdir" install
# Remove documentation sources
rm -r "$pkgdir"/usr/share/doc/clang/html/{_sources,.buildinfo}
# Install Python bindings
install -d "$pkgdir/usr/lib/python2.7/site-packages"
cp -a tools/clang/bindings/python/clang "$pkgdir/usr/lib/python2.7/site-packages/"
python2 -m compileall "$pkgdir/usr/lib/python2.7/site-packages/clang"
python2 -O -m compileall "$pkgdir/usr/lib/python2.7/site-packages/clang"
# Use Python 2
sed -i 's|/usr/bin/env python|&2|' \
"$pkgdir/usr/bin/git-clang-format" \
"$pkgdir/usr/share/clang/clang-format-diff.py"
install -Dm644 tools/clang/LICENSE.TXT \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,9 @@
diff -upr clang-tools-extra-3.7.0.src.orig/clang-query/tool/CMakeLists.txt clang-tools-extra-3.7.0.src/clang-query/tool/CMakeLists.txt
--- clang-tools-extra-3.7.0.src.orig/clang-query/tool/CMakeLists.txt 2015-06-20 22:28:07.000000000 +0300
+++ clang-tools-extra-3.7.0.src/clang-query/tool/CMakeLists.txt 2015-09-28 11:51:14.724472237 +0300
@@ -10,3 +10,5 @@ target_link_libraries(clang-query
clangQuery
clangTooling
)
+
+install(TARGETS clang-query RUNTIME DESTINATION bin)

View file

@ -0,0 +1,20 @@
diff -upr lldb-3.7.0.src.orig/cmake/modules/AddLLDB.cmake lldb-3.7.0.src/cmake/modules/AddLLDB.cmake
--- lldb-3.7.0.src.orig/cmake/modules/AddLLDB.cmake 2015-09-28 11:42:23.439084000 +0300
+++ lldb-3.7.0.src/cmake/modules/AddLLDB.cmake 2015-09-28 11:43:03.200237733 +0300
@@ -56,7 +56,7 @@ macro(add_lldb_library name)
if (PARAM_OBJECT)
add_library(${name} ${libkind} ${srcs})
else()
- llvm_add_library(${name} ${libkind} ${srcs})
+ llvm_add_library(${name} ${libkind} DISABLE_LLVM_LINK_LLVM_DYLIB ${srcs})
lldb_link_common_libs(${name} "${libkind}")
@@ -93,6 +93,6 @@ macro(add_lldb_library name)
endmacro(add_lldb_library)
macro(add_lldb_executable name)
- add_llvm_executable(${name} ${ARGN})
+ add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
set_target_properties(${name} PROPERTIES FOLDER "lldb executables")
endmacro(add_lldb_executable)

View file

@ -0,0 +1,11 @@
--- src/llvm/tools/llvm-shlib/CMakeLists.txt.orig 2015-09-06 12:31:21.765250429 +0300
+++ src/llvm/tools/llvm-shlib/CMakeLists.txt 2015-09-06 13:17:10.820174432 +0300
@@ -64,7 +64,7 @@
if (LLVM_DYLIB_EXPORT_ALL)
add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}
- COMMAND echo \"LLVM*\" > ${LLVM_EXPORTED_SYMBOL_FILE} && echo \"_Z*llvm*\" >> ${LLVM_EXPORTED_SYMBOL_FILE}
+ COMMAND echo -e \"LLVM*\\n_Z*llvm*\\nConvertUTF*\\ngetNumBytesForUTF8\\nisLegalUTF8*\" > ${LLVM_EXPORTED_SYMBOL_FILE}
WORKING_DIRECTORY ${LIB_DIR}
DEPENDS ${LLVM_DYLIB_REQUIRED_EXPORTS}
COMMENT "Generating combined export list...")

View file

@ -0,0 +1,440 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ac3b978..dd50236 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -342,9 +342,21 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
option (LLVM_BUILD_EXTERNAL_COMPILER_RT
"Build compiler-rt as an external project." OFF)
-option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" OFF)
-option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" OFF)
-option(LLVM_DISABLE_LLVM_DYLIB_ATEXIT "Disable llvm-shlib's atexit destructors." ON)
+# You can configure which libraries from LLVM you want to include in the
+# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
+# list of LLVM components. All component names handled by llvm-config are valid.
+if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
+ set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
+ "Semicolon-separated list of components to include in libLLVM, or \"all\".")
+endif()
+option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
+option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_LINK_LLVM_DYLIB})
+option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" ${LLVM_LINK_LLVM_DYLIB})
+set(LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT ON)
+if (LLVM_LINK_LLVM_DYLIB)
+ set(LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT OFF)
+endif()
+option(LLVM_DISABLE_LLVM_DYLIB_ATEXIT "Disable llvm-shlib's atexit destructors." ${LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT})
if(LLVM_DISABLE_LLVM_DYLIB_ATEXIT)
set(DISABLE_LLVM_DYLIB_ATEXIT 1)
endif()
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
index 45f6746..6b6e6e0 100644
--- a/cmake/modules/AddLLVM.cmake
+++ b/cmake/modules/AddLLVM.cmake
@@ -41,7 +41,7 @@ function(llvm_update_compile_flags name)
# Assume that;
# - LLVM_COMPILE_FLAGS is list.
# - PROPERTY COMPILE_FLAGS is string.
- string(REPLACE ";" " " target_compile_flags "${LLVM_COMPILE_FLAGS}")
+ string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
if(update_src_props)
foreach(fn ${sources})
@@ -303,6 +303,9 @@ endfunction(set_windows_version_resource_properties)
# MODULE
# Target ${name} might not be created on unsupported platforms.
# Check with "if(TARGET ${name})".
+# DISABLE_LLVM_LINK_LLVM_DYLIB
+# Do not link this library to libLLVM, even if
+# LLVM_LINK_LLVM_DYLIB is enabled.
# OUTPUT_NAME name
# Corresponds to OUTPUT_NAME in target properties.
# DEPENDS targets...
@@ -316,7 +319,7 @@ endfunction(set_windows_version_resource_properties)
# )
function(llvm_add_library name)
cmake_parse_arguments(ARG
- "MODULE;SHARED;STATIC"
+ "MODULE;SHARED;STATIC;DISABLE_LLVM_LINK_LLVM_DYLIB"
"OUTPUT_NAME"
"ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
${ARGN})
@@ -444,10 +447,14 @@ function(llvm_add_library name)
# property has been set to an empty value.
get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
- llvm_map_components_to_libnames(llvm_libs
- ${ARG_LINK_COMPONENTS}
- ${LLVM_LINK_COMPONENTS}
- )
+ if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_STATIC AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
+ set(llvm_libs LLVM)
+ else()
+ llvm_map_components_to_libnames(llvm_libs
+ ${ARG_LINK_COMPONENTS}
+ ${LLVM_LINK_COMPONENTS}
+ )
+ endif()
if(CMAKE_VERSION VERSION_LESS 2.8.12)
# Link libs w/o keywords, assuming PUBLIC.
@@ -562,7 +569,22 @@ endmacro(add_llvm_loadable_module name)
macro(add_llvm_executable name)
- llvm_process_sources( ALL_FILES ${ARGN} )
+ cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB" "" "" ${ARGN})
+ llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
+
+ # Generate objlib
+ if(LLVM_ENABLE_OBJLIB)
+ # Generate an obj library for both targets.
+ set(obj_name "obj.${name}")
+ add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
+ ${ALL_FILES}
+ )
+ llvm_update_compile_flags(${obj_name})
+ set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
+
+ set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
+ endif()
+
add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
if( EXCLUDE_FROM_ALL )
@@ -588,9 +610,13 @@ macro(add_llvm_executable name)
add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
endif(LLVM_EXPORTED_SYMBOL_FILE)
+ if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
+ set(USE_SHARED USE_SHARED)
+ endif()
+
set(EXCLUDE_FROM_ALL OFF)
set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
- llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
+ llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
if( LLVM_COMMON_DEPENDS )
add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
endif( LLVM_COMMON_DEPENDS )
@@ -651,7 +677,7 @@ endmacro(add_llvm_example name)
macro(add_llvm_utility name)
- add_llvm_executable(${name} ${ARGN})
+ add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
set_target_properties(${name} PROPERTIES FOLDER "Utils")
if( LLVM_INSTALL_UTILS )
install (TARGETS ${name}
@@ -785,8 +811,13 @@ function(llvm_add_go_executable binary pkgpath)
set(cppflags "${cppflags} -I${d}")
endforeach(d)
set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
+ if (LLVM_LINK_LLVM_DYLIB)
+ set(linkmode "dylib")
+ else()
+ set(linkmode "component-libs")
+ endif()
add_custom_command(OUTPUT ${binpath}
- COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}"
+ COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "linkmode=${linkmode}"
${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
${llvmlibs} ${ARG_DEPENDS}
diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake
index 22ac714..aa68b40 100644
--- a/cmake/modules/LLVM-Config.cmake
+++ b/cmake/modules/LLVM-Config.cmake
@@ -31,7 +31,23 @@ endfunction(is_llvm_target_library)
macro(llvm_config executable)
- explicit_llvm_config(${executable} ${ARGN})
+ cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN})
+ set(link_components ${ARG_UNPARSED_ARGUMENTS})
+
+ if(USE_SHARED)
+ # If USE_SHARED is specified, then we link against libLLVM,
+ # but also against the component libraries below. This is
+ # done in case libLLVM does not contain all of the components
+ # the target requires.
+ #
+ # TODO strip LLVM_DYLIB_COMPONENTS out of link_components.
+ # To do this, we need special handling for "all", since that
+ # may imply linking to libraries that are not included in
+ # libLLVM.
+ target_link_libraries(${executable} LLVM)
+ endif()
+
+ explicit_llvm_config(${executable} ${link_components})
endmacro(llvm_config)
diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake
index 85d720e..fcb445a 100644
--- a/cmake/modules/TableGen.cmake
+++ b/cmake/modules/TableGen.cmake
@@ -73,6 +73,10 @@ endfunction()
macro(add_tablegen target project)
set(${target}_OLD_LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS})
set(LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS} TableGen)
+
+ # FIXME: It leaks to user, callee of add_tablegen.
+ set(LLVM_ENABLE_OBJLIB ON)
+
add_llvm_utility(${target} ${ARGN})
set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS})
diff --git a/tools/llvm-go/llvm-go.go b/tools/llvm-go/llvm-go.go
index c5c3fd2..ed79ca6 100644
--- a/tools/llvm-go/llvm-go.go
+++ b/tools/llvm-go/llvm-go.go
@@ -24,6 +24,11 @@ import (
"strings"
)
+const (
+ linkmodeComponentLibs = "component-libs"
+ linkmodeDylib = "dylib"
+)
+
type pkg struct {
llvmpath, pkgpath string
}
@@ -66,11 +71,12 @@ var components = []string{
func llvmConfig(args ...string) string {
configpath := os.Getenv("LLVM_CONFIG")
if configpath == "" {
- // strip llvm-go, add llvm-config
- configpath = os.Args[0][:len(os.Args[0])-7] + "llvm-config"
+ bin, _ := filepath.Split(os.Args[0])
+ configpath = filepath.Join(bin, "llvm-config")
}
cmd := exec.Command(configpath, args...)
+ cmd.Stderr = os.Stderr
out, err := cmd.Output()
if err != nil {
panic(err.Error())
@@ -78,11 +84,21 @@ func llvmConfig(args ...string) string {
outstr := string(out)
outstr = strings.TrimSuffix(outstr, "\n")
- return strings.Replace(outstr, "\n", " ", -1)
+ outstr = strings.Replace(outstr, "\n", " ", -1)
+ return outstr
}
-func llvmFlags() compilerFlags {
- ldflags := llvmConfig(append([]string{"--ldflags", "--libs", "--system-libs"}, components...)...)
+func llvmFlags(linkmode string) compilerFlags {
+ ldflags := llvmConfig("--ldflags")
+ switch linkmode {
+ case linkmodeComponentLibs:
+ ldflags += " " + llvmConfig(append([]string{"--libs"}, components...)...)
+ case linkmodeDylib:
+ ldflags += " -lLLVM"
+ default:
+ panic("invalid linkmode: " + linkmode)
+ }
+ ldflags += " " + llvmConfig("--system-libs")
if runtime.GOOS != "darwin" {
// OS X doesn't like -rpath with cgo. See:
// https://code.google.com/p/go/issues/detail?id=7293
@@ -117,8 +133,8 @@ func printComponents() {
fmt.Println(strings.Join(components, " "))
}
-func printConfig() {
- flags := llvmFlags()
+func printConfig(linkmode string) {
+ flags := llvmFlags(linkmode)
fmt.Printf(`// +build !byollvm
@@ -137,7 +153,7 @@ type (run_build_sh int)
`, flags.cpp, flags.cxx, flags.ld)
}
-func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags string) {
+func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode string) {
args = addTag(args, "byollvm")
srcdir := llvmConfig("--src-root")
@@ -166,7 +182,7 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l
newgopathlist = append(newgopathlist, filepath.SplitList(os.Getenv("GOPATH"))...)
newgopath := strings.Join(newgopathlist, string(filepath.ListSeparator))
- flags := llvmFlags()
+ flags := llvmFlags(linkmode)
newenv := []string{
"CC=" + cc,
@@ -178,7 +194,7 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l
"PATH=" + newpath,
}
if llgo != "" {
- newenv = append(newenv, "GCCGO=" + llgo)
+ newenv = append(newenv, "GCCGO="+llgo)
}
for _, v := range os.Environ() {
@@ -234,45 +250,44 @@ func main() {
ldflags := os.Getenv("CGO_LDFLAGS")
gocmd := "go"
llgo := ""
+ linkmode := linkmodeComponentLibs
+
+ flags := []struct {
+ name string
+ dest *string
+ }{
+ {"cc", &cc},
+ {"cxx", &cxx},
+ {"go", &gocmd},
+ {"llgo", &llgo},
+ {"cppflags", &cppflags},
+ {"ldflags", &ldflags},
+ {"linkmode", &linkmode},
+ }
args := os.Args[1:]
- DONE: for {
- switch {
- case len(args) == 0:
+LOOP:
+ for {
+ if len(args) == 0 {
usage()
- case strings.HasPrefix(args[0], "cc="):
- cc = args[0][3:]
- args = args[1:]
- case strings.HasPrefix(args[0], "cxx="):
- cxx = args[0][4:]
- args = args[1:]
- case strings.HasPrefix(args[0], "go="):
- gocmd = args[0][3:]
- args = args[1:]
- case strings.HasPrefix(args[0], "llgo="):
- llgo = args[0][5:]
- args = args[1:]
- case strings.HasPrefix(args[0], "cppflags="):
- cppflags = args[0][9:]
- args = args[1:]
- case strings.HasPrefix(args[0], "cxxflags="):
- cxxflags = args[0][9:]
- args = args[1:]
- case strings.HasPrefix(args[0], "ldflags="):
- ldflags = args[0][8:]
- args = args[1:]
- default:
- break DONE
}
+ for _, flag := range flags {
+ if strings.HasPrefix(args[0], flag.name+"=") {
+ *flag.dest = args[0][len(flag.name)+1:]
+ args = args[1:]
+ continue LOOP
+ }
+ }
+ break
}
switch args[0] {
case "build", "get", "install", "run", "test":
- runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags)
+ runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode)
case "print-components":
printComponents()
case "print-config":
- printConfig()
+ printConfig(linkmode)
default:
usage()
}
diff --git a/tools/llvm-shlib/CMakeLists.txt b/tools/llvm-shlib/CMakeLists.txt
index 54d71d3..d9bd15f 100644
--- a/tools/llvm-shlib/CMakeLists.txt
+++ b/tools/llvm-shlib/CMakeLists.txt
@@ -2,42 +2,6 @@
# library is enabled by setting LLVM_BUILD_LLVM_DYLIB=yes on the CMake
# commandline. By default the shared library only exports the LLVM C API.
-
-# You can configure which libraries from LLVM you want to include in the shared
-# library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited list of
-# LLVM components. All compoenent names handled by llvm-config are valid.
-
-if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
- set(LLVM_DYLIB_COMPONENTS
- ${LLVM_TARGETS_TO_BUILD}
- Analysis
- BitReader
- BitWriter
- CodeGen
- Core
- DebugInfoDWARF
- DebugInfoPDB
- ExecutionEngine
- IPA
- IPO
- IRReader
- InstCombine
- Instrumentation
- Interpreter
- Linker
- MCDisassembler
- MCJIT
- ObjCARCOpts
- Object
- ScalarOpts
- Support
- Target
- TransformUtils
- Vectorize
- native
- )
-endif()
-
add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" )
set(SOURCES
@@ -46,6 +10,29 @@ set(SOURCES
llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
+if(LLVM_LINK_LLVM_DYLIB)
+ if(NOT LLVM_DYLIB_EXPORT_ALL)
+ message(FATAL_ERROR "LLVM_DYLIB_EXPORT_ALL must be ON when LLVM_LINK_LLVM_DYLIB is ON")
+ endif()
+
+ # libLLVM.so should not have any dependencies on any other LLVM
+ # shared libraries. When using the "all" pseudo-component,
+ # LLVM_AVAILABLE_LIBS is added to the dependencies, which may
+ # contain shared libraries (e.g. libLTO).
+ #
+ # Also exclude libLLVMTableGen for the following reasons:
+ # - it is only used by internal *-tblgen utilities;
+ # - it pollutes the global options space.
+ foreach(lib ${LIB_NAMES})
+ get_target_property(t ${lib} TYPE)
+ if("${lib}" STREQUAL "LLVMTableGen")
+ elseif("x${t}" STREQUAL "xSTATIC_LIBRARY")
+ list(APPEND FILTERED_LIB_NAMES ${lib})
+ endif()
+ endforeach()
+ set(LIB_NAMES ${FILTERED_LIB_NAMES})
+endif()
+
if(NOT DEFINED LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
if( WIN32 AND NOT CYGWIN )
@@ -95,7 +82,7 @@ else()
add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
endif()
-add_llvm_library(LLVM SHARED ${SOURCES})
+add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB ${SOURCES})
list(REMOVE_DUPLICATES LIB_NAMES)
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"

View file

@ -0,0 +1,9 @@
#include <bits/wordsize.h>
#if __WORDSIZE == 32
#include "llvm-config-32.h"
#elif __WORDSIZE == 64
#include "llvm-config-64.h"
#else
#error "Unknown word size"
#endif