mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2025-02-16 23:57:11 +00:00
extra/llvm to 3.8.0-1
This commit is contained in:
parent
a73a1d5b87
commit
6b0bbbeb45
9 changed files with 821 additions and 1323 deletions
|
@ -1,142 +0,0 @@
|
|||
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
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
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
|
||||
|
|
@ -0,0 +1,322 @@
|
|||
Index: cfe/trunk/docs/ItaniumMangleAbiTags.rst
|
||||
===================================================================
|
||||
--- cfe/trunk/docs/ItaniumMangleAbiTags.rst
|
||||
+++ cfe/trunk/docs/ItaniumMangleAbiTags.rst
|
||||
@@ -0,0 +1,101 @@
|
||||
+========
|
||||
+ABI tags
|
||||
+========
|
||||
+
|
||||
+Introduction
|
||||
+============
|
||||
+
|
||||
+This text tries to describe gcc semantic for mangling "abi_tag" attributes
|
||||
+described in https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
|
||||
+
|
||||
+There is no guarantee the following rules are correct, complete or make sense
|
||||
+in any way as they were determined empirically by experiments with gcc5.
|
||||
+
|
||||
+Declaration
|
||||
+===========
|
||||
+
|
||||
+ABI tags are declared in an abi_tag attribute and can be applied to a
|
||||
+function, variable, class or inline namespace declaration. The attribute takes
|
||||
+one or more strings (called tags); the order does not matter.
|
||||
+
|
||||
+See https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html for
|
||||
+details.
|
||||
+
|
||||
+Tags on an inline namespace are called "implicit tags", all other tags are
|
||||
+"explicit tags".
|
||||
+
|
||||
+Mangling
|
||||
+========
|
||||
+
|
||||
+All tags that are "active" on an <unqualified-name> are emitted after the
|
||||
+<unqualified-name>, before <template-args> or <discriminator>, and are part of
|
||||
+the same <substitution> the <unqualified-name> is.
|
||||
+
|
||||
+They are mangled as:
|
||||
+
|
||||
+ <abi-tags> ::= <abi-tag>* # sort by name
|
||||
+ <abi-tag> ::= B <tag source-name>
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+ __attribute__((abi_tag("test")))
|
||||
+ void Func();
|
||||
+
|
||||
+ gets mangled as: _Z4FuncB4testv (prettified as `Func[abi:test]()`)
|
||||
+
|
||||
+Active tags
|
||||
+===========
|
||||
+
|
||||
+A namespace does not have any active tags. For types (class / struct / union /
|
||||
+enum), the explicit tags are the active tags.
|
||||
+
|
||||
+For variables and functions, the active tags are the explicit tags plus any
|
||||
+"required tags" which are not in the "available tags" set:
|
||||
+
|
||||
+ derived-tags := (required-tags - available-tags)
|
||||
+ active-tags := explicit-tags + derived-tags
|
||||
+
|
||||
+Required tags for a function
|
||||
+============================
|
||||
+
|
||||
+If a function is used as a local scope for another name, and is part of
|
||||
+another function as local scope, it doesn't have any required tags.
|
||||
+
|
||||
+If a function is used as a local scope for a guard variable name, it doesn't
|
||||
+have any required tags.
|
||||
+
|
||||
+Otherwise the function requires any implicit or explicit tag used in the name
|
||||
+for the return type.
|
||||
+
|
||||
+Example:
|
||||
+ namespace A {
|
||||
+ inline namespace B __attribute__((abi_tag)) {
|
||||
+ struct C { int x; };
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ A::C foo();
|
||||
+
|
||||
+ gets mangled as: _Z3fooB1Bv (prettified as `foo[abi:B]()`)
|
||||
+
|
||||
+Required tags for a variable
|
||||
+============================
|
||||
+
|
||||
+A variable requires any implicit or explicit tag used in its type.
|
||||
+
|
||||
+Available tags
|
||||
+==============
|
||||
+
|
||||
+All tags used in the prefix and in the template arguments for a name are
|
||||
+available. Also, for functions, all tags from the <bare-function-type>
|
||||
+(which might include the return type for template functions) are available.
|
||||
+
|
||||
+For <local-name>s all active tags used in the local part (<function-
|
||||
+encoding>) are available, but not implicit tags which were not active.
|
||||
+
|
||||
+Implicit and explicit tags used in the <unqualified-name> for a function (as
|
||||
+in the type of a cast operator) are NOT available.
|
||||
+
|
||||
+Example: a cast operator to std::string (which is
|
||||
+std::__cxx11::basic_string<...>) will use 'cxx11' as an active tag, as it is
|
||||
+required from the return type `std::string` but not available.
|
||||
Index: cfe/trunk/include/clang/Basic/Attr.td
|
||||
===================================================================
|
||||
--- cfe/trunk/include/clang/Basic/Attr.td
|
||||
+++ cfe/trunk/include/clang/Basic/Attr.td
|
||||
@@ -358,6 +358,14 @@
|
||||
// Attributes begin here
|
||||
//
|
||||
|
||||
+def AbiTag : Attr {
|
||||
+ let Spellings = [GCC<"abi_tag">];
|
||||
+ let Args = [VariadicStringArgument<"Tags">];
|
||||
+ let Subjects = SubjectList<[Struct, Var, Function, Namespace], ErrorDiag,
|
||||
+ "ExpectedStructClassVariableFunctionOrInlineNamespace">;
|
||||
+ let Documentation = [AbiTagsDocs];
|
||||
+}
|
||||
+
|
||||
def AddressSpace : TypeAttr {
|
||||
let Spellings = [GNU<"address_space">];
|
||||
let Args = [IntArgument<"AddressSpace">];
|
||||
Index: cfe/trunk/include/clang/Basic/AttrDocs.td
|
||||
===================================================================
|
||||
--- cfe/trunk/include/clang/Basic/AttrDocs.td
|
||||
+++ cfe/trunk/include/clang/Basic/AttrDocs.td
|
||||
@@ -2132,3 +2132,16 @@
|
||||
optimizations like C++'s named return value optimization (NRVO).
|
||||
}];
|
||||
}
|
||||
+
|
||||
+def AbiTagsDocs : Documentation {
|
||||
+ let Content = [{
|
||||
+The ``abi_tag`` attribute can be applied to a function, variable, class or
|
||||
+inline namespace declaration to modify the mangled name of the entity. It gives
|
||||
+the ability to distinguish between different versions of the same entity but
|
||||
+with different ABI versions supported. For example, a newer version of a class
|
||||
+could have a different set of data members and thus have a different size. Using
|
||||
+the ``abi_tag`` attribute, it is possible to have different mangled names for
|
||||
+a global variable of the class type. Therefor, the old code could keep using
|
||||
+the old manged name and the new code will use the new mangled name with tags.
|
||||
+ }];
|
||||
+}
|
||||
Index: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
|
||||
===================================================================
|
||||
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
|
||||
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
|
||||
@@ -2477,7 +2477,8 @@
|
||||
"Objective-C instance methods|init methods of interface or class extension declarations|"
|
||||
"variables, functions and classes|Objective-C protocols|"
|
||||
"functions and global variables|structs, unions, and typedefs|structs and typedefs|"
|
||||
- "interface or protocol declarations|kernel functions|non-K&R-style functions}1">,
|
||||
+ "interface or protocol declarations|kernel functions|non-K&R-style functions|"
|
||||
+ "structs, classes, variables, functions, and inline namespaces}1">,
|
||||
InGroup<IgnoredAttributes>;
|
||||
def err_attribute_wrong_decl_type : Error<warn_attribute_wrong_decl_type.Text>;
|
||||
def warn_type_attribute_wrong_type : Warning<
|
||||
@@ -4195,6 +4196,13 @@
|
||||
def err_redefinition_extern_inline : Error<
|
||||
"redefinition of a 'extern inline' function %0 is not supported in "
|
||||
"%select{C99 mode|C++}1">;
|
||||
+def warn_attr_abi_tag_namespace : Warning<
|
||||
+ "'abi_tag' attribute on %select{non-inline|anonymous}0 namespace ignored">,
|
||||
+ InGroup<IgnoredAttributes>;
|
||||
+def err_abi_tag_on_redeclaration : Error<
|
||||
+ "cannot add 'abi_tag' attribute in a redeclaration">;
|
||||
+def err_new_abi_tag_on_redeclaration : Error<
|
||||
+ "'abi_tag' %0 missing in original declaration">;
|
||||
|
||||
def note_deleted_dtor_no_operator_delete : Note<
|
||||
"virtual destructor requires an unambiguous, accessible 'operator delete'">;
|
||||
Index: cfe/trunk/include/clang/Sema/AttributeList.h
|
||||
===================================================================
|
||||
--- cfe/trunk/include/clang/Sema/AttributeList.h
|
||||
+++ cfe/trunk/include/clang/Sema/AttributeList.h
|
||||
@@ -895,7 +895,8 @@
|
||||
ExpectedStructOrTypedef,
|
||||
ExpectedObjectiveCInterfaceOrProtocol,
|
||||
ExpectedKernelFunction,
|
||||
- ExpectedFunctionWithProtoType
|
||||
+ ExpectedFunctionWithProtoType,
|
||||
+ ExpectedStructClassVariableFunctionOrInlineNamespace
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
Index: cfe/trunk/lib/Sema/SemaDecl.cpp
|
||||
===================================================================
|
||||
--- cfe/trunk/lib/Sema/SemaDecl.cpp
|
||||
+++ cfe/trunk/lib/Sema/SemaDecl.cpp
|
||||
@@ -2398,6 +2398,24 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ // Re-declaration cannot add abi_tag's.
|
||||
+ if (const auto *NewAbiTagAttr = New->getAttr<AbiTagAttr>()) {
|
||||
+ if (const auto *OldAbiTagAttr = Old->getAttr<AbiTagAttr>()) {
|
||||
+ for (const auto &NewTag : NewAbiTagAttr->tags()) {
|
||||
+ if (std::find(OldAbiTagAttr->tags_begin(), OldAbiTagAttr->tags_end(),
|
||||
+ NewTag) == OldAbiTagAttr->tags_end()) {
|
||||
+ Diag(NewAbiTagAttr->getLocation(),
|
||||
+ diag::err_new_abi_tag_on_redeclaration)
|
||||
+ << NewTag;
|
||||
+ Diag(OldAbiTagAttr->getLocation(), diag::note_previous_declaration);
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ Diag(NewAbiTagAttr->getLocation(), diag::err_abi_tag_on_redeclaration);
|
||||
+ Diag(Old->getLocation(), diag::note_previous_declaration);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (!Old->hasAttrs())
|
||||
return;
|
||||
|
||||
Index: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
|
||||
===================================================================
|
||||
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp
|
||||
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp
|
||||
@@ -4615,6 +4615,42 @@
|
||||
Attr.getRange(), S.Context, Attr.getAttributeSpellingListIndex()));
|
||||
}
|
||||
|
||||
+static void handleAbiTagAttr(Sema &S, Decl *D, const AttributeList &Attr) {
|
||||
+ SmallVector<std::string, 4> Tags;
|
||||
+ for (unsigned I = 0, E = Attr.getNumArgs(); I != E; ++I) {
|
||||
+ StringRef Tag;
|
||||
+ if (!S.checkStringLiteralArgumentAttr(Attr, I, Tag))
|
||||
+ return;
|
||||
+ Tags.push_back(Tag);
|
||||
+ }
|
||||
+
|
||||
+ if (const auto *NS = dyn_cast<NamespaceDecl>(D)) {
|
||||
+ if (!NS->isInline()) {
|
||||
+ S.Diag(Attr.getLoc(), diag::warn_attr_abi_tag_namespace) << 0;
|
||||
+ return;
|
||||
+ }
|
||||
+ if (NS->isAnonymousNamespace()) {
|
||||
+ S.Diag(Attr.getLoc(), diag::warn_attr_abi_tag_namespace) << 1;
|
||||
+ return;
|
||||
+ }
|
||||
+ if (Attr.getNumArgs() == 0)
|
||||
+ Tags.push_back(NS->getName());
|
||||
+ } else if (!checkAttributeAtLeastNumArgs(S, Attr, 1))
|
||||
+ return;
|
||||
+
|
||||
+ // Store tags sorted and without duplicates.
|
||||
+ std::sort(Tags.begin(), Tags.end());
|
||||
+ Tags.erase(std::unique(Tags.begin(), Tags.end()), Tags.end());
|
||||
+
|
||||
+ D->addAttr(::new (S.Context)
|
||||
+ AbiTagAttr(Attr.getRange(), S.Context, Tags.data(), Tags.size(),
|
||||
+ Attr.getAttributeSpellingListIndex()));
|
||||
+
|
||||
+ // FIXME: remove this warning as soon as mangled part is ready.
|
||||
+ S.Diag(Attr.getRange().getBegin(), diag::warn_attribute_ignored)
|
||||
+ << Attr.getName();
|
||||
+}
|
||||
+
|
||||
static void handleARMInterruptAttr(Sema &S, Decl *D,
|
||||
const AttributeList &Attr) {
|
||||
// Check the attribute arguments.
|
||||
@@ -5637,6 +5673,9 @@
|
||||
case AttributeList::AT_Thread:
|
||||
handleDeclspecThreadAttr(S, D, Attr);
|
||||
break;
|
||||
+ case AttributeList::AT_AbiTag:
|
||||
+ handleAbiTagAttr(S, D, Attr);
|
||||
+ break;
|
||||
|
||||
// Thread safety attributes:
|
||||
case AttributeList::AT_AssertExclusiveLock:
|
||||
Index: cfe/trunk/test/SemaCXX/attr-abi-tag-syntax.cpp
|
||||
===================================================================
|
||||
--- cfe/trunk/test/SemaCXX/attr-abi-tag-syntax.cpp
|
||||
+++ cfe/trunk/test/SemaCXX/attr-abi-tag-syntax.cpp
|
||||
@@ -0,0 +1,43 @@
|
||||
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
|
||||
+
|
||||
+namespace N1 {
|
||||
+
|
||||
+namespace __attribute__((__abi_tag__)) {}
|
||||
+// expected-warning@-1 {{'abi_tag' attribute on non-inline namespace ignored}}
|
||||
+
|
||||
+namespace N __attribute__((__abi_tag__)) {}
|
||||
+// expected-warning@-1 {{'abi_tag' attribute on non-inline namespace ignored}}
|
||||
+
|
||||
+} // namespace N1
|
||||
+
|
||||
+namespace N2 {
|
||||
+
|
||||
+inline namespace __attribute__((__abi_tag__)) {}
|
||||
+// expected-warning@-1 {{'abi_tag' attribute on anonymous namespace ignored}}
|
||||
+
|
||||
+inline namespace N __attribute__((__abi_tag__)) {}
|
||||
+// FIXME: remove this warning as soon as attribute fully supported.
|
||||
+// expected-warning@-2 {{'__abi_tag__' attribute ignored}}
|
||||
+
|
||||
+} // namespcace N2
|
||||
+
|
||||
+__attribute__((abi_tag("B", "A"))) extern int a1;
|
||||
+// FIXME: remove this warning as soon as attribute fully supported.
|
||||
+// expected-warning@-2 {{'abi_tag' attribute ignored}}
|
||||
+
|
||||
+__attribute__((abi_tag("A", "B"))) extern int a1;
|
||||
+// expected-note@-1 {{previous declaration is here}}
|
||||
+// FIXME: remove this warning as soon as attribute fully supported.
|
||||
+// expected-warning@-3 {{'abi_tag' attribute ignored}}
|
||||
+
|
||||
+__attribute__((abi_tag("A", "C"))) extern int a1;
|
||||
+// expected-error@-1 {{'abi_tag' C missing in original declaration}}
|
||||
+// FIXME: remove this warning as soon as attribute fully supported.
|
||||
+// expected-warning@-3 {{'abi_tag' attribute ignored}}
|
||||
+
|
||||
+extern int a2;
|
||||
+// expected-note@-1 {{previous declaration is here}}
|
||||
+__attribute__((abi_tag("A")))extern int a2;
|
||||
+// expected-error@-1 {{cannot add 'abi_tag' attribute in a redeclaration}}
|
||||
+// FIXME: remove this warning as soon as attribute fully supported.
|
||||
+// expected-warning@-3 {{'abi_tag' attribute ignored}}
|
File diff suppressed because it is too large
Load diff
|
@ -13,9 +13,8 @@
|
|||
# - v5: disable compiler-rt, don't install in clang package
|
||||
# - v8: disable lldb, unsupported architecture
|
||||
|
||||
pkgname=('llvm' 'llvm-libs' 'llvm-ocaml' 'lldb' 'clang' 'clang-analyzer'
|
||||
'clang-tools-extra')
|
||||
pkgver=3.7.1
|
||||
pkgname=('llvm' 'llvm-libs' 'llvm-ocaml' 'lldb' 'clang' 'clang-tools-extra')
|
||||
pkgver=3.8.0
|
||||
pkgrel=1
|
||||
_ocaml_ver=4.02.3
|
||||
arch=('i686' 'x86_64')
|
||||
|
@ -31,34 +30,23 @@ source=(http://llvm.org/releases/$pkgver/llvm-$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
|
||||
D17567-PR23529-Sema-part-of-attrbute-abi_tag-support.patch
|
||||
D18035-PR23529-Mangler-part-of-attrbute-abi_tag-support.patch
|
||||
llvm-Config-llvm-config.h)
|
||||
sha256sums=('be7794ed0cec42d6c682ca8e3517535b54555a3defabec83554dbc74db545ad5'
|
||||
sha256sums=('555b028e9ee0f6445ff8f949ea10e9cd8be0d084840e21fbbe1d31d51fc06e46'
|
||||
'SKIP'
|
||||
'56e2164c7c2a1772d5ed2a3e57485ff73ff06c97dff12edbeea1acc4412b0674'
|
||||
'04149236de03cf05232d68eb7cb9c50f03062e339b68f4f8a03b650a11536cf9'
|
||||
'SKIP'
|
||||
'4a91edaccad1ce984c7c49a4a87db186b7f7b21267b2b03bcf4bd7820715bc6b'
|
||||
'afbda810106a6e64444bc164b921be928af46829117c95b996f2678ce4cb1ec4'
|
||||
'SKIP'
|
||||
'9d4769e4a927d3824bcb7a9c82b01e307c68588e6de4e7f04ab82d82c5af8181'
|
||||
'c8d3387e55f229543dac1941769120f24dc50183150bf19d1b070d53d29d56b0'
|
||||
'SKIP'
|
||||
'9a0bc315ef55f44c98cdf92d064df0847f453ed156dd0ef6a87e04f5fd6a0e01'
|
||||
'e3f68f44147df0433e7989bf6ed1c58ff28d7c68b9c47553cb9915f744785a35'
|
||||
'SKIP'
|
||||
'cf9c8b4d70b4547eda162644658c5c203c3139fcea6c75003b6cd7dc11a8cccc'
|
||||
'a1c9f36b97c639666ab6a1bd647a08a027e93e3d3cfd6f5af9c36e757599ce81'
|
||||
'5ed52d54612829402b63bc500bfefae75b3dc444a1524849c26cadf7e0ae4b7d'
|
||||
'3abf85430c275ecb8dbb526ecb82b1c9f4b4f782a8a43b5a06d040ec0baba7e7'
|
||||
'2d53b6ed4c7620eeade87e7761b98093a0434801ddd599056daed7881141fb01'
|
||||
'c5f4e329143bef36b623ba5daf311b5a73fa99ab05fed4ba506c1c3bc4cf5ee7'
|
||||
'f44e8fe3cef9b6f706d651f443922261e1dcf53bcaabdd0ac7edb1758e4bc44d'
|
||||
'406754764e83d58bc3b859ab4b7893abd48c760278c4619cf4341ef9b9b75c85'
|
||||
'd2ea6d06352d378961a6970cdefb23ef1ba8e4c046c0ace0c479e2dd674aabce'
|
||||
'597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48')
|
||||
validpgpkeys=('11E521D646982372EB577A1F8F0871F202119294'
|
||||
'B6C8F98282B944E3B0D5C2530FC3042E345AD05D')
|
||||
validpgpkeys=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D')
|
||||
|
||||
prepare() {
|
||||
cd "$srcdir/llvm-$pkgver.src"
|
||||
|
@ -73,32 +61,9 @@ prepare() {
|
|||
|
||||
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
|
||||
patch -d tools/clang -Np2 <../D17567-PR23529-Sema-part-of-attrbute-abi_tag-support.patch
|
||||
patch -d tools/clang -Np0 <../D18035-PR23529-Mangler-part-of-attrbute-abi_tag-support.patch
|
||||
|
||||
mkdir build
|
||||
}
|
||||
|
@ -138,8 +103,8 @@ build() {
|
|||
check() {
|
||||
cd "$srcdir/llvm-$pkgver.src/build"
|
||||
make check
|
||||
make check-clang || warning \
|
||||
'Ignoring Clang test failures caused by name mangling differences'
|
||||
make check-clang || { [[ $CARCH == i686 ]] && warning \
|
||||
'Ignoring clang test failures caused by name mangling differences'; }
|
||||
}
|
||||
|
||||
package_llvm() {
|
||||
|
@ -154,7 +119,7 @@ package_llvm() {
|
|||
rm -r "$pkgdir"/usr/share/doc/$pkgname/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/lib{LLVM,LTO}*.so "$srcdir"
|
||||
mv -f "$pkgdir"/usr/lib/LLVMgold.so "$srcdir"
|
||||
|
||||
# OCaml bindings go to a separate package
|
||||
|
@ -180,7 +145,7 @@ package_llvm-libs() {
|
|||
|
||||
install -d "$pkgdir/usr/lib"
|
||||
cp -P \
|
||||
"$srcdir"/lib{LLVM,LTO}.so* \
|
||||
"$srcdir"/lib{LLVM,LTO}*.so \
|
||||
"$srcdir"/LLVMgold.so \
|
||||
"$pkgdir/usr/lib/"
|
||||
|
||||
|
@ -209,7 +174,7 @@ package_llvm-ocaml() {
|
|||
package_lldb() {
|
||||
pkgdesc="Next generation, high-performance debugger"
|
||||
url="http://lldb.llvm.org/"
|
||||
depends=('libedit' 'libxml2' 'python2')
|
||||
depends=('libedit' 'libxml2' 'python2' 'python2-six')
|
||||
|
||||
[[ $CARCH == "aarch64" ]] && return
|
||||
|
||||
|
@ -217,6 +182,9 @@ package_lldb() {
|
|||
|
||||
make -C build/tools/lldb DESTDIR="$pkgdir" install
|
||||
|
||||
# Remove bundled six library
|
||||
rm "$pkgdir/usr/lib/python2.7/site-packages/six.py"
|
||||
|
||||
# Compile Python scripts
|
||||
python2 -m compileall "$pkgdir/usr/lib/python2.7/site-packages/lldb"
|
||||
python2 -O -m compileall "$pkgdir/usr/lib/python2.7/site-packages/lldb"
|
||||
|
@ -227,8 +195,12 @@ package_lldb() {
|
|||
package_clang() {
|
||||
pkgdesc="C language family frontend for LLVM"
|
||||
url="http://clang.llvm.org/"
|
||||
depends=("llvm-libs=$pkgver-$pkgrel" 'gcc')
|
||||
optdepends=('python2: for git-clang-format')
|
||||
depends=("llvm-libs=$pkgver-$pkgrel" 'gcc' 'libxml2')
|
||||
optdepends=('openmp: OpenMP support in clang with -fopenmp'
|
||||
'python2: for scan-view and git-clang-format')
|
||||
provides=("clang-analyzer=$pkgver")
|
||||
conflicts=('clang-analyzer')
|
||||
replaces=('clang-analyzer')
|
||||
|
||||
cd "$srcdir/llvm-$pkgver.src"
|
||||
|
||||
|
@ -238,58 +210,31 @@ package_clang() {
|
|||
# Remove documentation sources
|
||||
rm -r "$pkgdir"/usr/share/doc/$pkgname/html/{_sources,.buildinfo}
|
||||
|
||||
# Move analyzer scripts out of /usr/libexec
|
||||
mv "$pkgdir"/usr/libexec/{ccc,c++}-analyzer "$pkgdir/usr/lib/clang/"
|
||||
rmdir "$pkgdir/usr/libexec"
|
||||
sed -i 's|libexec|lib/clang|' "$pkgdir/usr/bin/scan-build"
|
||||
|
||||
# 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/scan-view" \
|
||||
"$pkgdir/usr/bin/git-clang-format" \
|
||||
"$pkgdir/usr/share/$pkgname/clang-format-diff.py"
|
||||
|
||||
# Compile Python scripts
|
||||
python2 -m compileall "$pkgdir"
|
||||
python2 -O -m compileall "$pkgdir"
|
||||
|
||||
install -Dm644 tools/clang/LICENSE.TXT \
|
||||
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
}
|
||||
|
||||
package_clang-analyzer() {
|
||||
pkgdesc="A source code analysis framework"
|
||||
url="http://clang-analyzer.llvm.org/"
|
||||
depends=("clang=$pkgver-$pkgrel" 'python2')
|
||||
|
||||
cd "$srcdir/llvm-$pkgver.src/tools/clang"
|
||||
|
||||
install -d "$pkgdir"/usr/{bin,lib/clang-analyzer}
|
||||
for _tool in scan-{build,view}; do
|
||||
cp -a tools/$_tool "$pkgdir/usr/lib/clang-analyzer/"
|
||||
ln -s /usr/lib/clang-analyzer/$_tool/$_tool "$pkgdir/usr/bin/"
|
||||
done
|
||||
|
||||
# scan-build looks for clang within the same directory
|
||||
ln -s /usr/bin/clang "$pkgdir/usr/lib/clang-analyzer/scan-build/"
|
||||
|
||||
# Relocate man page
|
||||
install -d "$pkgdir/usr/share/man/man1"
|
||||
mv "$pkgdir/usr/lib/clang-analyzer/scan-build/scan-build.1" \
|
||||
"$pkgdir/usr/share/man/man1/"
|
||||
|
||||
# Use Python 2
|
||||
sed -i \
|
||||
-e 's|env python$|&2|' \
|
||||
-e 's|/usr/bin/python$|&2|' \
|
||||
"$pkgdir/usr/lib/clang-analyzer/scan-view/scan-view" \
|
||||
"$pkgdir/usr/lib/clang-analyzer/scan-build/set-xcode-analyzer"
|
||||
|
||||
# Compile Python scripts
|
||||
python2 -m compileall "$pkgdir/usr/lib/clang-analyzer"
|
||||
python2 -O -m compileall "$pkgdir/usr/lib/clang-analyzer"
|
||||
|
||||
install -Dm644 LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
||||
}
|
||||
|
||||
package_clang-tools-extra() {
|
||||
pkgdesc="Extra tools built using Clang's tooling APIs"
|
||||
pkgdesc="Extra tools built using clang's tooling APIs"
|
||||
url="http://clang.llvm.org/"
|
||||
depends=("clang=$pkgver-$pkgrel")
|
||||
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
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)
|
|
@ -1,20 +0,0 @@
|
|||
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)
|
|
@ -1,11 +0,0 @@
|
|||
--- 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...")
|
|
@ -1,440 +0,0 @@
|
|||
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"
|
Loading…
Reference in a new issue