Date: Thursday, May 27, 2021 @ 04:22:12 Author: foutrelis Revision: 947986
upgpkg: lib32-llvm 12.0.0-1: new upstream release Build with -fno-semantic-interposition and -Bsymbolic-function for improved performance (FS#70697). Added: lib32-llvm/trunk/add-fno-semantic-interposition.patch lib32-llvm/trunk/force-visibility-of-llvm-Any-to-external.patch lib32-llvm/trunk/llvm-link-with-Bsymbolic-functions.patch Modified: lib32-llvm/trunk/PKGBUILD Deleted: lib32-llvm/trunk/amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch ----------------------------------------------------------+ PKGBUILD | 22 ++- add-fno-semantic-interposition.patch | 22 +++ amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch | 85 ------------- force-visibility-of-llvm-Any-to-external.patch | 42 ++++++ llvm-link-with-Bsymbolic-functions.patch | 66 ++++++++++ 5 files changed, 145 insertions(+), 92 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2021-05-27 04:21:53 UTC (rev 947985) +++ PKGBUILD 2021-05-27 04:22:12 UTC (rev 947986) @@ -3,7 +3,7 @@ # Contributor: Jan "heftig" Steffens <[email protected]> pkgname=('lib32-llvm' 'lib32-llvm-libs') -pkgver=11.1.0 +pkgver=12.0.0 pkgrel=1 arch=('x86_64') url="https://llvm.org/" @@ -13,10 +13,14 @@ options=('staticlibs') _source_base=https://github.com/llvm/llvm-project/releases/download/llvmorg-$pkgver source=($_source_base/llvm-$pkgver.src.tar.xz{,.sig} - amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch) -sha256sums=('ce8508e318a01a63d4e8b3090ab2ded3c598a50258cc49e2625b9120d4c03ea5' + force-visibility-of-llvm-Any-to-external.patch + llvm-link-with-Bsymbolic-functions.patch + add-fno-semantic-interposition.patch) +sha256sums=('49dc47c8697a1a0abd4ee51629a696d7bfe803662f2a7252a3b16fc75f3a8b50' 'SKIP' - '85b6977005899bc76fcc548e0b6501cae5f50a8ad03060b9f58d03d775323327') + '98721af5a36af2a8e88c14a81b16d3929b12515d7d2d1ba385eb243dca3c32cb' + '560ce1e206c19f4b86f4c583b743db0ad47a610418999350710aafd60ae50fcd' + 'fc8c64267a5d179e9fc24fb2bc6150edef2598c83f5b2d138d14e05ce9f4e345') validpgpkeys+=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D') # Hans Wennborg <[email protected]> validpgpkeys+=('474E22316ABF4785A88C6E8EA2C794A986419D8A') # Tom Stellard <[email protected]> @@ -24,9 +28,13 @@ cd "$srcdir/llvm-$pkgver.src" mkdir build - # https://gitlab.freedesktop.org/mesa/mesa/-/issues/4107 - # https://bugs.llvm.org/show_bug.cgi?id=48921#c2 - patch -Np2 -i ../amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch + # https://bugs.llvm.org/show_bug.cgi?id=48992 + patch -Np2 -i ../force-visibility-of-llvm-Any-to-external.patch + + # https://bugs.archlinux.org/task/70697 + patch -Np2 -i ../llvm-link-with-Bsymbolic-functions.patch + # https://reviews.llvm.org/D102453 + patch -Np2 -i ../add-fno-semantic-interposition.patch } build() { Added: add-fno-semantic-interposition.patch =================================================================== --- add-fno-semantic-interposition.patch (rev 0) +++ add-fno-semantic-interposition.patch 2021-05-27 04:22:12 UTC (rev 947986) @@ -0,0 +1,22 @@ +diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake +--- a/llvm/cmake/modules/HandleLLVMOptions.cmake ++++ b/llvm/cmake/modules/HandleLLVMOptions.cmake +@@ -305,6 +305,17 @@ + # On Windows all code is PIC. MinGW warns if -fPIC is used. + else() + add_flag_or_print_warning("-fPIC" FPIC) ++ # Enable interprocedural optimizations for non-inline functions which would ++ # otherwise be disabled due to GCC -fPIC's default. ++ # ++ # Note: Clang allows IPO for -fPIC so this optimization is less effective. ++ # Older Clang may support -fno-semantic-interposition but it used local ++ # aliases to optimize global variables, which is incompatible with copy ++ # relocations due to -fno-pic. ++ if (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND ++ CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 13)) ++ add_flag_if_supported("-fno-semantic-interposition" FNO_SEMANTIC_INTERPOSITION) ++ endif() + endif() + # GCC for MIPS can miscompile LLVM due to PR37701. + if(CMAKE_COMPILER_IS_GNUCXX AND LLVM_NATIVE_ARCH STREQUAL "Mips" AND + Deleted: amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch =================================================================== --- amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch 2021-05-27 04:21:53 UTC (rev 947985) +++ amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch 2021-05-27 04:22:12 UTC (rev 947986) @@ -1,85 +0,0 @@ -commit b08a140a8fe8d0b0d16a93042b4952d6e34ab913 -Author: Piotr Sobczak <[email protected]> -Date: Wed Jan 27 16:02:49 2021 +0100 - - [AMDGPU] Avoid an illegal operand in si-shrink-instructions - - Before the patch it was possible to trigger a constant bus - violation when folding immediates into a shrunk instruction. - - The patch adds a check to enforce the legality of the new operand. - - Differential Revision: https://reviews.llvm.org/D95527 - -diff --git a/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp b/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp -index 9c6833a7dab6..6c1b16eddc84 100644 ---- a/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp -+++ b/llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp -@@ -84,21 +84,23 @@ static bool foldImmediates(MachineInstr &MI, const SIInstrInfo *TII, - MachineOperand &MovSrc = Def->getOperand(1); - bool ConstantFolded = false; - -- if (MovSrc.isImm() && (isInt<32>(MovSrc.getImm()) || -- isUInt<32>(MovSrc.getImm()))) { -- // It's possible to have only one component of a super-reg defined by -- // a single mov, so we need to clear any subregister flag. -- Src0.setSubReg(0); -- Src0.ChangeToImmediate(MovSrc.getImm()); -- ConstantFolded = true; -- } else if (MovSrc.isFI()) { -- Src0.setSubReg(0); -- Src0.ChangeToFrameIndex(MovSrc.getIndex()); -- ConstantFolded = true; -- } else if (MovSrc.isGlobal()) { -- Src0.ChangeToGA(MovSrc.getGlobal(), MovSrc.getOffset(), -- MovSrc.getTargetFlags()); -- ConstantFolded = true; -+ if (TII->isOperandLegal(MI, Src0Idx, &MovSrc)) { -+ if (MovSrc.isImm() && -+ (isInt<32>(MovSrc.getImm()) || isUInt<32>(MovSrc.getImm()))) { -+ // It's possible to have only one component of a super-reg defined -+ // by a single mov, so we need to clear any subregister flag. -+ Src0.setSubReg(0); -+ Src0.ChangeToImmediate(MovSrc.getImm()); -+ ConstantFolded = true; -+ } else if (MovSrc.isFI()) { -+ Src0.setSubReg(0); -+ Src0.ChangeToFrameIndex(MovSrc.getIndex()); -+ ConstantFolded = true; -+ } else if (MovSrc.isGlobal()) { -+ Src0.ChangeToGA(MovSrc.getGlobal(), MovSrc.getOffset(), -+ MovSrc.getTargetFlags()); -+ ConstantFolded = true; -+ } - } - - if (ConstantFolded) { -diff --git a/llvm/test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir b/llvm/test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir -new file mode 100644 -index 000000000000..7889f437facf ---- /dev/null -+++ b/llvm/test/CodeGen/AMDGPU/shrink-instructions-illegal-fold.mir -@@ -0,0 +1,23 @@ -+# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=si-shrink-instructions --verify-machineinstrs %s -o - | FileCheck %s -+ -+# Make sure immediate folding into V_CNDMASK respects constant bus restrictions. -+--- -+ -+name: shrink_cndmask_illegal_imm_folding -+tracksRegLiveness: true -+body: | -+ bb.0: -+ liveins: $vgpr0, $vgpr1 -+ ; CHECK-LABEL: name: shrink_cndmask_illegal_imm_folding -+ ; CHECK: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 -+ ; CHECK: [[MOV:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 32768, implicit $exec -+ ; CHECK: V_CMP_EQ_U32_e32 0, [[COPY]], implicit-def $vcc, implicit $exec -+ ; CHECK: V_CNDMASK_B32_e32 [[MOV]], killed [[COPY]], implicit $vcc, implicit $exec -+ -+ %0:vgpr_32 = COPY $vgpr0 -+ %1:vgpr_32 = V_MOV_B32_e32 32768, implicit $exec -+ V_CMP_EQ_U32_e32 0, %0:vgpr_32, implicit-def $vcc, implicit $exec -+ %2:vgpr_32 = V_CNDMASK_B32_e64 0, %1:vgpr_32, 0, killed %0:vgpr_32, $vcc, implicit $exec -+ S_NOP 0 -+ -+... Added: force-visibility-of-llvm-Any-to-external.patch =================================================================== --- force-visibility-of-llvm-Any-to-external.patch (rev 0) +++ force-visibility-of-llvm-Any-to-external.patch 2021-05-27 04:22:12 UTC (rev 947986) @@ -0,0 +1,42 @@ +From 3d3abc22b3ef189813a3b9061c2a90ba86a32f44 Mon Sep 17 00:00:00 2001 +From: serge-sans-paille <[email protected]> +Date: Tue, 11 May 2021 20:46:58 +0200 +Subject: [PATCH] Force visibility of llvm::Any to external + +llvm::Any::TypeId::Id relies on the uniqueness of the address of a static +variable defined in a template function. hidden visibility implies vague linkage +for that variable, which does not guarantee the uniqueness of the address across +a binary and a shared library. This totally breaks the implementation of +llvm::Any. + +Ideally, setting visibility to llvm::Any::TypeId::Id should be enough, +unfortunately this doesn't work as expected and we lack time (before 12.0.1 +release) to understand why setting the visibility to llvm::Any does work. + +See https://gcc.gnu.org/wiki/Visibility and +https://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html +for more information on that topic. + +Differential Revision: https://reviews.llvm.org/D101972 +--- + llvm/include/llvm/ADT/Any.h | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/llvm/include/llvm/ADT/Any.h b/llvm/include/llvm/ADT/Any.h +index 15b114f7932d..e513586845a1 100644 +--- a/llvm/include/llvm/ADT/Any.h ++++ b/llvm/include/llvm/ADT/Any.h +@@ -23,7 +23,12 @@ + + namespace llvm { + +-class Any { ++class LLVM_EXTERNAL_VISIBILITY Any { ++ ++ // The `Typeid<T>::Id` static data member below is a globally unique ++ // identifier for the type `T`. It is explicitly marked with default ++ // visibility so that when `-fvisibility=hidden` is used, the loader still ++ // merges duplicate definitions across DSO boundaries. + template <typename T> struct TypeId { static const char Id; }; + + struct StorageBase { Added: llvm-link-with-Bsymbolic-functions.patch =================================================================== --- llvm-link-with-Bsymbolic-functions.patch (rev 0) +++ llvm-link-with-Bsymbolic-functions.patch 2021-05-27 04:22:12 UTC (rev 947986) @@ -0,0 +1,66 @@ +From 4f05f4c8e66bc76b1d94f5283494404382e3bacd Mon Sep 17 00:00:00 2001 +From: Fangrui Song <[email protected]> +Date: Thu, 13 May 2021 13:44:57 -0700 +Subject: [PATCH] [CMake][ELF] Link libLLVM.so and libclang-cpp.so with + -Bsymbolic-functions + +llvm-dev message: https://lists.llvm.org/pipermail/llvm-dev/2021-May/150465.html + +In an ELF shared object, a default visibility defined symbol is preemptible by +default. This creates some missed optimization opportunities. +-Bsymbolic-functions is more aggressive than our current -fvisibility-inlines-hidden +(present since 2012) as it applies to all function definitions. It can + +* avoid PLT for cross-TU function calls && reduce dynamic symbol lookup +* reduce dynamic symbol lookup for taking function addresses and optimize out GOT/TOC on x86-64/ppc64 + +In a -DLLVM_TARGETS_TO_BUILD=X86 build, the number of JUMP_SLOT decreases from 12716 to 1628, and the number of GLOB_DAT decreases from 1918 to 1313 +The built clang with `-DLLVM_LINK_LLVM_DYLIB=on -DCLANG_LINK_CLANG_DYLIB=on` is significantly faster. +See the Linux kernel build result https://bugs.archlinux.org/task/70697 + +Note: the performance of -fno-semantic-interposition -Bsymbolic-functions +libLLVM.so and libclang-cpp.so is close to a PIE binary linking against +`libLLVM*.a` and `libclang*.a`. When the host compiler is Clang, +-Bsymbolic-functions is the major contributor. On x86-64 (with GOTPCRELX) and +ppc64 ELFv2, the GOT/TOC relocations can be optimized. + +Some implication: + +Interposing a subset of functions is no longer supported. +(This is fragile on ELF and unsupported on Mach-O at all. For Mach-O we don't +use `ld -interpose` or `-flat_namespace`) + +Compiling a program which takes the address of any LLVM function with +`{gcc,clang} -fno-pic` and expects the address to equal to the address taken +from libLLVM.so or libclang-cpp.so is unsupported. I am fairly confident that +llvm-project shouldn't have different behaviors depending on such pointer +equality (as we've been using -fvisibility-inlines-hidden which applies to +inline functions for a long time), but if we accidentally do, users should be +aware that they should not make assumption on pointer equality in `-fno-pic` +mode. + +See more on https://maskray.me/blog/2021-05-09-fno-semantic-interposition + +Reviewed By: phosek + +Differential Revision: https://reviews.llvm.org/D102090 +--- + llvm/tools/llvm-shlib/CMakeLists.txt | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt +index b0ee19049e6f..03e1383ec8b4 100644 +--- a/llvm/tools/llvm-shlib/CMakeLists.txt ++++ b/llvm/tools/llvm-shlib/CMakeLists.txt +@@ -50,6 +50,11 @@ if(LLVM_BUILD_LLVM_DYLIB) + # Solaris ld does not accept global: *; so there is no way to version *all* global symbols + set(LIB_NAMES -Wl,--version-script,${LLVM_LIBRARY_DIR}/tools/llvm-shlib/simple_version_script.map ${LIB_NAMES}) + endif() ++ # Optimize function calls for default visibility definitions to avoid PLT and ++ # reduce dynamic relocations. ++ # Note: for -fno-pic default, the address of a function may be different from ++ # inside and outside libLLVM.so. ++ target_link_options(LLVM PRIVATE LINKER:-Bsymbolic-functions) + elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + set(LIB_NAMES -Wl,-all_load ${LIB_NAMES}) + endif()
