* add llvm18

This commit is contained in:
Alexander Baldeck 2025-01-27 13:28:48 +01:00
parent b3f0064c75
commit a7798f6b88
10 changed files with 606 additions and 0 deletions

51
llvm18/.SRCINFO Normal file
View File

@ -0,0 +1,51 @@
pkgbase = llvm18
pkgver = 18.1.8
pkgrel = 1
url = https://llvm.org/
arch = x86_64
license = Apache-2.0 WITH LLVM-exception
checkdepends = python-psutil
makedepends = cmake
makedepends = ninja
makedepends = zlib
makedepends = zstd
makedepends = curl
makedepends = libffi
makedepends = libedit
makedepends = ncurses
makedepends = libxml2
makedepends = python
options = staticlibs
options = !lto
source = https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/llvm-18.1.8.src.tar.xz
source = https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/llvm-18.1.8.src.tar.xz.sig
source = https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/cmake-18.1.8.src.tar.xz
source = https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/cmake-18.1.8.src.tar.xz.sig
source = https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/third-party-18.1.8.src.tar.xz
source = https://github.com/llvm/llvm-project/releases/download/llvmorg-18.1.8/third-party-18.1.8.src.tar.xz.sig
source = llvm-SelectionDAG.patch
validpgpkeys = 474E22316ABF4785A88C6E8EA2C794A986419D8A
validpgpkeys = D574BD5D1D0E98895E3BF90044F2485E45D59042
sha256sums = f68cf90f369bc7d0158ba70d860b0cb34dbc163d6ff0ebc6cfa5e515b9b2e28d
sha256sums = SKIP
sha256sums = 59badef592dd34893cd319d42b323aaa990b452d05c7180ff20f23ab1b41e837
sha256sums = SKIP
sha256sums = b76b810f3d3dc5d08e83c4236cb6e395aa9bd5e3ea861e8c319b216d093db074
sha256sums = SKIP
sha256sums = 9b53e584f8b8a44648a2a066da1860155b61118c8cdebed3632161db0b680462
pkgname = llvm18
pkgdesc = Compiler infrastructure (LLVM 18)
depends = llvm18-libs
depends = curl
depends = perl
pkgname = llvm18-libs
pkgdesc = LLVM 18 runtime libraries
depends = gcc-libs
depends = zlib
depends = zstd
depends = libffi
depends = libedit
depends = ncurses
depends = libxml2

173
llvm18/PKGBUILD Normal file
View File

