diff --git a/0001-Backport-Handle-data-at-the-beginning-of-a-function.patch b/0001-Backport-Handle-data-at-the-beginning-of-a-function.patch deleted file mode 100644 index b0bcb8a2b517e7ae93c8982fe5e1bf9b1f2f8557..0000000000000000000000000000000000000000 --- a/0001-Backport-Handle-data-at-the-beginning-of-a-function.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 963d19d86cca708957055f3072cbe8473c8e52e3 Mon Sep 17 00:00:00 2001 -From: xiongzhou4 -Date: Thu, 15 Jun 2023 20:34:42 +0800 -Subject: [PATCH] [Backport] [BOLT] [AArch64] Handle data at the beginning of a - function when disassembling and building CFG. - ---- - bolt/src/BinaryFunction.cpp | 11 +++++++---- - bolt/src/BinaryFunction.h | 9 +++++++++ - bolt/src/Exceptions.cpp | 2 +- - bolt/test/AArch64/data-at-0-offset.c | 17 +++++++++++++++++ - 4 files changed, 34 insertions(+), 5 deletions(-) - create mode 100644 bolt/test/AArch64/data-at-0-offset.c - -diff --git a/bolt/src/BinaryFunction.cpp b/bolt/src/BinaryFunction.cpp -index 9414b83ad..93de63d3f 100644 ---- a/bolt/src/BinaryFunction.cpp -+++ b/bolt/src/BinaryFunction.cpp -@@ -1445,6 +1445,9 @@ add_instruction: - addInstruction(Offset, std::move(Instruction)); - } - -+ if (uint64_t Offset = getFirstInstructionOffset()) -+ Labels[Offset] = BC.Ctx->createNamedTempSymbol(); -+ - clearList(Relocations); - - if (!IsSimple) { -@@ -1987,7 +1990,7 @@ bool BinaryFunction::buildCFG(MCPlusBuilder::AllocatorIdTy AllocatorId) { - return false; - - assert(BasicBlocks.empty() && "basic block list should be empty"); -- assert((Labels.find(0) != Labels.end()) && -+ assert((Labels.find(getFirstInstructionOffset()) != Labels.end()) && - "first instruction should always have a label"); - - // Create basic blocks in the original layout order: -@@ -2087,9 +2090,9 @@ bool BinaryFunction::buildCFG(MCPlusBuilder::AllocatorIdTy AllocatorId) { - updateOffset(LastInstrOffset); - } - } -- if (Offset == 0) { -- // Add associated CFI pseudos in the first offset (0) -- addCFIPlaceholders(0, InsertBB); -+ if (Offset == getFirstInstructionOffset()) { -+ // Add associated CFI pseudos in the first offset. -+ addCFIPlaceholders(Offset, InsertBB); - } - - const bool IsBlockEnd = MIB->isTerminator(Instr); -diff --git a/bolt/src/BinaryFunction.h b/bolt/src/BinaryFunction.h -index a824f3d58..3b435cfb3 100644 ---- a/bolt/src/BinaryFunction.h -+++ b/bolt/src/BinaryFunction.h -@@ -967,6 +967,15 @@ public: - return const_cast(this)->getInstructionAtOffset(Offset); - } - -+ /// Return offset for the first instruction. If there is data at the -+ /// beginning of a function then offset of the first instruction could -+ /// be different from 0. -+ uint64_t getFirstInstructionOffset() const { -+ if (Instructions.empty()) -+ return 0; -+ return Instructions.begin()->first; -+ } -+ - /// Return jump table that covers a given \p Address in memory. - JumpTable *getJumpTableContainingAddress(uint64_t Address) { - auto JTI = JumpTables.upper_bound(Address); -diff --git a/bolt/src/Exceptions.cpp b/bolt/src/Exceptions.cpp -index f73054aa8..0a64e3fca 100644 ---- a/bolt/src/Exceptions.cpp -+++ b/bolt/src/Exceptions.cpp -@@ -499,7 +499,7 @@ bool CFIReaderWriter::fillCFIInfoFor(BinaryFunction &Function) const { - Optional LSDA = CurFDE.getLSDAAddress(); - Function.setLSDAAddress(LSDA ? *LSDA : 0); - -- uint64_t Offset = 0; -+ uint64_t Offset = Function.getFirstInstructionOffset(); - uint64_t CodeAlignment = CurFDE.getLinkedCIE()->getCodeAlignmentFactor(); - uint64_t DataAlignment = CurFDE.getLinkedCIE()->getDataAlignmentFactor(); - if (CurFDE.getLinkedCIE()->getPersonalityAddress()) { -diff --git a/bolt/test/AArch64/data-at-0-offset.c b/bolt/test/AArch64/data-at-0-offset.c -new file mode 100644 -index 000000000..e0c689a19 ---- /dev/null -+++ b/bolt/test/AArch64/data-at-0-offset.c -@@ -0,0 +1,17 @@ -+// RUN: %clang %cflags -O2 -fPIE -Wl,-q -pie %s -o %t.exe -+// RUN: llvm-bolt %t.exe -o %t.bolt 2>&1 | FileCheck %s -+// CHECK-NOT: BOLT-WARNING: unable to disassemble instruction at offset -+ -+void extra_space() { -+ asm volatile(".rept 256\n" -+ " .byte 0xff\n" -+ ".endr\n"); -+ return; -+} -+ -+int main(int argc, char **argv) { -+ void (*fn)(void); -+ fn = extra_space + 256; -+ fn(); -+ return 0; -+} --- -2.33.0 - diff --git a/llvm-bolt.spec b/llvm-bolt.spec index 9f1c068af202f80b66e5a22fe680ab24165b5513..d80e490aa545a7e015875158fa4b63221a1d1b95 100644 --- a/llvm-bolt.spec +++ b/llvm-bolt.spec @@ -1,61 +1,152 @@ +%bcond_with check + +%global maj_ver 15 +%global min_ver 0 +%global patch_ver 7 +%global bolt_version %{maj_ver}.%{min_ver}.%{patch_ver} +%global bolt_srcdir llvm-project-%{bolt_version}.src + +%global install_prefix %{_prefix} + +%global install_bindir %{install_prefix}/bin +%global install_libdir %{install_prefix}/lib +%global install_docdir %{install_prefix}/share/doc +%global max_link_jobs 2 + Name: llvm-bolt -Version: 0 -Release: 2.20211016.gitb72f753 +Version: %{bolt_version} +Release: 1 Summary: BOLT is a post-link optimizer developed to speed up large applications License: Apache 2.0 -URL: https://github.com/facebookincubator/BOLT -Source0: %{name}-%{version}.tar.xz +URL: https://github.com/llvm/llvm-project/tree/main/bolt + +Source0: https://github.com/llvm/llvm-project/releases/download/llvmorg-%{bolt_version}/%{bolt_srcdir}.tar.xz + +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: cmake +BuildRequires: ninja-build +BuildRequires: zlib-devel +BuildRequires: python3-lit +BuildRequires: python3-psutil +BuildRequires: doxygen -BuildRequires: gcc gcc-c++ cmake ninja-build libstdc++-static chrpath ncurses-devel zlib-devel -Requires: glibc zlib ncurses-libs libstdc++ libgcc -Patch1: 0001-Backport-Handle-data-at-the-beginning-of-a-function.patch %description BOLT is a post-link optimizer developed to speed up large applications. It achieves the improvements by optimizing application's code layout based on execution profile gathered by sampling profiler, such as Linux perf tool. +%package doc +Summary: Documentation for BOLT +BuildArch: noarch +Requires: %{name} = %{version}-%{release} + +%description doc +Documentation for the BOLT optimizer + %prep -%autosetup -p1 -mkdir -p _build -cd _build -%{__cmake} -G Ninja ../llvm -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_ASSERTIONS=ON \ - -DLLVM_ENABLE_PROJECTS="clang;lld;bolt" -DCMAKE_INSTALL_PREFIX=%{_usr} \ - -DLLVM_PARALLEL_LINK_JOBS=1 \ +%autosetup -n %{bolt_srcdir} -p1 + +%build +%{cmake} -G Ninja -S llvm \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX=%{install_prefix} \ + -DCMAKE_SKIP_RPATH=ON \ + -DLLVM_DIR=%{install_libdir}/cmake/llvm \ + -DLLVM_TABLEGEN_EXE=%{install_bindir}/llvm-tblgen \ + -DLLVM_BUILD_UTILS:BOOL=ON \ + -DBOLT_INCLUDE_DOCS:BOOL=ON \ + -DLLVM_INCLUDE_TESTS:BOOL=ON \ + -DBUILD_SHARED_LIBS:BOOL=OFF \ + -DLLVM_LINK_LLVM_DYLIB:BOOL=OFF \ + -DLLVM_ENABLE_ASSERTIONS=ON \ + -DBOLT_INCLUDE_TESTS:BOOL=ON \ + -DLLVM_EXTERNAL_LIT=%{_bindir}/lit \ + -DLLVM_ENABLE_PROJECTS="bolt" \ + -DLLVM_PARALLEL_LINK_JOBS=%{max_link_jobs} \ %ifarch %ix86 x86_64 - -DLLVM_TARGETS_TO_BUILD="X86" + -DLLVM_TARGETS_TO_BUILD="X86" %endif %ifarch aarch64 - -DLLVM_TARGETS_TO_BUILD="AArch64" + -DLLVM_TARGETS_TO_BUILD="AArch64" %endif -%build -cd _build -%{ninja_build} +%ninja_build bolt %install -%{ninja_install} -C _build -%global _bolt_install_dir %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}/usr -# remove extera llvm files. -find %{_bolt_install_dir} ! -name "llvm-bolt" ! -name "merge-fdata" ! -name "perf2bolt" -type f,l -exec rm -f '{}' \; -# remove static libs. -rm -rf %{_buildrootdir}/root -# remove rpath -chrpath -d %{_bolt_install_dir}/bin/llvm-bolt -chrpath -d %{_bolt_install_dir}/bin/merge-fdata +%ninja_install bolt + +# Remove extera llvm files. +find %{buildroot}%{install_prefix} \ + ! -name "llvm-bolt" \ + ! -name "merge-fdata" \ + ! -name "perf2bolt" \ + ! -name "llvm-boltdiff" \ + ! -name "llvm-bolt-heatmap" \ + ! -name "libbolt_rt_hugify.a" \ + ! -name "libbolt_rt_instr.a" \ + -type f,l -exec rm -f '{}' \; + +# +rm -f %{_builddir}/%{bolt_srcdir}/lib/lib*.a + +# There currently is not support upstream for building html doc from BOLT +install -d %{buildroot}%{install_docdir} +mv bolt/README.md bolt/docs/*.md %{buildroot}%{install_docdir} + +%check + +%if %{with check} +%ifarch x86_64 +# Bolt makes incorrect assumptions on the location of libbolt_rt_*.a. +mkdir -p %{_builddir}/%{bolt_srcdir}/lib +for rt in libbolt_rt_instr libbolt_rt_hugify +do + ln -s %{buildroot}/%{install_libdir}/${rt}.a %{_builddir}/%{bolt_srcdir}/lib +done +%endif + +%ifarch aarch64 +# Failing test cases on aarch64 +rm bolt/test/cache+-deprecated.test bolt/test/bolt-icf.test bolt/test/R_ABS.pic.lld.cpp +%endif + +export LD_LIBRARY_PATH=%{_builddir}/%{bolt_srcdir}/lib +export DESTDIR=%{buildroot} +%ninja_build check + +# Remove files installed during the check phase. +rm -f %{buildroot}/%{_builddir}/%{bolt_srcdir}/lib/lib*.a +%endif %files %license bolt/LICENSE.TXT -%doc bolt/docs/* -%exclude %{_includedir}/* -%exclude %{_datadir}/* -%exclude %{_builddir}/%{name}-%{version}/_build/* -%attr(0755,root,root) %{_bindir}/llvm-bolt -%attr(0755,root,root) %{_bindir}/merge-fdata -%attr(-,root,root) %{_bindir}/perf2bolt +%{install_bindir}/llvm-bolt +%{install_bindir}/llvm-boltdiff +%{install_bindir}/merge-fdata +%{install_bindir}/perf2bolt +%{install_bindir}/llvm-bolt-heatmap + +%ifarch x86_64 +%{install_libdir}/libbolt_rt_hugify.a +%{install_libdir}/libbolt_rt_instr.a +%endif + +%exclude %{_builddir}/%{bolt_srcdir}/lib/* + +%files doc +%doc %{install_docdir} + %changelog +* Thu Aug 31 2023 zhenyu zhao 15.0.7-1 +- Type:Update +- ID:NA +- SUG:NA +- DESC: Update llvm-bolt from llvm-bolt to llvm-bolt-15 + * Thu Jun 15 2023 Xiong Zhou 0-2.20211016.gitb72f753 - Type:backport - ID:NA @@ -72,4 +163,5 @@ chrpath -d %{_bolt_install_dir}/bin/merge-fdata - Type:Init - ID:NA - SUG:NA -- DESC:Init llvm-bolt repository +- DESC:Init llvm-bolt repository + diff --git a/llvm-bolt-0.tar.xz b/llvm-project-15.0.7.src.tar.xz similarity index 81% rename from llvm-bolt-0.tar.xz rename to llvm-project-15.0.7.src.tar.xz index 9936e2322e725547ff5f963ab08463160f72c3da..7bc21504b4b3827c22e460f5c3ecd78b5b4bf67d 100644 Binary files a/llvm-bolt-0.tar.xz and b/llvm-project-15.0.7.src.tar.xz differ