* update llvm to 19.1.7-1.2

This commit is contained in:
Alexander Baldeck 2025-02-28 17:44:53 +01:00
parent f2c6031b66
commit dde28fa496
3 changed files with 184 additions and 7 deletions

View File

@ -4,7 +4,7 @@
pkgname=('llvm' 'llvm-libs')
pkgver=19.1.7
pkgrel=1.1
pkgrel=1.2
arch=(x86_64 powerpc64le powerpc64 powerpc riscv64)
url="https://llvm.org/"
license=('Apache-2.0 WITH LLVM-exception')
@ -21,6 +21,7 @@ source=($_source_base/llvm-$pkgver.src.tar.xz{,.sig}
$_source_base/third-party-$pkgver.src.tar.xz{,.sig}
llvm-ppc64-elfv2.patch
dyld-elf-ppc32.patch
dyld-elf-ppc32-2.patch
ppc-gcc-bug.patch
macho32.patch)
sha256sums=('96f833c6ad99a3e8e1d9aca5f439b8fd2c7efdcf83b664e0af1c0712c5315910'
@ -30,7 +31,8 @@ sha256sums=('96f833c6ad99a3e8e1d9aca5f439b8fd2c7efdcf83b664e0af1c0712c5315910'
'b96deca1d3097c7ffd4ff2bb904a50bdd56bec7ed1413ffb0d1d01af87b72c12'
'SKIP'
'8c4e8db0b80b1a86f8cff9aa678b70458503bc8926ecc41e0df953ea14ab3559'
'fe0277358d7a9bdfda236f9e6d74c43d458384a0c9d5db75bf2874b9a1d761f6'
'9a7c0e0c5b60f35e36f931dca9144975387d2fe046a959c97e252e6539f28dda'
'b27bdec80d19a7d8c8bf36855891b557f0544df47c0f0f89a808da6d7a490847'
'18d3c415474e937fc73ad4173506250495385025af168a0c270d3c202aedbab5'
'a2ba322576fdea8d0c317d0ad372d224009b2d090b86ed9d0f566efb1d238827')
validpgpkeys=('474E22316ABF4785A88C6E8EA2C794A986419D8A' # Tom Stellard <tstellar@redhat.com>
@ -80,6 +82,7 @@ prepare() {
# Adelie fixes, they're awesome too!
patch -Np1 -i ${srcdir}/dyld-elf-ppc32.patch
patch -Np1 -i ${srcdir}/dyld-elf-ppc32-2.patch
patch -Np1 -i ${srcdir}/ppc-gcc-bug.patch
patch -Np1 -i ${srcdir}/macho32.patch

176
llvm/dyld-elf-ppc32-2.patch Normal file
View File

@ -0,0 +1,176 @@
Author: Ash Logan <ash@heyquark.com>
adds a whole bunch of ppc32 relocation types - probably only REL32 and REL24 are actually needed, or
indeed tested.
mostly copypasted from the ppc64 code with ELFv2 ABI removed. No attempt is made to support GOT/PLT
relocations, since the JIT doesn't seem to generate these.
makes clang-repl and the ExecutionEngine testsuites pass, and allows llvmpipe to run
diff -rup llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
--- llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp 2024-06-16 03:21:32.000000000 +1000
+++ llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp 2025-02-26 00:10:04.114888980 +1100
@@ -1029,6 +1029,14 @@ uint8_t *RuntimeDyldImpl::createStubFunc
writeBytesUnaligned(JrT9Instr, Addr + 24, 4);
writeBytesUnaligned(NopInstr, Addr + 28, 4);
return Addr;
+ } else if (Arch == Triple::ppc || Arch == Triple::ppcle) {
+ // The ABI docs talk endlessly of PLTs and GOTs which have special relocation types.
+ // For the generic types, just do a generic jump.
+ writeInt32BE(Addr, 0x3D800000); // lis r12, h(addr)
+ writeInt32BE(Addr+4, 0x618C0000); // ori r12, l(addr)
+ writeInt32BE(Addr+8, 0x7D8903A6); // mtctr r12
+ writeInt32BE(Addr+12, 0x4E800420); // bctr
+ return Addr;
} else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) {
// Depending on which version of the ELF ABI is in use, we need to
// generate one of two variants of the stub. They both start with
diff -rup llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
--- llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp 2024-06-16 03:21:32.000000000 +1000
+++ llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp 2025-02-26 00:32:57.021079997 +1100
@@ -819,7 +819,7 @@ void RuntimeDyldELF::resolvePPC32Relocat
uint8_t *LocalAddress = Section.getAddressWithOffset(Offset);
switch (Type) {
default:
- report_fatal_error("Relocation type not implemented yet!");
+ report_fatal_error("Relocation type " + Twine(Type) + " not implemented yet!");
break;
case ELF::R_PPC_ADDR16_LO:
writeInt16BE(LocalAddress, applyPPClo(Value + Addend));
@@ -835,6 +835,37 @@ void RuntimeDyldELF::resolvePPC32Relocat
int64_t delta = static_cast<int64_t>(Value - FinalAddress + Addend);
writeInt32BE(LocalAddress, delta);
} break;
+ case ELF::R_PPC_REL24: {
+ uint32_t FinalAddress = Section.getLoadAddressWithOffset(Offset);
+ int64_t delta = static_cast<int64_t>(Value - FinalAddress + Addend);
+ if (SignExtend64<26>(delta) != delta)
+ llvm_unreachable("Relocation R_PPC_REL24 overflow");
+ uint32_t Inst = readBytesUnaligned(LocalAddress, 4);
+ writeInt32BE(LocalAddress, (Inst & 0xFC000003) | (delta & 0x03FFFFFC));
+ } break;
+ case ELF::R_PPC_ADDR32: {
+ int64_t delta = static_cast<int64_t>(Value + Addend);
+ writeInt32BE(LocalAddress, delta);
+ } break;
+ case ELF::R_PPC_ADDR30: {
+ uint32_t FinalAddress = Section.getLoadAddressWithOffset(Offset);
+ int64_t delta = static_cast<int64_t>(Value - FinalAddress + Addend);
+ uint32_t Inst = readBytesUnaligned(LocalAddress, 4);
+ writeInt32BE(LocalAddress, (Inst & 0x00000003) | (delta & 0xFFFFFFFC));
+ } break;
+ case ELF::R_PPC_ADDR24: {
+ int64_t delta = static_cast<int64_t>(Value + Addend);
+ if (SignExtend64<26>(delta) != delta)
+ llvm_unreachable("Relocation R_PPC_ADDR24 overflow");
+ uint32_t Inst = readBytesUnaligned(LocalAddress, 4);
+ writeInt32BE(LocalAddress, (Inst & 0xFC000003) | (delta & 0x03FFFFFC));
+ } break;
+ case ELF::R_PPC_ADDR16: {
+ int64_t delta = static_cast<int64_t>(Value + Addend);
+ if (SignExtend64<16>(delta) != delta)
+ llvm_unreachable("Relocation R_PPC_ADDR16 overflow");
+ writeInt16BE(LocalAddress, delta);
+ } break;
}
}
@@ -1551,6 +1587,76 @@ RuntimeDyldELF::processRelocationRef(
processSimpleRelocation(SectionID, Offset, RelType, Value);
}
+ } else if (Arch == Triple::ppc || Arch == Triple::ppcle) {
+ if (RelType == ELF::R_PPC_REL24) {
+ // A PPC branch relocation will need a stub function if the target is
+ // an external symbol (either Value.SymbolName is set, or SymType is
+ // Symbol::ST_Unknown) or if the target address is not within the
+ // signed 24-bits branch address.
+ SectionEntry &Section = Sections[SectionID];
+ uint8_t *Target = Section.getAddressWithOffset(Offset);
+ bool RangeOverflow = false;
+ bool IsExtern = Value.SymbolName || SymType == SymbolRef::ST_Unknown;
+ if (!IsExtern) {
+ uint8_t *RelocTarget =
+ Sections[Value.SectionID].getAddressWithOffset(Value.Addend);
+ int64_t delta = static_cast<int64_t>(Target - RelocTarget);
+ // If it is within 26-bits branch range, just set the branch target
+ if (SignExtend64<26>(delta) != delta) {
+ RangeOverflow = true;
+ } else {
+ RelocationEntry RE(SectionID, Offset, RelType, Value.Addend);
+ addRelocationForSection(RE, Value.SectionID);
+ }
+ }
+ if (IsExtern || RangeOverflow) {
+ // It is an external symbol (either Value.SymbolName is set, or
+ // SymType is SymbolRef::ST_Unknown) or out of range.
+ StubMap::const_iterator i = Stubs.find(Value);
+ if (i != Stubs.end()) {
+ // Symbol function stub already created, just relocate to it
+ resolveRelocation(Section, Offset,
+ reinterpret_cast<uint64_t>(
+ Section.getAddressWithOffset(i->second)),
+ RelType, 0);
+ LLVM_DEBUG(dbgs() << " Stub function found\n");
+ } else {
+ // Create a new stub function.
+ LLVM_DEBUG(dbgs() << " Create a new stub function\n");
+ Stubs[Value] = Section.getStubOffset();
+ uint8_t *StubTargetAddr = createStubFunction(
+ Section.getAddressWithOffset(Section.getStubOffset()));
+
+ // The PPC32 ELF ABI doesn't really provide any guidance on the no-PLT case so let's do
+ // our best
+ uint64_t StubRelocOffset = StubTargetAddr - Section.getAddress();
+ if (!IsTargetLittleEndian)
+ StubRelocOffset += 2;
+
+ RelocationEntry REh(SectionID, StubRelocOffset + 0,
+ ELF::R_PPC_ADDR16_HI, Value.Addend);
+ RelocationEntry REl(SectionID, StubRelocOffset + 4,
+ ELF::R_PPC_ADDR16_LO, Value.Addend);
+
+ if (Value.SymbolName) {
+ addRelocationForSymbol(REh, Value.SymbolName);
+ addRelocationForSymbol(REl, Value.SymbolName);
+ } else {
+ addRelocationForSection(REh, Value.SectionID);
+ addRelocationForSection(REl, Value.SectionID);
+ }
+
+ resolveRelocation(Section, Offset, reinterpret_cast<uint64_t>(
+ Section.getAddressWithOffset(
+ Section.getStubOffset())),
+ RelType, 0);
+ Section.advanceStubOffset(getMaxStubSize());
+ }
+ }
+ } else {
+ // Normal relocations are fine as-is probs
+ processSimpleRelocation(SectionID, Offset, RelType, Value);
+ }
} else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) {
if (RelType == ELF::R_PPC64_REL24) {
// Determine ABI variant in use for this object.
@@ -2228,6 +2334,8 @@ size_t RuntimeDyldELF::getGOTEntrySize()
case Triple::x86:
case Triple::arm:
case Triple::thumb:
+ case Triple::ppc:
+ case Triple::ppcle:
Result = sizeof(uint32_t);
break;
case Triple::mips:
diff -rup llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
--- llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h 2024-06-16 03:21:32.000000000 +1000
+++ llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h 2025-02-25 23:51:24.830956991 +1100
@@ -69,6 +69,8 @@ class RuntimeDyldELF : public RuntimeDyl
return 16;
else if (IsMipsN64ABI)
return 32;
+ else if (Arch == Triple::ppc || Arch == Triple::ppcle)
+ return 16;
else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le)
return 44;
else if (Arch == Triple::x86_64)

View File

@ -8,17 +8,15 @@ 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 @@
@@ -830,6 +830,11 @@
case ELF::R_PPC_ADDR16_HA:
writeInt16BE(LocalAddress, applyPPCha(Value + Addend));
break;
+ case ELF::R_PPC_REL32:
+ 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;
+ } break;
}
}