diff --git a/programming/build/llvm/actions.py b/programming/build/llvm/actions.py index 3a7e031130..de22f42ebc 100644 --- a/programming/build/llvm/actions.py +++ b/programming/build/llvm/actions.py @@ -19,11 +19,11 @@ NoStrip = ["/usr/lib/clang/%s/lib/linux" % get.srcVERSION()] WorkDir = "llvm-project-%s.src/llvm" % get.srcVERSION() def setup(): - #pisitools.ldflags.add("-fuse-ld=lld") - #pisitools.cflags.remove("-D_FORTIFY_SOURCE=2") - #pisitools.cxxflags.remove("-D_FORTIFY_SOURCE=2") - #shelltools.export("CC", "clang") - #shelltools.export("CXX", "clang++") + pisitools.ldflags.add("-fuse-ld=lld") + pisitools.cflags.remove("-D_FORTIFY_SOURCE=2") + pisitools.cxxflags.remove("-D_FORTIFY_SOURCE=2") + shelltools.export("CC", "clang") + shelltools.export("CXX", "clang++") #if get.buildTYPE() == "emul32": @@ -67,7 +67,7 @@ def setup(): cmaketools.configure("-DCMAKE_BUILD_TYPE=Release \ - -G 'Ninja' \ + -G 'Unix Makefiles' \ %s \ -DLLVM_ENABLE_PROJECTS='%s' \ -DLLVM_LIBDIR_SUFFIX=%s \ @@ -84,13 +84,13 @@ def setup(): def build(): shelltools.cd("build") - shelltools.system("ninja") - #cmaketools.make() + #shelltools.system("ninja") + cmaketools.make() def install(): shelltools.cd("build") - shelltools.system("DESTDIR=%s ninja install" % get.installDIR()) - #cmaketools.rawInstall("DESTDIR=%s" % get.installDIR()) + #shelltools.system("DESTDIR=%s ninja install" % get.installDIR()) + cmaketools.rawInstall("DESTDIR=%s" % get.installDIR()) if get.buildTYPE() == "emul32": pisitools.domove("/emul32/lib32/", "/usr/") diff --git a/programming/build/llvm/files/add-fno-semantic-interposition.patch b/programming/build/llvm/files/add-fno-semantic-interposition.patch new file mode 100644 index 0000000000..af62f5d63f --- /dev/null +++ b/programming/build/llvm/files/add-fno-semantic-interposition.patch @@ -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 + diff --git a/programming/build/llvm/files/force-visibility-of-llvm-Any-to-external.patch b/programming/build/llvm/files/force-visibility-of-llvm-Any-to-external.patch new file mode 100644 index 0000000000..46464fded7 --- /dev/null +++ b/programming/build/llvm/files/force-visibility-of-llvm-Any-to-external.patch @@ -0,0 +1,42 @@ +From 3d3abc22b3ef189813a3b9061c2a90ba86a32f44 Mon Sep 17 00:00:00 2001 +From: serge-sans-paille +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::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 struct TypeId { static const char Id; }; + + struct StorageBase { diff --git a/programming/build/llvm/files/llvm-link-with-Bsymbolic-functions.patch b/programming/build/llvm/files/llvm-link-with-Bsymbolic-functions.patch new file mode 100644 index 0000000000..b8e2e40e17 --- /dev/null +++ b/programming/build/llvm/files/llvm-link-with-Bsymbolic-functions.patch @@ -0,0 +1,66 @@ +From 4f05f4c8e66bc76b1d94f5283494404382e3bacd Mon Sep 17 00:00:00 2001 +From: Fangrui Song +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() diff --git a/programming/build/llvm/pspec.xml b/programming/build/llvm/pspec.xml index 654ed0c8c4..bfaff149ad 100755 --- a/programming/build/llvm/pspec.xml +++ b/programming/build/llvm/pspec.xml @@ -11,7 +11,7 @@ NCSA The Low Level Virtual Machine The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines, though it does provide helpful libraries that can be used to build them. - https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/llvm-project-11.1.0.src.tar.xz + https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/llvm-project-12.0.0.src.tar.xz ninja zlib-devel @@ -25,20 +25,20 @@ cmake python3-devel - binutils - gcc - + llvm llvm-clang-devel lld - llvm-polly + llvm-polly - 0001-SystemZ-Use-LA-instead-of-AGR-in-eliminateFrameIndex.patch - amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch - + add-fno-semantic-interposition.patch + force-visibility-of-llvm-Any-to-external.patch + llvm-link-with-Bsymbolic-functions.patch @@ -278,7 +278,7 @@ /usr/lib/cmake/polly - +