@ -0,0 +1,173 @@
# POWER Maintainer: Alexander Baldeck <alex.bldck@gmail.com>
# Maintainer: Evangelos Foutras <foutrelis@archlinux.org>
pkgname=('llvm18' 'llvm18-libs')
pkgver=18.1.8
pkgrel=1
arch=(x86_64 powerpc64le powerpc64 powerpc riscv64)
url="https://llvm.org/"
license=('Apache-2.0 WITH LLVM-exception')
makedepends=('cmake' 'ninja' 'zlib' 'zstd' 'curl' 'libffi' 'libedit' 'ncurses'
'libxml2' 'python')
checkdepends=('python-psutil')
options=('staticlibs' '!lto') # tools/llvm-shlib/typeids.test fails with LTO
_source_base=https://github.com/llvm/llvm-project/releases/download/llvmorg-$pkgver
source=($_source_base/llvm-$pkgver.src.tar.xz{,.sig}
$_source_base/cmake-$pkgver.src.tar.xz{,.sig}
$_source_base/third-party-$pkgver.src.tar.xz{,.sig}
llvm-SelectionDAG.patch
llvm-ppc64-elfv2.patch
dyld-elf-ppc32.patch
ppc-gcc-bug.patch
macho32.patch)
sha256sums=('f68cf90f369bc7d0158ba70d860b0cb34dbc163d6ff0ebc6cfa5e515b9b2e28d'
'SKIP'
'59badef592dd34893cd319d42b323aaa990b452d05c7180ff20f23ab1b41e837'
'SKIP'
'b76b810f3d3dc5d08e83c4236cb6e395aa9bd5e3ea861e8c319b216d093db074'
'SKIP'
'9b53e584f8b8a44648a2a066da1860155b61118c8cdebed3632161db0b680462'
'8c4e8db0b80b1a86f8cff9aa678b70458503bc8926ecc41e0df953ea14ab3559'
'fe0277358d7a9bdfda236f9e6d74c43d458384a0c9d5db75bf2874b9a1d761f6'
'18d3c415474e937fc73ad4173506250495385025af168a0c270d3c202aedbab5'
'a2ba322576fdea8d0c317d0ad372d224009b2d090b86ed9d0f566efb1d238827')
validpgpkeys=('474E22316ABF4785A88C6E8EA2C794A986419D8A' # Tom Stellard <tstellar@redhat.com>
'D574BD5D1D0E98895E3BF90044F2485E45D59042') # Tobias Hieta <tobias@hieta.se>
# Utilizing LLVM_DISTRIBUTION_COMPONENTS to avoid
# installing static libraries; inspired by Gentoo
_get_distribution_components() {
local target
ninja -t targets | grep -Po 'install-\K.*(?=-stripped:)' | while read -r target; do
case $target in
llvm-libraries|distribution)
continue
;;
# shared libraries
LLVM|LLVMgold)
;;
# libraries needed for clang-tblgen
LLVMDemangle|LLVMSupport|LLVMTableGen)
;;
# used by lldb
LLVMDebuginfod)
;;
# testing libraries
LLVMTestingAnnotations|LLVMTestingSupport)
;;
# exclude static libraries
LLVM*)
continue
;;
# exclude llvm-exegesis (doesn't seem useful without libpfm)
llvm-exegesis)
continue
;;
esac
echo $target
done
}
prepare() {
rename -v -- "-$pkgver.src" '' {cmake,third-party}-$pkgver.src
cd llvm-$pkgver.src
mkdir build
# we use elfv2 on powerpc64
patch -Np2 -i ${srcdir}/llvm-ppc64-elfv2.patch
# Adelie fixes, they're awesome too!
patch -Np1 -i ${srcdir}/dyld-elf-ppc32.patch
patch -Np1 -i ${srcdir}/ppc-gcc-bug.patch
patch -Np1 -i ${srcdir}/macho32.patch
# https://github.com/llvm/llvm-project/issues/82431
sed '/^diff.*inline-asm-memop.ll/,$d' ../$pkgname-SelectionDAG.patch | patch -Np2
# Remove CMake find module for zstd; breaks if out of sync with upstream zstd
rm cmake/modules/Findzstd.cmake
}
build() {
cd llvm-$pkgver.src/build
# Build only minimal debug info to reduce size
CFLAGS=${CFLAGS/-g /-g1 }
CXXFLAGS=${CXXFLAGS/-g /-g1 }
local cmake_args=(
-G Ninja
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=/usr/lib/llvm18
-DCMAKE_SKIP_RPATH=ON
-DLLVM_BINUTILS_INCDIR=/usr/include
-DLLVM_BUILD_LLVM_DYLIB=ON
-DLLVM_BUILD_TESTS=ON
-DLLVM_ENABLE_BINDINGS=OFF
-DLLVM_ENABLE_CURL=ON
-DLLVM_ENABLE_FFI=ON
-DLLVM_ENABLE_RTTI=ON
-DLLVM_HOST_TRIPLE=$CHOST
-DLLVM_INCLUDE_BENCHMARKS=OFF
-DLLVM_INSTALL_GTEST=ON
-DLLVM_INSTALL_UTILS=ON
-DLLVM_LINK_LLVM_DYLIB=ON
-DLLVM_USE_PERF=ON
)
cmake .. "${cmake_args[@]}"
local distribution_components=$(_get_distribution_components | paste -sd\;)
test -n "$distribution_components"
cmake_args+=(-DLLVM_DISTRIBUTION_COMPONENTS="$distribution_components")
cmake .. "${cmake_args[@]}"
ninja
}
check() {
cd llvm-$pkgver.src/build
LD_LIBRARY_PATH=$PWD/lib ninja check
}
package_llvm18() {
pkgdesc="Compiler infrastructure (LLVM 18)"
depends=('llvm18-libs' 'curl' 'perl')
cd llvm-$pkgver.src/build
DESTDIR="$pkgdir" ninja install-distribution
# The runtime libraries go into llvm18-libs
local _llvm_lib
for _llvm_lib in "libLLVM-${pkgver%%.*}.so" "libLLVM.so.${pkgver%.*}" LLVMgold.so; do
mv -f "$pkgdir/usr/lib/llvm18/lib/$_llvm_lib" "$srcdir/"
done
# Create versioned symlinks from /usr/bin/ to /usr/lib/llvm18/bin/
install -d "$pkgdir/usr/bin"
local _binary
for _binary in "$pkgdir"/usr/lib/llvm18/bin/*; do
local _basename=${_binary##*/}
ln -s "../lib/llvm18/bin/$_basename" "$pkgdir/usr/bin/$_basename-18"
done
install -Dm644 ../LICENSE.TXT "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
package_llvm18-libs() {
pkgdesc="LLVM 18 runtime libraries"
depends=('gcc-libs' 'zlib' 'zstd' 'libffi' 'libedit' 'ncurses' 'libxml2')
install -d "$pkgdir/usr/lib/llvm18/lib"
local _llvm_lib
for _llvm_lib in "libLLVM-${pkgver%%.*}.so" "libLLVM.so.${pkgver%.*}"; do
cp -P "$srcdir/$_llvm_lib" "$pkgdir/usr/lib/"
ln -s "../../$_llvm_lib" "$pkgdir/usr/lib/llvm18/lib/"
done
cp -P "$srcdir/LLVMgold.so" "$pkgdir/usr/lib/llvm18/lib/"
install -Dm644 "$srcdir/llvm-$pkgver.src/LICENSE.TXT" \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
# vim:set ts=2 sw=2 et:

View File

@ -0,0 +1,24 @@
Author: A. Wilcox <awilfox@adelielinux.org>
Upstream-Status: Pending
This implements the R_PPC_REL32 relocation type, which is needed for the
OrcJIT to work properly on 32-bit PowerPC.
Needs more tests before submitting upstream, but seems to DTRT.
--- llvm-14.0.6.src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp.old 2022-06-22 16:46:24.000000000 +0000
+++ llvm-14.0.6.src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp 2022-11-28 06:33:12.239921624 +0000
@@ -830,6 +830,13 @@
case ELF::R_PPC_ADDR16_HA:
writeInt16BE(LocalAddress, applyPPCha(Value + Addend));
break;
+ case ELF::R_PPC_REL32:
+ uint32_t FinalAddress = Section.getLoadAddressWithOffset(Offset);
+ int64_t delta = static_cast<int64_t>(Value - FinalAddress + Addend);
+ if (SignExtend64<32>(delta) != delta)
+ llvm_unreachable("Relocation R_PPC_REL32 overflow");
+ writeInt32BE(LocalAddress, delta);
+ break;
}
}

