aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2023-07-12 18:59:33 +0000
committerBrooks Davis <brooks@FreeBSD.org>2023-07-20 18:33:45 +0000
commite086c6a53f3442fb5af0d308cdeca9cf4beac544 (patch)
treee7f80d49cc33dd57b9799f0e38e4171b993d804c
parent3d5ad388afdb38e0f6229acfc8c1fa88160a9fb0 (diff)
downloadports-e086c6a53f3442fb5af0d308cdeca9cf4beac544.tar.gz
ports-e086c6a53f3442fb5af0d308cdeca9cf4beac544.zip
devel/llvm13: 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] (cherry picked from commit 391873c7b9a02d9fdb5cce4dc79630ec3320702c)
-rw-r--r--devel/llvm13/Makefile4
-rw-r--r--devel/llvm13/files/patch-backport-3450272fc232
-rw-r--r--devel/llvm13/files/patch-freebsd-r35231893
3 files changed, 34 insertions, 95 deletions
diff --git a/devel/llvm13/Makefile b/devel/llvm13/Makefile
index 477202bde2db..5eea182e164e 100644
--- a/devel/llvm13/Makefile
+++ b/devel/llvm13/Makefile
@@ -1,6 +1,6 @@
PORTNAME= llvm
DISTVERSION= 13.0.1
-PORTREVISION= 3
+PORTREVISION= 4
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}
@@ -321,7 +321,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
diff --git a/devel/llvm13/files/patch-backport-3450272fc2 b/devel/llvm13/files/patch-backport-3450272fc2
new file mode 100644
index 000000000000..3b5b5bb99a8f
--- /dev/null
+++ b/devel/llvm13/files/patch-backport-3450272fc2
@@ -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
diff --git a/devel/llvm13/files/patch-freebsd-r352318 b/devel/llvm13/files/patch-freebsd-r352318
deleted file mode 100644
index 4fe5c836b6ea..000000000000
--- a/devel/llvm13/files/patch-freebsd-r352318
+++ /dev/null
@@ -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();