devel/llvm14: arm and aarch64 improvements
Change clang to allow -m32 on arm64. This is a backport from upstream and will be merged to FreeBSD head soon. See D40943 for more info. Remove an obsolete patch which breaks arm64. [0] When BE_NATIVE is specified on aarch64, include the ARM (32-bit) backend. PR: 271616 [0] Reported by: jfc@mit.edu [0]
This commit is contained in:
parent
c4e3653e71
commit
3dcb15dfa4
3 changed files with 34 additions and 95 deletions
|
@ -1,6 +1,6 @@
|
|||
PORTNAME= llvm
|
||||
DISTVERSION= 14.0.6
|
||||
PORTREVISION= 0
|
||||
PORTREVISION= 1
|
||||
CATEGORIES= devel lang
|
||||
MASTER_SITES= https://github.com/llvm/llvm-project/releases/download/llvmorg-${DISTVERSION:S/rc/-rc/}/ \
|
||||
https://${PRE_}releases.llvm.org/${LLVM_RELEASE}/${RCDIR}
|
||||
|
@ -324,7 +324,7 @@ FREEBSD_BACKENDS= ${_FREEBSD_BACKENDS}
|
|||
.if ${ARCH} == amd64
|
||||
_NATIVE_BACKENDS= X86
|
||||
.elif ${ARCH} == aarch64
|
||||
_NATIVE_BACKENDS= AArch64
|
||||
_NATIVE_BACKENDS= AArch64 ARM
|
||||
.elif ${ARCH:Marmv*}
|
||||
_NATIVE_BACKENDS= ARM
|
||||
.elif ${ARCH} == i386
|
||||
|
|
32
devel/llvm14/files/patch-backport-3450272fc2
Normal file
32
devel/llvm14/files/patch-backport-3450272fc2
Normal file
|
@ -0,0 +1,32 @@
|
|||
commit 3450272fc281979388bb845a9fffb59b42cc2e7e
|
||||
Author: Jessica Clarke <jrtc27@jrtc27.com>
|
||||
Date: Mon Jul 10 01:40:58 2023 +0100
|
||||
|
||||
[Driver][FreeBSD] Generalise lib32 handling to support arm
|
||||
|
||||
The current code maintains its own list of 32-bit architectures for
|
||||
which there is a 64-bit FreeBSD architecture that supports it for lib32.
|
||||
This is unnecessary (if it's not supported, the directory just won't
|
||||
exist), and means that, when FreeBSD gains lib32 support for a new
|
||||
architecture, you need an updated toolchain that knows about it.
|
||||
Instead we can check for any 32-bit architecture and have forwards
|
||||
compatibility.
|
||||
|
||||
This is motivated by FreeBSD adding support for building arm lib32
|
||||
libraries on aarch64.
|
||||
|
||||
Co-authored-by: Mike Karels <karels@FreeBSD.org>
|
||||
|
||||
diff --git clang/lib/Driver/ToolChains/FreeBSD.cpp clang/lib/Driver/ToolChains/FreeBSD.cpp
|
||||
--- clang/lib/Driver/ToolChains/FreeBSD.cpp.orig 2022-06-22 17:46:24.000000000 +0100
|
||||
+++ clang/lib/Driver/ToolChains/FreeBSD.cpp 2023-07-12 18:38:47.053029000 +0100
|
||||
@@ -385,8 +385,7 @@
|
||||
|
||||
// When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
|
||||
// back to '/usr/lib' if it doesn't exist.
|
||||
- if ((Triple.getArch() == llvm::Triple::x86 || Triple.isMIPS32() ||
|
||||
- Triple.isPPC32()) &&
|
||||
+ if (Triple.isArch32Bit() &&
|
||||
D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
|
||||
getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
|
||||
else
|
|
@ -1,93 +0,0 @@
|
|||
commit 24b1a5b926832f68fa0a008b2484d4b44f58ee8e
|
||||
Author: dim <dim@FreeBSD.org>
|
||||
Date: Sat Sep 14 10:55:33 2019 +0000
|
||||
|
||||
Revert commit from upstream llvm trunk (by Hans Wennborg):
|
||||
|
||||
Re-commit r357452 (take 3): "SimplifyCFG
|
||||
SinkCommonCodeFromPredecessors: Also sink function calls without used
|
||||
results (PR41259)"
|
||||
|
||||
Third time's the charm.
|
||||
|
||||
This was reverted in r363220 due to being suspected of an internal
|
||||
benchmark regression and a test failure, none of which turned out to
|
||||
be caused by this.
|
||||
|
||||
As reported in https://bugs.llvm.org/show_bug.cgi?id=43269, this causes
|
||||
UNREACHABLE errors when compiling if_malo_pci.c for arm and aarch64.
|
||||
|
||||
Notes:
|
||||
svn path=/projects/clang900-import/; revision=352318
|
||||
|
||||
diff --git lib/Transforms/Utils/SimplifyCFG.cpp lib/Transforms/Utils/SimplifyCFG.cpp
|
||||
index 11651d040dc0..6e2ef67408d9 100644
|
||||
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp
|
||||
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp
|
||||
@@ -1428,10 +1428,9 @@ static bool HoistThenElseCodeToIf(BranchInst *BI,
|
||||
static bool canSinkInstructions(
|
||||
ArrayRef<Instruction *> Insts,
|
||||
DenseMap<Instruction *, SmallVector<Value *, 4>> &PHIOperands) {
|
||||
- // Prune out obviously bad instructions to move. Each instruction must have
|
||||
- // exactly zero or one use, and we check later that use is by a single, common
|
||||
- // PHI instruction in the successor.
|
||||
- bool HasUse = !Insts.front()->user_empty();
|
||||
+ // Prune out obviously bad instructions to move. Any non-store instruction
|
||||
+ // must have exactly one use, and we check later that use is by a single,
|
||||
+ // common PHI instruction in the successor.
|
||||
for (auto *I : Insts) {
|
||||
// These instructions may change or break semantics if moved.
|
||||
if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) ||
|
||||
@@ -1445,10 +1444,9 @@ static bool canSinkInstructions(
|
||||
if (C->isInlineAsm())
|
||||
return false;
|
||||
|
||||
- // Each instruction must have zero or one use.
|
||||
- if (HasUse && !I->hasOneUse())
|
||||
- return false;
|
||||
- if (!HasUse && !I->user_empty())
|
||||
+ // Everything must have only one use too, apart from stores which
|
||||
+ // have no uses.
|
||||
+ if (!isa<StoreInst>(I) && !I->hasOneUse())
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1457,11 +1455,11 @@ static bool canSinkInstructions(
|
||||
if (!I->isSameOperationAs(I0))
|
||||
return false;
|
||||
|
||||
- // All instructions in Insts are known to be the same opcode. If they have a
|
||||
- // use, check that the only user is a PHI or in the same block as the
|
||||
- // instruction, because if a user is in the same block as an instruction we're
|
||||
- // contemplating sinking, it must already be determined to be sinkable.
|
||||
- if (HasUse) {
|
||||
+ // All instructions in Insts are known to be the same opcode. If they aren't
|
||||
+ // stores, check the only user of each is a PHI or in the same block as the
|
||||
+ // instruction, because if a user is in the same block as an instruction
|
||||
+ // we're contemplating sinking, it must already be determined to be sinkable.
|
||||
+ if (!isa<StoreInst>(I0)) {
|
||||
auto *PNUse = dyn_cast<PHINode>(*I0->user_begin());
|
||||
auto *Succ = I0->getParent()->getTerminator()->getSuccessor(0);
|
||||
if (!all_of(Insts, [&PNUse,&Succ](const Instruction *I) -> bool {
|
||||
@@ -1539,7 +1537,7 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) {
|
||||
// it is slightly over-aggressive - it gets confused by commutative instructions
|
||||
// so double-check it here.
|
||||
Instruction *I0 = Insts.front();
|
||||
- if (!I0->user_empty()) {
|
||||
+ if (!isa<StoreInst>(I0)) {
|
||||
auto *PNUse = dyn_cast<PHINode>(*I0->user_begin());
|
||||
if (!all_of(Insts, [&PNUse](const Instruction *I) -> bool {
|
||||
auto *U = cast<Instruction>(*I->user_begin());
|
||||
@@ -1597,10 +1595,11 @@ static bool sinkLastInstruction(ArrayRef<BasicBlock*> Blocks) {
|
||||
I0->andIRFlags(I);
|
||||
}
|
||||
|
||||
- if (!I0->user_empty()) {
|
||||
+ if (!isa<StoreInst>(I0)) {
|
||||
// canSinkLastInstruction checked that all instructions were used by
|
||||
// one and only one PHI node. Find that now, RAUW it to our common
|
||||
// instruction and nuke it.
|
||||
+ assert(I0->hasOneUse());
|
||||
auto *PN = cast<PHINode>(*I0->user_begin());
|
||||
PN->replaceAllUsesWith(I0);
|
||||
PN->eraseFromParent();
|
Loading…
Reference in a new issue