llvm 12.0.0

This commit is contained in:
Idris Kalp
2021-06-05 00:05:01 +03:00
parent 7f33ace299
commit cf574378fa
5 changed files with 156 additions and 19 deletions
+10 -10
View File
@@ -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/")
@@ -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
@@ -0,0 +1,42 @@
From 3d3abc22b3ef189813a3b9061c2a90ba86a32f44 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton@redhat.com>
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 {
@@ -0,0 +1,66 @@
From 4f05f4c8e66bc76b1d94f5283494404382e3bacd Mon Sep 17 00:00:00 2001
From: Fangrui Song <i@maskray.me>
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()
+16 -9
View File
@@ -11,7 +11,7 @@
<License>NCSA</License>
<Summary>The Low Level Virtual Machine</Summary>
<Description>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.</Description>
<Archive sha1sum="713a5f9ce67713c2b955f9c016b4f96afa4162f1" type="tarxz">https://github.com/llvm/llvm-project/releases/download/llvmorg-11.1.0/llvm-project-11.1.0.src.tar.xz</Archive>
<Archive sha1sum="b84b53e788926d1b13c1bb9f289edb62862959c4" type="tarxz">https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/llvm-project-12.0.0.src.tar.xz</Archive>
<BuildDependencies>
<Dependency>ninja</Dependency>
<Dependency>zlib-devel</Dependency>
@@ -25,20 +25,20 @@
<Dependency versionFrom="3.18.3">cmake</Dependency>
<Dependency versionFrom="3.8.6">python3-devel</Dependency>
<!-- Use new plugin-api.h header file from binutils to enable LLVM gold plugin -->
<Dependency>binutils</Dependency>
<Dependency>gcc</Dependency>
<!--Dependency>llvm</Dependency>
<!--<Dependency>binutils</Dependency>
<Dependency>gcc</Dependency>-->
<Dependency>llvm</Dependency>
<Dependency>llvm-clang-devel</Dependency>
<Dependency>lld</Dependency>
<Dependency>llvm-polly</Dependency-->
<Dependency>llvm-polly</Dependency>
</BuildDependencies>
<!--<AdditionalFiles>
<AdditionalFile owner="root" permission="0644" target="../support-linking-ScopPassManager-against-LLVM-dylib.patch">support-linking-ScopPassManager-against-LLVM-dylib.patch</AdditionalFile>
</AdditionalFiles>-->
<Patches>
<Patch level="2">0001-SystemZ-Use-LA-instead-of-AGR-in-eliminateFrameIndex.patch</Patch>
<Patch level="2">amdgpu-avoid-an-illegal-operand-in-si-shrink-instr.patch</Patch>
<!-- <Patch>stack-clash-fixes.patch</Patch> -->
<Patch level="2">add-fno-semantic-interposition.patch</Patch>
<Patch level="2">force-visibility-of-llvm-Any-to-external.patch</Patch>
<Patch level="2">llvm-link-with-Bsymbolic-functions.patch</Patch>
</Patches>
</Source>
@@ -278,7 +278,7 @@
<Path fileType="data">/usr/lib/cmake/polly</Path>
</Files>
</Package>
<!--Package>
<Name>llvm-docs</Name>
<PartOf>programming.docs</PartOf>
@@ -318,6 +318,13 @@
</Package>
<History>
<Update release="16">
<Date>2021-06-03</Date>
<Version>12.0.0</Version>
<Comment>Version bump.</Comment>
<Name>İdris Kalp</Name>
<Email>idriskalp@gmail.com</Email>
</Update>
<Update release="15">
<Date>2021-05-15</Date>
<Version>11.1.0</Version>