12
llvm18/find-cmake.patch Normal file
View File

@ -0,0 +1,12 @@
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -9,7 +9,9 @@
"at least 3.20.0 now to avoid issues in the future!")
endif()
-set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
+if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
+ set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
+endif()
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
NO_POLICY_SCOPE)

View File

@ -0,0 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
ALDpP6vzpYVqnK5T
=+9jG
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,41 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
9RmlwZlOTFGcWBYl/cfRONn9qi9a6w==
=Lvw+
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -0,0 +1,187 @@
From 46505b3cbfc5f48f28431b9141085c5d71ddf1c4 Mon Sep 17 00:00:00 2001
From: RicoAfoat <51285519+RicoAfoat@users.noreply.github.com>
Date: Tue, 16 Jul 2024 19:46:32 +0800
Subject: [PATCH] [SelectionDAG] use HandleSDNode instead of SDValue during
SelectInlineAsmMemoryOperands (#85081)
SelectInlineAsmMemoryOperands - change the vector of SDValue into a list of SDNodeHandle. Fixes issues where x86 might call replaceAllUses when matching address.
Fixes https://github.com/llvm/llvm-project/issues/82431 - see https://github.com/llvm/llvm-project/issues/82431 for more information.
---
.../CodeGen/SelectionDAG/SelectionDAGISel.cpp | 43 +++++++------
llvm/test/CodeGen/X86/inline-asm-memop.ll | 64 ++++++++++++++++---
2 files changed, 80 insertions(+), 27 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index ecdbf3e963b835..df3d207d85d351 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -2220,24 +2220,27 @@ bool SelectionDAGISel::CheckOrMask(SDValue LHS, ConstantSDNode *RHS,
/// by tblgen. Others should not call it.
void SelectionDAGISel::SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
const SDLoc &DL) {
- std::vector<SDValue> InOps;
- std::swap(InOps, Ops);
+ // Change the vector of SDValue into a list of SDNodeHandle for x86 might call
+ // replaceAllUses when matching address.
- Ops.push_back(InOps[InlineAsm::Op_InputChain]); // 0
- Ops.push_back(InOps[InlineAsm::Op_AsmString]); // 1
- Ops.push_back(InOps[InlineAsm::Op_MDNode]); // 2, !srcloc
- Ops.push_back(InOps[InlineAsm::Op_ExtraInfo]); // 3 (SideEffect, AlignStack)
+ std::list<HandleSDNode> Handles;
- unsigned i = InlineAsm::Op_FirstOperand, e = InOps.size();
- if (InOps[e-1].getValueType() == MVT::Glue)
+ Handles.emplace_back(Ops[InlineAsm::Op_InputChain]); // 0
+ Handles.emplace_back(Ops[InlineAsm::Op_AsmString]); // 1
+ Handles.emplace_back(Ops[InlineAsm::Op_MDNode]); // 2, !srcloc
+ Handles.emplace_back(
+ Ops[InlineAsm::Op_ExtraInfo]); // 3 (SideEffect, AlignStack)
+
+ unsigned i = InlineAsm::Op_FirstOperand, e = Ops.size();
+ if (Ops[e - 1].getValueType() == MVT::Glue)
--e; // Don't process a glue operand if it is here.
while (i != e) {
- InlineAsm::Flag Flags(InOps[i]->getAsZExtVal());
+ InlineAsm::Flag Flags(Ops[i]->getAsZExtVal());
if (!Flags.isMemKind() && !Flags.isFuncKind()) {
// Just skip over this operand, copying the operands verbatim.
- Ops.insert(Ops.end(), InOps.begin() + i,
- InOps.begin() + i + Flags.getNumOperandRegisters() + 1);
+ Handles.insert(Handles.end(), Ops.begin() + i,
+ Ops.begin() + i + Flags.getNumOperandRegisters() + 1);
i += Flags.getNumOperandRegisters() + 1;
} else {
assert(Flags.getNumOperandRegisters() == 1 &&
@@ -2247,10 +2250,10 @@ void SelectionDAGISel::SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
if (Flags.isUseOperandTiedToDef(TiedToOperand)) {
// We need the constraint ID from the operand this is tied to.
unsigned CurOp = InlineAsm::Op_FirstOperand;
- Flags = InlineAsm::Flag(InOps[CurOp]->getAsZExtVal());
+ Flags = InlineAsm::Flag(Ops[CurOp]->getAsZExtVal());
for (; TiedToOperand; --TiedToOperand) {
CurOp += Flags.getNumOperandRegisters() + 1;
- Flags = InlineAsm::Flag(InOps[CurOp]->getAsZExtVal());
+ Flags = InlineAsm::Flag(Ops[CurOp]->getAsZExtVal());
}
}
@@ -2258,7 +2261,7 @@ void SelectionDAGISel::SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
std::vector<SDValue> SelOps;
const InlineAsm::ConstraintCode ConstraintID =
Flags.getMemoryConstraintID();
- if (SelectInlineAsmMemoryOperand(InOps[i+1], ConstraintID, SelOps))
+ if (SelectInlineAsmMemoryOperand(Ops[i + 1], ConstraintID, SelOps))
report_fatal_error("Could not match memory address. Inline asm"
" failure!");
@@ -2267,15 +2270,19 @@ void SelectionDAGISel::SelectInlineAsmMemoryOperands(std::vector<SDValue> &Ops,
: InlineAsm::Kind::Func,
SelOps.size());
Flags.setMemConstraint(ConstraintID);
- Ops.push_back(CurDAG->getTargetConstant(Flags, DL, MVT::i32));
- llvm::append_range(Ops, SelOps);
+ Handles.emplace_back(CurDAG->getTargetConstant(Flags, DL, MVT::i32));
+ Handles.insert(Handles.end(), SelOps.begin(), SelOps.end());
i += 2;
}
}
// Add the glue input back if present.
- if (e != InOps.size())
- Ops.push_back(InOps.back());
+ if (e != Ops.size())
+ Handles.emplace_back(Ops.back());
+
+ Ops.clear();
+ for (auto &handle : Handles)
+ Ops.push_back(handle.getValue());
}
/// findGlueUse - Return use of MVT::Glue value produced by the specified
diff --git a/llvm/test/CodeGen/X86/inline-asm-memop.ll b/llvm/test/CodeGen/X86/inline-asm-memop.ll
index 83442498076102..01fe2e4bd99a86 100644
--- a/llvm/test/CodeGen/X86/inline-asm-memop.ll
+++ b/llvm/test/CodeGen/X86/inline-asm-memop.ll
@@ -1,20 +1,47 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -O0 < %s | FileCheck %s
+; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
; A bug in X86DAGToDAGISel::matchAddressRecursively create a zext SDValue which
; is quickly replaced by other SDValue but already pushed into vector for later
; calling for SelectionDAGISel::Select_INLINEASM getNode builder, see issue
; 82431 for more infomation.
-define void @PR82431(i8 %call, ptr %b) {
-; CHECK-LABEL: PR82431:
+define i64 @PR82431_0(i8 %call, ptr %b) {
+; CHECK-LABEL: PR82431_0:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: movb %dil, %al
-; CHECK-NEXT: addb $1, %al
-; CHECK-NEXT: movzbl %al, %eax
-; CHECK-NEXT: # kill: def $rax killed $eax
-; CHECK-NEXT: shlq $3, %rax
-; CHECK-NEXT: addq %rax, %rsi
+; CHECK-NEXT: movzbl %dil, %eax
+; CHECK-NEXT: movq 8(%rsi,%rax,8), %rax
+; CHECK-NEXT: retq
+entry:
+ %narrow = add nuw i8 %call, 1
+ %idxprom = zext i8 %narrow to i64
+ %arrayidx = getelementptr [1 x i64], ptr %b, i64 0, i64 %idxprom
+ %ret_val = load i64, ptr %arrayidx
+ ret i64 %ret_val
+}
+
+define i32 @PR82431_1(i32 %0, ptr %f) {
+; CHECK-LABEL: PR82431_1:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT: addl %edi, %edi
+; CHECK-NEXT: andl $8, %edi
+; CHECK-NEXT: movl 4(%rsi,%rdi), %eax
+; CHECK-NEXT: retq
+entry:
+ %shr = lshr i32 %0, 1
+ %and = and i32 %shr, 2
+ %add = or i32 %and, 1
+ %idxprom = zext i32 %add to i64
+ %arrayidx = getelementptr [0 x i32], ptr %f, i64 0, i64 %idxprom
+ %ret_val = load i32, ptr %arrayidx
+ ret i32 %ret_val
+}
+
+define void @PR82431_2(i8 %call, ptr %b) {
+; CHECK-LABEL: PR82431_2:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movzbl %dil, %eax
; CHECK-NEXT: #APP
; CHECK-NEXT: #NO_APP
; CHECK-NEXT: retq
@@ -25,3 +52,22 @@ entry:
tail call void asm "", "=*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %arrayidx, ptr elementtype(i64) %arrayidx)
ret void
}
+
+define void @PR82431_3(i32 %0, ptr %f) {
+; CHECK-LABEL: PR82431_3:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
+; CHECK-NEXT: addl %edi, %edi
+; CHECK-NEXT: andl $8, %edi
+; CHECK-NEXT: #APP
+; CHECK-NEXT: #NO_APP
+; CHECK-NEXT: retq
+entry:
+ %shr = lshr i32 %0, 1
+ %and = and i32 %shr, 2
+ %add = or i32 %and, 1
+ %idxprom = zext i32 %add to i64
+ %arrayidx = getelementptr [0 x i32], ptr %f, i64 0, i64 %idxprom
+ tail call void asm "", "=*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %arrayidx, ptr elementtype(i32) %arrayidx)
+ ret void
+}

View File

@ -0,0 +1,27 @@
This patches LLVM to use ELFv2 on ppc64 unconditionally unless overridden. We
need this because unlike most distros we use ELFv2 for both glibc and musl
on big endian ppc64.
--- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
+++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp
@@ -237,10 +237,7 @@
case Triple::ppc64le:
return PPCTargetMachine::PPC_ABI_ELFv2;
case Triple::ppc64:
- if (TT.isPPC64ELFv2ABI())
- return PPCTargetMachine::PPC_ABI_ELFv2;
- else
- return PPCTargetMachine::PPC_ABI_ELFv1;
+ return PPCTargetMachine::PPC_ABI_ELFv2;
default:
return PPCTargetMachine::PPC_ABI_UNKNOWN;
}
--- a/llvm/test/CodeGen/PowerPC/ppc64-elf-abi.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc64-elf-abi.ll
@@ -1,4 +1,5 @@
-; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s -check-prefix=CHECK-ELFv1
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu < %s | FileCheck %s -check-prefix=CHECK-ELFv2
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-musl < %s | FileCheck %s -check-prefix=CHECK-ELFv2
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -target-abi elfv1 < %s | FileCheck %s -check-prefix=CHECK-ELFv1
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -target-abi elfv2 < %s | FileCheck %s -check-prefix=CHECK-ELFv2
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s -check-prefix=CHECK-ELFv2

17
llvm18/macho32.patch Normal file
View File

@ -0,0 +1,17 @@
Use integer offset math instead of pointer math to determine load
command bounds.
Upstream-URL: https://github.com/llvm/llvm-project/issues/56746
--- llvm-14.0.6.src/lib/Object/MachOObjectFile.cpp.old 2022-06-22 16:46:24.000000000 +0000
+++ llvm-14.0.6.src/lib/Object/MachOObjectFile.cpp 2022-11-28 04:21:02.730211841 +0000
@@ -192,7 +192,8 @@
getLoadCommandInfo(const MachOObjectFile &Obj, const char *Ptr,
uint32_t LoadCommandIndex) {
if (auto CmdOrErr = getStructOrErr<MachO::load_command>(Obj, Ptr)) {
- if (CmdOrErr->cmdsize + Ptr > Obj.getData().end())
+ uint64_t Offset = Ptr - Obj.getData().begin();
+ if (CmdOrErr->cmdsize + Offset > Obj.getData().size())
return malformedError("load command " + Twine(LoadCommandIndex) +
" extends past end of file");
if (CmdOrErr->cmdsize < 8)

22
llvm18/ppc-gcc-bug.patch Normal file
View File

@ -0,0 +1,22 @@
Upstream: https://github.com/llvm/llvm-project/issues/95594
Ref: #1204
--- llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h.old 2024-06-15 12:21:32.000000000 -0500
+++ llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h 2024-06-25 21:42:07.495284340 -0500
@@ -390,6 +390,8 @@
return Size;
}
+#pragma GCC push_options
+#pragma GCC optimize("no-tree-ch")
static bool serialize(SPSOutputBuffer &OB, const SequenceT &S) {
if (!SPSArgList<uint64_t>::serialize(OB, static_cast<uint64_t>(S.size())))
return false;
@@ -398,6 +400,7 @@
return false;
return true;
}
+#pragma GCC pop_options
static bool deserialize(SPSInputBuffer &IB, SequenceT &S) {
using TBSD = TrivialSPSSequenceDeserialization<SPSElementTagT, SequenceT>;