Date: Wednesday, October 26, 2016 @ 15:18:46 Author: foutrelis Revision: 279255
upgpkg: llvm 3.9.0-1 - Prevent msan initialization failure with newer (2.23+) glibc (FS#50385). - Disable use of libedit in LLDB due to buggy input behavior (FS#49974). - Fix importing lldb in Python (FS#50759). - OCaml 4.03.0 rebuild. Added: llvm/trunk/msan-prevent-initialization-failure-with-newer-glibc.patch Modified: llvm/trunk/PKGBUILD ------------------------------------------------------------+ PKGBUILD | 24 +- msan-prevent-initialization-failure-with-newer-glibc.patch | 103 +++++++++++ 2 files changed, 118 insertions(+), 9 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2016-10-26 13:40:48 UTC (rev 279254) +++ PKGBUILD 2016-10-26 15:18:46 UTC (rev 279255) @@ -12,7 +12,7 @@ pkgname=('llvm' 'llvm-libs' 'llvm-ocaml' 'lldb' 'clang' 'clang-tools-extra') pkgver=3.9.0 pkgrel=1 -_ocaml_ver=4.02.3 +_ocaml_ver=4.03.0 arch=('i686' 'x86_64') url="http://llvm.org/" license=('custom:University of Illinois/NCSA Open Source License') @@ -26,6 +26,7 @@ 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} + msan-prevent-initialization-failure-with-newer-glibc.patch llvm-Config-llvm-config.h) sha256sums=('66c73179da42cee1386371641241f79ded250e117a79f571bbd69e56daa48948' 'SKIP' @@ -37,9 +38,9 @@ 'SKIP' '61280e07411e3f2b4cca0067412b39c16b0a9edd19d304d3fc90249899d12384' 'SKIP' + '8e4f194c2283b91644a7fff43bc4e58c36b5507f2a4d90b72f275c0bd7511c20' '597dc5968c695bbdbb0eac9e8eb5117fcd2773bc91edf5ec103ecffffab8bc48') -validpgpkeys=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D' - '11E521D646982372EB577A1F8F0871F202119294') +validpgpkeys=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D') prepare() { cd "$srcdir/llvm-$pkgver.src" @@ -54,6 +55,9 @@ mv "$srcdir/lldb-$pkgver.src" tools/lldb + # https://reviews.llvm.org/D24736 + patch -Np0 -d projects/compiler-rt <../msan-prevent-initialization-failure-with-newer-glibc.patch + mkdir build } @@ -64,7 +68,6 @@ -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 \ @@ -72,6 +75,7 @@ -DLLVM_BUILD_DOCS=ON \ -DLLVM_ENABLE_SPHINX=ON \ -DLLVM_ENABLE_DOXYGEN=OFF \ + -DLLDB_DISABLE_LIBEDIT=1 \ -DSPHINX_WARNINGS_AS_ERRORS=OFF \ -DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi) \ -DLLVM_BINUTILS_INCDIR=/usr/include \ @@ -159,12 +163,16 @@ package_lldb() { pkgdesc="Next generation, high-performance debugger" url="http://lldb.llvm.org/" - depends=('libedit' 'libxml2' 'python2' 'python2-six') + depends=('libxml2' 'python2' 'python2-six') cd "$srcdir/llvm-$pkgver.src" make -C build/tools/lldb DESTDIR="$pkgdir" install + # https://bugs.archlinux.org/task/50759 + sed -i "/import_module('_lldb')/s/_lldb/lldb.&/" \ + "$pkgdir/usr/lib/python2.7/site-packages/lldb/__init__.py" + # Remove bundled six library rm "$pkgdir/usr/lib/python2.7/site-packages/six.py" @@ -226,10 +234,8 @@ make -C build/tools/clang/tools/extra DESTDIR="$pkgdir" install # Use Python 2 - sed -i \ - -e 's|env python$|&2|' \ - -e 's|/usr/bin/python$|&2|' \ - "$pkgdir"/usr/share/clang/{clang-tidy-diff,run-clang-tidy}.py + sed -i 's|/usr/bin/env python|&2|' \ + "$pkgdir"/usr/share/clang/{clang-tidy-diff,run-clang-tidy,run-find-all-symbols}.py install -Dm644 tools/clang/tools/extra/LICENSE.TXT \ "$pkgdir/usr/share/licenses/$pkgname/LICENSE" Added: msan-prevent-initialization-failure-with-newer-glibc.patch =================================================================== --- msan-prevent-initialization-failure-with-newer-glibc.patch (rev 0) +++ msan-prevent-initialization-failure-with-newer-glibc.patch 2016-10-26 15:18:46 UTC (rev 279255) @@ -0,0 +1,103 @@ +Index: lib/msan/msan_interceptors.cc +=================================================================== +--- lib/msan/msan_interceptors.cc (revision 282231) ++++ lib/msan/msan_interceptors.cc (revision 282232) +@@ -64,6 +64,23 @@ + return in_interceptor_scope; + } + ++static uptr allocated_for_dlsym; ++static const uptr kDlsymAllocPoolSize = 1024; ++static uptr alloc_memory_for_dlsym[kDlsymAllocPoolSize]; ++ ++static bool IsInDlsymAllocPool(const void *ptr) { ++ uptr off = (uptr)ptr - (uptr)alloc_memory_for_dlsym; ++ return off < sizeof(alloc_memory_for_dlsym); ++} ++ ++static void *AllocateFromLocalPool(uptr size_in_bytes) { ++ uptr size_in_words = RoundUpTo(size_in_bytes, kWordSize) / kWordSize; ++ void *mem = (void *)&alloc_memory_for_dlsym[allocated_for_dlsym]; ++ allocated_for_dlsym += size_in_words; ++ CHECK_LT(allocated_for_dlsym, kDlsymAllocPoolSize); ++ return mem; ++} ++ + #define ENSURE_MSAN_INITED() do { \ + CHECK(!msan_init_is_running); \ + if (!msan_inited) { \ +@@ -227,7 +244,7 @@ + + INTERCEPTOR(void, free, void *ptr) { + GET_MALLOC_STACK_TRACE; +- if (!ptr) return; ++ if (!ptr || UNLIKELY(IsInDlsymAllocPool(ptr))) return; + MsanDeallocate(&stack, ptr); + } + +@@ -234,7 +251,7 @@ + #if !SANITIZER_FREEBSD + INTERCEPTOR(void, cfree, void *ptr) { + GET_MALLOC_STACK_TRACE; +- if (!ptr) return; ++ if (!ptr || UNLIKELY(IsInDlsymAllocPool(ptr))) return; + MsanDeallocate(&stack, ptr); + } + #define MSAN_MAYBE_INTERCEPT_CFREE INTERCEPT_FUNCTION(cfree) +@@ -907,27 +924,29 @@ + + INTERCEPTOR(void *, calloc, SIZE_T nmemb, SIZE_T size) { + GET_MALLOC_STACK_TRACE; +- if (UNLIKELY(!msan_inited)) { ++ if (UNLIKELY(!msan_inited)) + // Hack: dlsym calls calloc before REAL(calloc) is retrieved from dlsym. +- const SIZE_T kCallocPoolSize = 1024; +- static uptr calloc_memory_for_dlsym[kCallocPoolSize]; +- static SIZE_T allocated; +- SIZE_T size_in_words = ((nmemb * size) + kWordSize - 1) / kWordSize; +- void *mem = (void*)&calloc_memory_for_dlsym[allocated]; +- allocated += size_in_words; +- CHECK(allocated < kCallocPoolSize); +- return mem; +- } ++ return AllocateFromLocalPool(nmemb * size); + return MsanCalloc(&stack, nmemb, size); + } + + INTERCEPTOR(void *, realloc, void *ptr, SIZE_T size) { + GET_MALLOC_STACK_TRACE; ++ if (UNLIKELY(IsInDlsymAllocPool(ptr))) { ++ uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym; ++ uptr copy_size = Min(size, kDlsymAllocPoolSize - offset); ++ void *new_ptr = AllocateFromLocalPool(size); ++ internal_memcpy(new_ptr, ptr, copy_size); ++ return new_ptr; ++ } + return MsanReallocate(&stack, ptr, size, sizeof(u64), false); + } + + INTERCEPTOR(void *, malloc, SIZE_T size) { + GET_MALLOC_STACK_TRACE; ++ if (UNLIKELY(!msan_inited)) ++ // Hack: dlsym calls malloc before REAL(malloc) is retrieved from dlsym. ++ return AllocateFromLocalPool(size); + return MsanReallocate(&stack, nullptr, size, sizeof(u64), false); + } + +Index: lib/asan/asan_malloc_linux.cc +=================================================================== +--- lib/asan/asan_malloc_linux.cc (revision 282231) ++++ lib/asan/asan_malloc_linux.cc (revision 282232) +@@ -78,7 +78,11 @@ + if (UNLIKELY(IsInDlsymAllocPool(ptr))) { + uptr offset = (uptr)ptr - (uptr)alloc_memory_for_dlsym; + uptr copy_size = Min(size, kDlsymAllocPoolSize - offset); +- void *new_ptr = asan_malloc(size, &stack); ++ void *new_ptr; ++ if (UNLIKELY(!asan_inited)) ++ new_ptr = AllocateFromLocalPool(size); ++ else ++ new_ptr = asan_malloc(size, &stack); + internal_memcpy(new_ptr, ptr, copy_size); + return new_ptr; + }