Use x86_64-redhat-linux as default gcc triple for x86_64_v2

Add riscv64 support
This commit is contained in:
Eduard Abdullin 2025-08-13 12:29:00 +03:00 committed by eabdullin
commit 347b68d1aa
17 changed files with 909 additions and 346 deletions

View File

@ -6,10 +6,25 @@ COPR_USERNAME=$(shell rpm --eval %copr_username)
COPR_PROJECT=$(shell rpm --eval %copr_projectname)
YYYYMMDD=$(shell date +%Y%m%d)
required_packages=git tar xz curl fedpkg
outdir?=$(shell pwd)
spec?=llvm.spec
.PHONY: srpm
srpm:
dnf install -y git tar xz curl --setopt=install_weak_deps=False
@echo "Check for required packages needed by snapshot-info.sh: $(required_packages)"
rpm -q $(required_packages) || dnf install -y $(required_packages) --setopt=install_weak_deps=False
@echo "Fetch information about today's snapshot"
YYYYMMDD=$(YYYYMMDD) ./.copr/snapshot-info.sh > version.spec.inc
@echo "Get sources"
fedpkg --release rawhide sources --outdir $(shell pwd)
@echo "Remove left-over llvm-project tarball and signature"
rm -vf $(shell pwd)/llvm-project-*.tar.xz*
@echo "Finally build SRPM"
rpmbuild \
--with=snapshot_build \
--define "_srcrpmdir $(outdir)" \

0
.copr/snapshot-info.sh Normal file → Executable file
View File

View File

@ -7,3 +7,12 @@
# the following command.
#
# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
# Merge *.spec.inc files into llvm.spec
9984e82c507f69611b9589e16467d359622d36f9
# Cleanup CMake arguments
a4eda9ffbbf5c912ef764882e8a78da5f76a157d
# [pre-commit]: pre-commit-hooks 5.0.0, tmt 1.38.0
260d8e1cdccb5323b8913243f656ba7be20e53bb

View File

@ -0,0 +1,26 @@
From ffc7d5ae2d79f98967943fabb2abfbc1b1e047fd Mon Sep 17 00:00:00 2001
From: Douglas Yung <douglas.yung@sony.com>
Date: Tue, 24 Jun 2025 04:08:34 +0000
Subject: [PATCH] Add `REQUIRES: asserts` to test added in #145149 because it
uses the `-debug-only=` flag.
This should fix the test failure when building without asserts.
---
llvm/test/CodeGen/PowerPC/pr141642.ll | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/test/CodeGen/PowerPC/pr141642.ll b/llvm/test/CodeGen/PowerPC/pr141642.ll
index 38a706574786..61bda4dfaf53 100644
--- a/llvm/test/CodeGen/PowerPC/pr141642.ll
+++ b/llvm/test/CodeGen/PowerPC/pr141642.ll
@@ -2,6 +2,7 @@
; RUN: FileCheck %s
; CHECK-NOT: lxvdsx
; CHECK-NOT: LD_SPLAT
+; REQUIRES: asserts
define weak_odr dso_local void @unpack(ptr noalias noundef %packed_in) local_unnamed_addr {
entry:
--
2.49.0

View File

@ -0,0 +1,143 @@
From c76137f1cfd5758f6889236d49a65f059e6432ff Mon Sep 17 00:00:00 2001
From: weiguozhi <57237827+weiguozhi@users.noreply.github.com>
Date: Thu, 15 May 2025 09:27:25 -0700
Subject: [PATCH] [CodeGenPrepare] Make sure instruction get from SunkAddrs is
before MemoryInst (#139303)
Function optimizeBlock may do optimizations on a block for multiple
times. In the first iteration of the loop, MemoryInst1 may generate a
sunk instruction and store it into SunkAddrs. In the second iteration of
the loop, MemoryInst2 may use the same address and then it can reuse the
sunk instruction stored in SunkAddrs, but MemoryInst2 may be before
MemoryInst1 and the corresponding sunk instruction. In order to avoid
use before def error, we need to find appropriate insert position for the
sunk instruction.
Fixes #138208.
(cherry picked from commit 59c6d70ed8120b8864e5f796e2bf3de5518a0ef0)
---
llvm/lib/CodeGen/CodeGenPrepare.cpp | 41 ++++++++++++++---
.../CodeGenPrepare/X86/sink-addr-reuse.ll | 44 +++++++++++++++++++
2 files changed, 80 insertions(+), 5 deletions(-)
create mode 100644 llvm/test/Transforms/CodeGenPrepare/X86/sink-addr-reuse.ll
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 088062afab17..f779f4b782ae 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -5728,6 +5728,35 @@ static bool IsNonLocalValue(Value *V, BasicBlock *BB) {
return false;
}
+// Find an insert position of Addr for MemoryInst. We can't guarantee MemoryInst
+// is the first instruction that will use Addr. So we need to find the first
+// user of Addr in current BB.
+static BasicBlock::iterator findInsertPos(Value *Addr, Instruction *MemoryInst,
+ Value *SunkAddr) {
+ if (Addr->hasOneUse())
+ return MemoryInst->getIterator();
+
+ // We already have a SunkAddr in current BB, but we may need to insert cast
+ // instruction after it.
+ if (SunkAddr) {
+ if (Instruction *AddrInst = dyn_cast<Instruction>(SunkAddr))
+ return std::next(AddrInst->getIterator());
+ }
+
+ // Find the first user of Addr in current BB.
+ Instruction *Earliest = MemoryInst;
+ for (User *U : Addr->users()) {
+ Instruction *UserInst = dyn_cast<Instruction>(U);
+ if (UserInst && UserInst->getParent() == MemoryInst->getParent()) {
+ if (isa<PHINode>(UserInst) || UserInst->isDebugOrPseudoInst())
+ continue;
+ if (UserInst->comesBefore(Earliest))
+ Earliest = UserInst;
+ }
+ }
+ return Earliest->getIterator();
+}
+
/// Sink addressing mode computation immediate before MemoryInst if doing so
/// can be done without increasing register pressure. The need for the
/// register pressure constraint means this can end up being an all or nothing
@@ -5852,11 +5881,6 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
return Modified;
}
- // Insert this computation right after this user. Since our caller is
- // scanning from the top of the BB to the bottom, reuse of the expr are
- // guaranteed to happen later.
- IRBuilder<> Builder(MemoryInst);
-
// Now that we determined the addressing expression we want to use and know
// that we have to sink it into this block. Check to see if we have already
// done this for some other load/store instr in this block. If so, reuse
@@ -5867,6 +5891,13 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
Value *SunkAddr = SunkAddrVH.pointsToAliveValue() ? SunkAddrVH : nullptr;
Type *IntPtrTy = DL->getIntPtrType(Addr->getType());
+
+ // The current BB may be optimized multiple times, we can't guarantee the
+ // reuse of Addr happens later, call findInsertPos to find an appropriate
+ // insert position.
+ IRBuilder<> Builder(MemoryInst->getParent(),
+ findInsertPos(Addr, MemoryInst, SunkAddr));
+
if (SunkAddr) {
LLVM_DEBUG(dbgs() << "CGP: Reusing nonlocal addrmode: " << AddrMode
<< " for " << *MemoryInst << "\n");
diff --git a/llvm/test/Transforms/CodeGenPrepare/X86/sink-addr-reuse.ll b/llvm/test/Transforms/CodeGenPrepare/X86/sink-addr-reuse.ll
new file mode 100644
index 000000000000..019f31140655
--- /dev/null
+++ b/llvm/test/Transforms/CodeGenPrepare/X86/sink-addr-reuse.ll
@@ -0,0 +1,44 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S -p 'require<profile-summary>,codegenprepare' -cgpp-huge-func=0 < %s | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-grtev4-linux-gnu"
+
+declare void @g(ptr)
+
+; %load and %load5 use the same address, %load5 is optimized first, %load is
+; optimized later and reuse the same address computation instruction. We must
+; make sure not to generate use before def error.
+
+define void @f(ptr %arg) {
+; CHECK-LABEL: define void @f(
+; CHECK-SAME: ptr [[ARG:%.*]]) {
+; CHECK-NEXT: [[BB:.*:]]
+; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr i8, ptr [[ARG]], i64 -64
+; CHECK-NEXT: call void @g(ptr [[GETELEMENTPTR]])
+; CHECK-NEXT: [[SUNKADDR1:%.*]] = getelementptr i8, ptr [[ARG]], i64 -64
+; CHECK-NEXT: [[LOAD:%.*]] = load ptr, ptr [[SUNKADDR1]], align 8
+; CHECK-NEXT: [[SUNKADDR:%.*]] = getelementptr i8, ptr [[ARG]], i64 -56
+; CHECK-NEXT: [[LOAD4:%.*]] = load i32, ptr [[SUNKADDR]], align 8
+; CHECK-NEXT: [[LOAD5:%.*]] = load ptr, ptr [[SUNKADDR1]], align 8
+; CHECK-NEXT: [[TMP0:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 1, i32 0)
+; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
+; CHECK-NEXT: ret void
+;
+bb:
+ %getelementptr = getelementptr i8, ptr %arg, i64 -64
+ %getelementptr1 = getelementptr i8, ptr %arg, i64 -56
+ call void @g(ptr %getelementptr)
+ br label %bb3
+
+bb3:
+ %load = load ptr, ptr %getelementptr, align 8
+ %load4 = load i32, ptr %getelementptr1, align 8
+ %load5 = load ptr, ptr %getelementptr, align 8
+ %add = add i32 1, 0
+ %icmp = icmp eq i32 %add, 0
+ br i1 %icmp, label %bb7, label %bb7
+
+bb7:
+ ret void
+}
--
2.49.0

View File

@ -0,0 +1,67 @@
From 735d721de451067c3a618b309703d0b8beb9cacc Mon Sep 17 00:00:00 2001
From: Wael Yehia <wmyehia2001@yahoo.com>
Date: Mon, 23 Jun 2025 13:22:33 -0400
Subject: [PATCH] [PowerPC] Fix handling of undefs in the
PPC::isSplatShuffleMask query (#145149)
Currently, the query assumes that a single undef byte implies the rest of
the `EltSize - 1` bytes are undefs, but that's not always true.
e.g. isSplatShuffleMask(
<0,1,2,3,4,5,6,7,undef,undef,undef,undef,0,1,2,3>, 8) should return
false.
---------
Co-authored-by: Wael Yehia <wyehia@ca.ibm.com>
---
llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 13 +++++++++----
llvm/test/CodeGen/PowerPC/pr141642.ll | 13 +++++++++++++
2 files changed, 22 insertions(+), 4 deletions(-)
create mode 100644 llvm/test/CodeGen/PowerPC/pr141642.ll
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 421a808de667..88c6fe632d26 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -2242,10 +2242,15 @@ bool PPC::isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize) {
return false;
for (unsigned i = EltSize, e = 16; i != e; i += EltSize) {
- if (N->getMaskElt(i) < 0) continue;
- for (unsigned j = 0; j != EltSize; ++j)
- if (N->getMaskElt(i+j) != N->getMaskElt(j))
- return false;
+ // An UNDEF element is a sequence of UNDEF bytes.
+ if (N->getMaskElt(i) < 0) {
+ for (unsigned j = 1; j != EltSize; ++j)
+ if (N->getMaskElt(i + j) >= 0)
+ return false;
+ } else
+ for (unsigned j = 0; j != EltSize; ++j)
+ if (N->getMaskElt(i + j) != N->getMaskElt(j))
+ return false;
}
return true;
}
diff --git a/llvm/test/CodeGen/PowerPC/pr141642.ll b/llvm/test/CodeGen/PowerPC/pr141642.ll
new file mode 100644
index 000000000000..38a706574786
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/pr141642.ll
@@ -0,0 +1,13 @@
+; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -O0 -debug-only=selectiondag -o - < %s 2>&1 | \
+; RUN: FileCheck %s
+; CHECK-NOT: lxvdsx
+; CHECK-NOT: LD_SPLAT
+
+define weak_odr dso_local void @unpack(ptr noalias noundef %packed_in) local_unnamed_addr {
+entry:
+ %ld = load <2 x i32>, ptr %packed_in, align 2
+ %shuf = shufflevector <2 x i32> %ld, <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 0>
+ %ie = insertelement <4 x i32> %shuf, i32 7, i32 2
+ store <4 x i32> %shuf, ptr %packed_in, align 2
+ ret void
+}
--
2.49.0

View File

@ -1,51 +0,0 @@
From be7b1ef7c8e58b454e20f7f70d0e316528e2c823 Mon Sep 17 00:00:00 2001
From: Tom Stellard <tstellar@redhat.com>
Date: Tue, 29 Apr 2025 21:35:57 +0000
Subject: [PATCH] [sanitizer_common] Disable termio ioctls on PowerPC
glibc-2.42 removed the termio.h header, but there are refrences to it
still in the kernel's ioctl.h, so we need disable these ioctls to fix
this build.
---
.../sanitizer_platform_limits_posix.cpp | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 7a89bf1c7498..7b81951f82ae 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -182,6 +182,12 @@ typedef struct user_fpregs elf_fpregset_t;
#include <sys/ioctl.h>
#endif
+// Work around struct termio usage in ioctl.h on ppc64le.
+#if SANITIZER_GLIBC && !__has_include(<termio.h>) && defined(__powerpc64__)
+ #define DISABLE_TERMIO_IOCTLS 1
+#endif
+
+
// Include these after system headers to avoid name clashes and ambiguities.
# include "sanitizer_common.h"
# include "sanitizer_internal_defs.h"
@@ -779,13 +785,15 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_SOUND_PCM_WRITE_FILTER = SOUND_PCM_WRITE_FILTER;
#endif // SOUND_VERSION
unsigned IOCTL_TCFLSH = TCFLSH;
+#if !defined(DISABLE_TERMIO_IOCTLS)
unsigned IOCTL_TCGETA = TCGETA;
- unsigned IOCTL_TCGETS = TCGETS;
- unsigned IOCTL_TCSBRK = TCSBRK;
- unsigned IOCTL_TCSBRKP = TCSBRKP;
unsigned IOCTL_TCSETA = TCSETA;
unsigned IOCTL_TCSETAF = TCSETAF;
unsigned IOCTL_TCSETAW = TCSETAW;
+#endif
+ unsigned IOCTL_TCGETS = TCGETS;
+ unsigned IOCTL_TCSBRK = TCSBRK;
+ unsigned IOCTL_TCSBRKP = TCSBRKP;
unsigned IOCTL_TCSETS = TCSETS;
unsigned IOCTL_TCSETSF = TCSETSF;
unsigned IOCTL_TCSETSW = TCSETSW;
--
2.48.1

View File

@ -1,56 +0,0 @@
From 1e49835cc5737b2dffff5923e09546b70a54f90d Mon Sep 17 00:00:00 2001
From: Tom Stellard <tstellar@redhat.com>
Date: Tue, 29 Apr 2025 21:35:57 +0000
Subject: [PATCH] [sanitizer_common] Disable termio ioctls on PowerPC
glibc-2.42 removed the termio.h header, but there are refrences to it
still in the kernel's ioctl.h, so we need disable these ioctls to fix
this build.
---
.../sanitizer_platform_limits_posix.cpp | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index 10b6535499de..303c82783528 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -173,6 +173,17 @@ typedef struct user_fpregs elf_fpregset_t;
#include <sys/sockio.h>
#endif
+#if SANITIZER_HAIKU
+#include <sys/sockio.h>
+#include <sys/ioctl.h>
+#endif
+
+// Work around struct termio usage in ioctl.h on ppc64le.
+#if SANITIZER_GLIBC && !__has_include(<termio.h>) && defined(__powerpc64__)
+ #define DISABLE_TERMIO_IOCTLS 1
+#endif
+
+
// Include these after system headers to avoid name clashes and ambiguities.
# include "sanitizer_common.h"
# include "sanitizer_internal_defs.h"
@@ -764,13 +775,15 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned IOCTL_SOUND_PCM_WRITE_FILTER = SOUND_PCM_WRITE_FILTER;
#endif // SOUND_VERSION
unsigned IOCTL_TCFLSH = TCFLSH;
+#if !defined(DISABLE_TERMIO_IOCTLS)
unsigned IOCTL_TCGETA = TCGETA;
- unsigned IOCTL_TCGETS = TCGETS;
- unsigned IOCTL_TCSBRK = TCSBRK;
- unsigned IOCTL_TCSBRKP = TCSBRKP;
unsigned IOCTL_TCSETA = TCSETA;
unsigned IOCTL_TCSETAF = TCSETAF;
unsigned IOCTL_TCSETAW = TCSETAW;
+#endif
+ unsigned IOCTL_TCGETS = TCGETS;
+ unsigned IOCTL_TCSBRK = TCSBRK;
+ unsigned IOCTL_TCSBRKP = TCSBRKP;
unsigned IOCTL_TCSETS = TCSETS;
unsigned IOCTL_TCSETSF = TCSETSF;
unsigned IOCTL_TCSETSW = TCSETSW;
--
2.48.1

View File

@ -1,67 +0,0 @@
From 83bf10fffd7065317d50f19e138c9e9fd6adc064 Mon Sep 17 00:00:00 2001
From: Tom Stellard <tstellar@redhat.com>
Date: Fri, 25 Apr 2025 14:49:34 -0700
Subject: [PATCH] [sanitizer_common] Remove interceptors for deprecated struct
termio
This struct will be removed from glibc-2.42 and has been deprecated for
a very long time.
Fixes #137321
---
.../sanitizer_common_interceptors_ioctl.inc | 8 --------
.../sanitizer_common/sanitizer_platform_limits_posix.cpp | 3 ---
.../sanitizer_common/sanitizer_platform_limits_posix.h | 1 -
3 files changed, 12 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
index f88f914b1d14..bc8f02826c61 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
@@ -342,17 +342,9 @@ static void ioctl_table_fill() {
_(SOUND_PCM_WRITE_CHANNELS, WRITE, sizeof(int));
_(SOUND_PCM_WRITE_FILTER, WRITE, sizeof(int));
_(TCFLSH, NONE, 0);
-#if SANITIZER_GLIBC
- _(TCGETA, WRITE, struct_termio_sz);
-#endif
_(TCGETS, WRITE, struct_termios_sz);
_(TCSBRK, NONE, 0);
_(TCSBRKP, NONE, 0);
-#if SANITIZER_GLIBC
- _(TCSETA, READ, struct_termio_sz);
- _(TCSETAF, READ, struct_termio_sz);
- _(TCSETAW, READ, struct_termio_sz);
-#endif
_(TCSETS, READ, struct_termios_sz);
_(TCSETSF, READ, struct_termios_sz);
_(TCSETSW, READ, struct_termios_sz);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
index b4d87ab6228e..7a89bf1c7498 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
@@ -494,9 +494,6 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
unsigned struct_input_id_sz = sizeof(struct input_id);
unsigned struct_mtpos_sz = sizeof(struct mtpos);
unsigned struct_rtentry_sz = sizeof(struct rtentry);
-#if SANITIZER_GLIBC || SANITIZER_ANDROID
- unsigned struct_termio_sz = sizeof(struct termio);
-#endif
unsigned struct_vt_consize_sz = sizeof(struct vt_consize);
unsigned struct_vt_sizes_sz = sizeof(struct vt_sizes);
unsigned struct_vt_stat_sz = sizeof(struct vt_stat);
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index 348bb4f27aec..fdc52aa56c49 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -1063,7 +1063,6 @@ extern unsigned struct_hd_geometry_sz;
extern unsigned struct_input_absinfo_sz;
extern unsigned struct_input_id_sz;
extern unsigned struct_mtpos_sz;
-extern unsigned struct_termio_sz;
extern unsigned struct_vt_consize_sz;
extern unsigned struct_vt_sizes_sz;
extern unsigned struct_vt_stat_sz;
--
2.48.1

View File

@ -1,46 +0,0 @@
From d25887408ee9fb78d68787ff7388cba254aced6f Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov@redhat.com>
Date: Tue, 18 Mar 2025 14:36:06 +0100
Subject: [PATCH] [GlobalMerge][PPC] Don't merge globals in llvm.metadata
section
The llvm.metadata section is not emitted and has special semantics.
We should not merge globals in it, similarly to how we already
skip merging of `llvm.xyz` globals.
Fixes https://github.com/llvm/llvm-project/issues/131394.
---
llvm/lib/CodeGen/GlobalMerge.cpp | 3 ++-
llvm/test/CodeGen/PowerPC/global-merge-llvm-metadata.ll | 9 +++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/PowerPC/global-merge-llvm-metadata.ll
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp
index 1aedc447935b7..ca743918cec24 100644
--- a/llvm/lib/CodeGen/GlobalMerge.cpp
+++ b/llvm/lib/CodeGen/GlobalMerge.cpp
@@ -711,7 +711,8 @@ bool GlobalMergeImpl::run(Module &M) {
continue;
// Ignore all 'special' globals.
- if (GV.getName().starts_with("llvm.") || GV.getName().starts_with(".llvm."))
+ if (GV.getName().starts_with("llvm.") ||
+ GV.getName().starts_with(".llvm.") || Section == "llvm.metadata")
continue;
// Ignore all "required" globals:
diff --git a/llvm/test/CodeGen/PowerPC/global-merge-llvm-metadata.ll b/llvm/test/CodeGen/PowerPC/global-merge-llvm-metadata.ll
new file mode 100644
index 0000000000000..7db092e13afeb
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/global-merge-llvm-metadata.ll
@@ -0,0 +1,9 @@
+; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
+
+@index = global i32 0, align 4
+@.str = private unnamed_addr constant [1 x i8] zeroinitializer, section "llvm.metadata"
+@.str.1 = private unnamed_addr constant [7 x i8] c"test.c\00", section "llvm.metadata"
+@llvm.global.annotations = appending global [1 x { ptr, ptr, ptr, i32, ptr }] [{ ptr, ptr, ptr, i32, ptr } { ptr @index, ptr @.str, ptr @.str.1, i32 1, ptr null }], section "llvm.metadata"
+
+; CHECK-NOT: .set
+; CHECK-NOT: _MergedGlobals

28
20-131099.patch Normal file
View File

@ -0,0 +1,28 @@
From e43271ec7438ecb78f99db134aeca274a47f6c28 Mon Sep 17 00:00:00 2001
From: Konrad Kleine <kkleine@redhat.com>
Date: Thu, 13 Mar 2025 09:12:24 +0100
Subject: [PATCH] Filter out configuration file from compile commands
The commands to run the compilation when printed with `-###` contain
various irrelevant lines for the perf-training. Most of them are
filtered out already but when configured with
`CLANG_CONFIG_FILE_SYSTEM_DIR` a new line like the following is
added and needs to be filtered out:
`Configuration file: /etc/clang/x86_64-redhat-linux-gnu-clang.cfg`
---
clang/utils/perf-training/perf-helper.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/utils/perf-training/perf-helper.py b/clang/utils/perf-training/perf-helper.py
index 80c6356d0497c..29904aded5ab0 100644
--- a/clang/utils/perf-training/perf-helper.py
+++ b/clang/utils/perf-training/perf-helper.py
@@ -237,6 +237,7 @@ def get_cc1_command_for_args(cmd, env):
or ln.startswith("InstalledDir:")
or ln.startswith("LLVM Profile Note")
or ln.startswith(" (in-process)")
+ or ln.startswith("Configuration file:")
or " version " in ln
):
continue

94
21-146424.patch Normal file
View File

@ -0,0 +1,94 @@
From eba58195932f37fb461ae17c69fc517181b99c9a Mon Sep 17 00:00:00 2001
From: Paul Murphy <paumurph@redhat.com>
Date: Mon, 30 Jun 2025 10:13:37 -0500
Subject: [PATCH] [PowerPC] fix lowering of SPILL_CRBIT on pwr9 and pwr10
If a copy exists between creation of a crbit and a spill, machine-cp
may delete the copy since it seems unaware of the relation between a cr
and crbit. A fix was previously made for the generic ppc64 lowering. It
should be applied to the pwr9 and pwr10 variants too.
Likewise, relax and extend the pwr8 test to verify pwr9 and pwr10
codegen too.
This fixes #143989.
---
llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp | 17 +++++++++++------
.../PowerPC/NoCRFieldRedefWhenSpillingCRBIT.mir | 8 +++++++-
2 files changed, 18 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
index 76dca4794e05..78d254a55fd9 100644
--- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -1102,13 +1102,20 @@ void PPCRegisterInfo::lowerCRBitSpilling(MachineBasicBlock::iterator II,
SpillsKnownBit = true;
break;
default:
+ // When spilling a CR bit, The super register may not be explicitly defined
+ // (i.e. it can be defined by a CR-logical that only defines the subreg) so
+ // we state that the CR field is undef. Also, in order to preserve the kill
+ // flag on the CR bit, we add it as an implicit use.
+
// On Power10, we can use SETNBC to spill all CR bits. SETNBC will set all
// bits (specifically, it produces a -1 if the CR bit is set). Ultimately,
// the bit that is of importance to us is bit 32 (bit 0 of a 32-bit
// register), and SETNBC will set this.
if (Subtarget.isISA3_1()) {
BuildMI(MBB, II, dl, TII.get(LP64 ? PPC::SETNBC8 : PPC::SETNBC), Reg)
- .addReg(SrcReg, RegState::Undef);
+ .addReg(SrcReg, RegState::Undef)
+ .addReg(SrcReg, RegState::Implicit |
+ getKillRegState(MI.getOperand(0).isKill()));
break;
}
@@ -1122,16 +1129,14 @@ void PPCRegisterInfo::lowerCRBitSpilling(MachineBasicBlock::iterator II,
SrcReg == PPC::CR4LT || SrcReg == PPC::CR5LT ||
SrcReg == PPC::CR6LT || SrcReg == PPC::CR7LT) {
BuildMI(MBB, II, dl, TII.get(LP64 ? PPC::SETB8 : PPC::SETB), Reg)
- .addReg(getCRFromCRBit(SrcReg), RegState::Undef);
+ .addReg(getCRFromCRBit(SrcReg), RegState::Undef)
+ .addReg(SrcReg, RegState::Implicit |
+ getKillRegState(MI.getOperand(0).isKill()));
break;
}
}
// We need to move the CR field that contains the CR bit we are spilling.
- // The super register may not be explicitly defined (i.e. it can be defined
- // by a CR-logical that only defines the subreg) so we state that the CR
- // field is undef. Also, in order to preserve the kill flag on the CR bit,
- // we add it as an implicit use.
BuildMI(MBB, II, dl, TII.get(LP64 ? PPC::MFOCRF8 : PPC::MFOCRF), Reg)
.addReg(getCRFromCRBit(SrcReg), RegState::Undef)
.addReg(SrcReg,
diff --git a/llvm/test/CodeGen/PowerPC/NoCRFieldRedefWhenSpillingCRBIT.mir b/llvm/test/CodeGen/PowerPC/NoCRFieldRedefWhenSpillingCRBIT.mir
index 41e21248a3f0..2796cdb3ae87 100644
--- a/llvm/test/CodeGen/PowerPC/NoCRFieldRedefWhenSpillingCRBIT.mir
+++ b/llvm/test/CodeGen/PowerPC/NoCRFieldRedefWhenSpillingCRBIT.mir
@@ -1,6 +1,12 @@
# RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -start-after \
# RUN: virtregrewriter -ppc-asm-full-reg-names -verify-machineinstrs %s \
# RUN: -o - | FileCheck %s
+# RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-linux-gnu -start-after \
+# RUN: virtregrewriter -ppc-asm-full-reg-names -verify-machineinstrs %s \
+# RUN: -o - | FileCheck %s
+# RUN: llc -mcpu=pwr10 -mtriple=powerpc64le-unknown-linux-gnu -start-after \
+# RUN: virtregrewriter -ppc-asm-full-reg-names -verify-machineinstrs %s \
+# RUN: -o - | FileCheck %s
--- |
; ModuleID = 'a.ll'
@@ -30,7 +36,7 @@
; Function Attrs: nounwind
declare void @llvm.stackprotector(ptr, ptr) #1
- attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="ppc64le" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+htm,+power8-vector,+vsx,-power9-vector" "unsafe-fp-math"="false" "use-soft-float"="false" }
+ attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }
!llvm.ident = !{!0}
--
2.49.0

View File

@ -2,9 +2,9 @@
# See ~/.config/mock/<CONFIG>.cfg or /etc/mock/<CONFIG>.cfg
# Tweak this to centos-stream-9-x86_64 to build for CentOS
MOCK_CHROOT?=centos-stream-10-x86_64
MOCK_CHROOT?=fedora-rawhide-x86_64
MOCK_OPTS?=
MOCK_OPTS_RELEASE?=--no-clean --no-cleanup-after --without lto_build --define "debug_package %{nil}" $(MOCK_OPTS)
MOCK_OPTS_RELEASE?=--no-clean --no-cleanup-after --without lto_build --without pgo --define "debug_package %{nil}" $(MOCK_OPTS)
MOCK_OPTS_SNAPSHOT?=$(MOCK_OPTS_RELEASE) --with snapshot_build $(MOCK_OPTS)
YYYYMMDD?=$(shell date +%Y%m%d)
SOURCEDIR=$(shell pwd)
@ -103,6 +103,22 @@ edit-last-failing-script: get-last-run-script
mockbuild-rerun-last-script: get-last-run-script
mock --root=$(MOCK_CHROOT) --shell 'sh -e $(last_run_script)'
.PHONY: mock-shell
## Run an interactive mock shell with bash
mock-shell:
mock --root=$(MOCK_CHROOT) --shell bash
######### Help debug inside mock environment
.PHONY: mock-install-debugging-tools
## This will install gdb, gdb-dashboard, vim, valgrind, lldb and
## other tools into your mock environment for you to debug any
## problems.
mock-install-debugging-tools:
mock --root=$(MOCK_CHROOT) --install python3-pygments vim gdb lldb python3-rpm valgrind
curl -sLO https://github.com/cyrus-and/gdb-dashboard/raw/master/.gdbinit
mock --root=$(MOCK_CHROOT) --copyin .gdbinit /builddir/.gdbinit
.PHONY: help
# Based on https://gist.github.com/rcmachado/af3db315e31383502660
## Display this help text.

612
llvm.spec
View File

@ -2,7 +2,7 @@
#region version
%global maj_ver 20
%global min_ver 1
%global patch_ver 4
%global patch_ver 8
#global rc_ver 3
%bcond_with snapshot_build
@ -94,6 +94,37 @@
%bcond_with polly
%endif
#region pgo
%ifarch %{ix86}
%bcond_with pgo
%else
%if 0%{?fedora} >= 43 || (0%{?rhel} >= 9 && %{maj_ver} >= 21)
%bcond_without pgo
%else
%bcond_with pgo
%endif
%endif
# We only want to run the performance comparison on snapshot builds.
# centos-streams/RHEL do not have all the requirements. We tried to use pip,
# but we've seen issues on some architectures. We're now restricting this
# to Fedora.
%if %{with pgo} && %{with snapshot_build} && %{defined fedora}
%global run_pgo_perf_comparison 1
%else
%global run_pgo_perf_comparison %{nil}
%endif
# Sanity checks for PGO and bootstrapping
#----------------------------------------
%if %{with pgo}
%ifarch %{ix86}
%{error:Your architecture is not allowed for PGO because it is in this list: %{ix86}}
%endif
%endif
#----------------------------------------
#endregion pgo
# Disable LTO on x86 and riscv in order to reduce memory consumption.
%ifarch %ix86 riscv64
%bcond_with lto_build
@ -101,7 +132,9 @@
%bcond_without lto_build
%endif
%if %{without lto_build}
# For PGO Disable LTO for now because of LLVMgold.so not found error
# Use LLVM_ENABLE_LTO:BOOL=ON flags to enable LTO instead
%if 0%{without lto_build} || 0%{with pgo}
%global _lto_cflags %nil
%endif
@ -151,6 +184,15 @@
%endif
%endif
# LLD uses "fast" as the algortithm for generating build-id
# values while ld.bfd uses "sha1" by default. We need to get lld
# to use the same algorithm or otherwise we end up with errors like thise one:
#
# "build-id found in [...]/usr/lib64/llvm21/bin/llvm-debuginfod-find too small"
#
# NOTE: Originally this is only needed for PGO but it doesn't hurt to have it on all the time.
%global build_ldflags %{?build_ldflags} -Wl,--build-id=sha1
#region LLVM globals
%if %{with compat_build}
@ -168,15 +210,15 @@
%global install_prefix %{_libdir}/llvm%{maj_ver}
%global install_bindir %{install_prefix}/bin
%global install_includedir %{install_prefix}/include
%global install_libdir %{install_prefix}/lib
%global install_libdir %{install_prefix}/%{_lib}
%global install_datadir %{install_prefix}/share
%global install_mandir %{install_prefix}/share/man
%global install_libexecdir %{install_prefix}/libexec
%global build_libdir llvm/%{_vpath_builddir}/lib
%global unprefixed_libdir lib
%global build_libdir llvm/%{_vpath_builddir}/%{_lib}
%global unprefixed_libdir %{_lib}
%if 0%{?rhel}
%global targets_to_build "X86;AMDGPU;PowerPC;NVPTX;SystemZ;AArch64;BPF;WebAssembly;RISCV"
%global targets_to_build "X86;AMDGPU;PowerPC;NVPTX;SystemZ;AArch64;BPF;WebAssembly;RISCV;RISCV"
%global experimental_targets_to_build ""
%else
%global targets_to_build "all"
@ -261,13 +303,20 @@
#region polly globals
%global pkg_name_polly polly%{pkg_suffix}
#endregion polly globals
#region PGO globals
%if 0%{run_pgo_perf_comparison}
%global llvm_test_suite_dir %{_datadir}/llvm-test-suite
%endif
#endregion PGO globals
#endregion globals
#region packages
#region main package
Name: %{pkg_name_llvm}
Version: %{maj_ver}.%{min_ver}.%{patch_ver}%{?rc_ver:~rc%{rc_ver}}%{?llvm_snapshot_version_suffix:~%{llvm_snapshot_version_suffix}}
Release: 2%{?dist}.alma.1
Release: 1%{?dist}.alma.1
Summary: The Low Level Virtual Machine
License: Apache-2.0 WITH LLVM-exception OR NCSA
@ -324,6 +373,7 @@ Source1000: version.spec.inc
#region CLANG patches
Patch101: 0001-PATCH-clang-Make-funwind-tables-the-default-on-all-a.patch
Patch102: 0003-PATCH-clang-Don-t-install-static-libraries.patch
Patch2002: 20-131099.patch
# Workaround a bug in ORC on ppc64le.
# More info is available here: https://reviews.llvm.org/D159115#4641826
@ -334,14 +384,6 @@ Patch103: 0001-Workaround-a-bug-in-ORC-on-ppc64le.patch
Patch104: 0001-Driver-Give-devtoolset-path-precedence-over-Installe.patch
#endregion CLANG patches
# Fix for glibc >= 2.42
# https://github.com/llvm/llvm-project/pull/137403
Patch2005: 0001-sanitizer_common-Remove-interceptors-for-deprecated-.patch
# Fix for glibc >= 2.42 on ppc64le
Patch2008: 0001-sanitizer_common-Disable-termio-ioctls-on-PowerPC.patch.20
Patch2108: 0001-sanitizer_common-Disable-termio-ioctls-on-PowerPC.patch
# Fix LLVMConfig.cmake when symlinks are used.
# (https://github.com/llvm/llvm-project/pull/124743 landed in LLVM 21)
Patch1902: 0001-cmake-Resolve-symlink-when-finding-install-prefix.patch
@ -352,8 +394,7 @@ Patch106: 0001-19-Always-build-shared-libs-for-LLD.patch
#endregion LLD patches
#region polly patches
Patch2001: 0001-20-polly-shared-libs.patch
Patch2101: 0001-20-polly-shared-libs.patch
Patch107: 0001-20-polly-shared-libs.patch
#endregion polly patches
#region RHEL patches
@ -365,6 +406,18 @@ Patch501: 0001-Fix-page-size-constant-on-aarch64-and-ppc64le.patch
# https://github.com/llvm/llvm-project/issues/124001
Patch1901: 0001-SystemZ-Fix-ICE-with-i128-i64-uaddo-carry-chain.patch
# Fix a pgo miscompilation triggered by building Rust 1.87 with pgo on ppc64le.
# https://github.com/llvm/llvm-project/issues/138208
Patch2004: 0001-CodeGenPrepare-Make-sure-instruction-get-from-SunkAd.patch
# Fix Power9/Power10 crbit spilling
# https://github.com/llvm/llvm-project/pull/146424
Patch108: 21-146424.patch
# Fix for highway package build on ppc64le
Patch2005: 0001-PowerPC-Fix-handling-of-undefs-in-the-PPC-isSplatShu.patch
Patch2006: 0001-Add-REQUIRES-asserts-to-test-added-in-145149-because.patch
%if 0%{?rhel} == 8
%global python3_pkgversion 3.12
%global __python3 /usr/bin/python3.12
@ -389,6 +442,28 @@ BuildRequires: zlib-devel
BuildRequires: libzstd-devel
BuildRequires: libffi-devel
BuildRequires: ncurses-devel
%if %{with pgo}
BuildRequires: lld
BuildRequires: compiler-rt
BuildRequires: llvm
%if 0%{run_pgo_perf_comparison}
BuildRequires: llvm-test-suite
BuildRequires: tcl-devel
BuildRequires: which
# pandas and scipy are needed for running llvm-test-suite/utils/compare.py
# For RHEL we have to install it from pip and for fedora we take the RPM package.
%if 0%{?rhel}
BuildRequires: python3-pip
%else
BuildRequires: python3-pandas
BuildRequires: python3-scipy
%endif
%endif
%endif
# This intentionally does not use python3_pkgversion. RHEL 8 does not have
# python3.12-sphinx, and we are only using it as a binary anyway.
BuildRequires: python3-sphinx
@ -540,9 +615,9 @@ Requires: %{pkg_name_llvm}-static%{?_isa} = %{version}-%{release}
Requires: %{pkg_name_llvm}-test%{?_isa} = %{version}-%{release}
Requires: %{pkg_name_llvm}-googletest%{?_isa} = %{version}-%{release}
%if %{without compat_build}
Requires(pre): alternatives
%endif
Requires(post): alternatives
Requires(postun): alternatives
Provides: llvm-devel(major) = %{maj_ver}
@ -1216,6 +1291,17 @@ export ASMFLAGS="%{build_cflags}"
cd llvm
# Remember old values to reset to
OLD_PATH="$PATH"
OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
OLD_CWD="$PWD"
%global builddir_instrumented $RPM_BUILD_DIR/instrumented-llvm
%if 0%{run_pgo_perf_comparison}
%global builddir_perf_pgo $RPM_BUILD_DIR/performance-of-pgoed-clang
%global builddir_perf_system $RPM_BUILD_DIR/performance-of-system-clang
%endif
#region LLVM lit
%if %{with python_lit}
pushd utils/lit
@ -1258,8 +1344,15 @@ popd
-DCLANG_INCLUDE_TESTS:BOOL=ON \\\
-DCLANG_PLUGIN_SUPPORT:BOOL=ON \\\
-DCLANG_REPOSITORY_STRING="%{?dist_vendor} %{version}-%{release}" \\\
-DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=../clang-tools-extra \\\
-DLLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR=../clang-tools-extra
%if %{with compat_build}
%global cmake_config_args %{cmake_config_args} \\\
-DCLANG_RESOURCE_DIR=../../../lib/clang/%{maj_ver}
%else
%global cmake_config_args %{cmake_config_args} \\\
-DCLANG_RESOURCE_DIR=../lib/clang/%{maj_ver}
%endif
#endregion clang options
#region compiler-rt options
@ -1428,6 +1521,10 @@ popd
%global cmake_config_args %{cmake_config_args} -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="%{optflags} -DNDEBUG"
%endif
%if 0%{?__isa_bits} == 64
%global cmake_config_args %{cmake_config_args} -DLLVM_LIBDIR_SUFFIX=64
%endif
%if %{with gold}
%global cmake_config_args %{cmake_config_args} -DLLVM_BINUTILS_INCDIR=%{_includedir}
%endif
@ -1462,7 +1559,126 @@ if grep 'flags.*la57' /proc/cpuinfo; then
fi
#endregion cmake options
%cmake -G Ninja %cmake_config_args $extra_cmake_args
%if %{with pgo}
#region Instrument LLVM
%global __cmake_builddir %{builddir_instrumented}
# For -Wno-backend-plugin see https://llvm.org/docs/HowToBuildWithPGO.html
#%%global optflags_for_instrumented %(echo %{optflags} -Wno-backend-plugin)
%global cmake_config_args_instrumented %{cmake_config_args} \\\
-DLLVM_ENABLE_PROJECTS:STRING="clang;lld" \\\
-DLLVM_ENABLE_RUNTIMES="compiler-rt" \\\
-DLLVM_TARGETS_TO_BUILD=Native \\\
-DCMAKE_BUILD_TYPE:STRING=Release \\\
-DCMAKE_INSTALL_PREFIX=%{builddir_instrumented} \\\
-DCLANG_INCLUDE_DOCS:BOOL=OFF \\\
-DLLVM_BUILD_DOCS:BOOL=OFF \\\
-DLLVM_BUILD_UTILS:BOOL=OFF \\\
-DLLVM_ENABLE_DOXYGEN:BOOL=OFF \\\
-DLLVM_ENABLE_SPHINX:BOOL=OFF \\\
-DLLVM_INCLUDE_DOCS:BOOL=OFF \\\
-DLLVM_INCLUDE_TESTS:BOOL=OFF \\\
-DLLVM_INSTALL_UTILS:BOOL=OFF \\\
-DCLANG_BUILD_EXAMPLES:BOOL=OFF \\\
\\\
-DLLVM_BUILD_INSTRUMENTED=IR \\\
-DLLVM_BUILD_RUNTIME=No \\\
-DLLVM_ENABLE_LTO:BOOL=Thin \\\
-DLLVM_USE_LINKER=lld
# CLANG_INCLUDE_TESTS=ON is needed to make the target "generate-profdata" available
%global cmake_config_args_instrumented %{cmake_config_args_instrumented} \\\
-DCLANG_INCLUDE_TESTS:BOOL=ON
# LLVM_INCLUDE_UTILS=ON is needed because the tests enabled by CLANG_INCLUDE_TESTS=ON
# require "FileCheck", "not", "count", etc.
%global cmake_config_args_instrumented %{cmake_config_args_instrumented} \\\
-DLLVM_INCLUDE_UTILS:BOOL=ON
# LLVM Profile Warning: Unable to track new values: Running out of static counters.
# Consider using option -mllvm -vp-counters-per-site=<n> to allocate more value profile
# counters at compile time.
%global cmake_config_args_instrumented %{cmake_config_args_instrumented} \\\
-DLLVM_VP_COUNTERS_PER_SITE=8
# TODO(kkleine): Should we see warnings like:
# "function control flow change detected (hash mismatch)"
# then read https://issues.chromium.org/issues/40633598 again.
%cmake -G Ninja %{cmake_config_args_instrumented} $extra_cmake_args
# Build all the tools we need in order to build generate-profdata and llvm-profdata
%cmake_build --target libclang-cpp.so
%cmake_build --target clang
%cmake_build --target lld
%cmake_build --target llvm-profdata
%cmake_build --target llvm-ar
%cmake_build --target llvm-ranlib
%cmake_build --target llvm-cxxfilt
#endregion Instrument LLVM
#region Perf training
# Without these exports the function count is ~160 and with them it is ~200,000.
export LD_LIBRARY_PATH="%{builddir_instrumented}/%{_lib}:%{builddir_instrumented}/lib:$OLD_LD_LIBRARY_PATH"
export PATH="%{builddir_instrumented}/bin:$OLD_PATH"
%cmake_build --target generate-profdata
# Use the newly compiled llvm-profdata to avoid profile version mismatches like:
# "raw profile version mismatch: Profile uses raw profile format version = 10; expected version = 9"
%global llvm_profdata_bin %{builddir_instrumented}/bin/llvm-profdata
%global llvm_cxxfilt_bin %{builddir_instrumented}/bin/llvm-cxxfilt
# Show top 10 functions in the profile
%llvm_profdata_bin show --topn=10 %{builddir_instrumented}/tools/clang/utils/perf-training/clang.profdata | %llvm_cxxfilt_bin
cp %{builddir_instrumented}/tools/clang/utils/perf-training/clang.profdata $RPM_BUILD_DIR/result.profdata
#endregion Perf training
%endif
#region Final stage
#region reset paths and globals
function reset_paths {
export PATH="$OLD_PATH"
export LD_LIBRARY_PATH="$OLD_LD_LIBRARY_PATH"
}
reset_paths
cd $OLD_CWD
%global _vpath_srcdir .
%global __cmake_builddir %{_vpath_builddir}
#endregion reset paths and globals
%global extra_cmake_opts %{nil}
%if %{with pgo}
%global extra_cmake_opts %{extra_cmake_opts} -DLLVM_PROFDATA_FILE=$RPM_BUILD_DIR/result.profdata
# There were a couple of errors that I ran into. One basically said:
#
# Error: LLVM Profile Warning: Unable to track new values: Running out of
# static counters. Consider using option -mllvm -vp-counters-per-site=<n> to
# allocate more value profile counters at compile time.
#
# As a solution Ive added the --vp-counters-per-site option but this resulted
# in a follow-up error:
#
# Error: clang (LLVM option parsing): for the --vp-counters-per-site option:
# may only occur zero or one times!
#
# The solution was to modify vp-counters-per-site option through
# LLVM_VP_COUNTERS_PER_SITE instead of adding it, hence the
# -DLLVM_VP_COUNTERS_PER_SITE=8.
%global extra_cmake_opts %{extra_cmake_opts} -DLLVM_VP_COUNTERS_PER_SITE=8
%if 0%{with lto_build}
%global extra_cmake_opts %{extra_cmake_opts} -DLLVM_ENABLE_LTO:BOOL=Thin
%global extra_cmake_opts %{extra_cmake_opts} -DLLVM_ENABLE_FATLTO=ON
%endif
%global extra_cmake_opts %{extra_cmake_opts} -DLLVM_USE_LINKER=lld
%endif
%cmake -G Ninja %{cmake_config_args} %{extra_cmake_opts} $extra_cmake_args
# Build libLLVM.so first. This ensures that when libLLVM.so is linking, there
# are no other compile jobs running. This will help reduce OOM errors on the
@ -1488,8 +1704,74 @@ fi
# /usr/lib64/libomptarget.devicertl.a
# /usr/lib64/libomptarget-amdgpu-*.bc
# /usr/lib64/libomptarget-nvptx-*.bc
%cmake_build --target runtimes
#endregion Final stage
#region Performance comparison
%if 0%{run_pgo_perf_comparison}
function run_perf_test {
local build_dir=$1
cd %{llvm_test_suite_dir}
%__cmake -G Ninja \
-S "%{llvm_test_suite_dir}" \
-B "${build_dir}" \
-DCMAKE_GENERATOR=Ninja \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DTEST_SUITE_BENCHMARKING_ONLY=ON \
-DTEST_SUITE_COLLECT_STATS=ON \
-DTEST_SUITE_USE_PERF=OFF \
-DTEST_SUITE_SUBDIRS=CTMark \
-DTEST_SUITE_RUN_BENCHMARKS=OFF \
-DTEST_SUITE_COLLECT_CODE_SIZE=OFF \
-C%{llvm_test_suite_dir}/cmake/caches/O3.cmake
# Build the test-suite
%__cmake --build "${build_dir}" -j1 --verbose
# Run the tests with lit:
%{builddir_instrumented}/bin/llvm-lit -v -o ${build_dir}/results.json ${build_dir} || true
cd $OLD_CWD
}
# Run performance test for system clang
reset_paths
run_perf_test %{builddir_perf_system}
# Run performance test for PGOed clang
reset_paths
FINAL_BUILD_DIR=`pwd`/%{_vpath_builddir}
export LD_LIBRARY_PATH="${FINAL_BUILD_DIR}/lib:${FINAL_BUILD_DIR}/lib64:${LD_LIBRARY_PATH}"
export PATH="${FINAL_BUILD_DIR}/bin:${OLD_PATH}"
run_perf_test %{builddir_perf_pgo}
# Compare the performance of system and PGOed clang
%if 0%{?rhel}
python3 -m venv compare-env
source ./compare-env/bin/activate
pip install "pandas>=2.2.3"
pip install "scipy>=1.13.1"
MY_PYTHON_BIN=./compare-env/bin/python3
%endif
system_llvm_release=$(/usr/bin/clang --version | grep -Po '[0-9]+\.[0-9]+\.[0-9]' | head -n1)
${MY_PYTHON_BIN} %{llvm_test_suite_dir}/utils/compare.py \
--metric compile_time \
--lhs-name ${system_llvm_release} \
--rhs-name pgo-%{version} \
%{builddir_perf_system}/results.json vs %{builddir_perf_pgo}/results.json > %{builddir_perf_pgo}/results-system-vs-pgo.txt || true
echo "Result of Performance comparison between system and PGOed clang"
cat %{builddir_perf_pgo}/results-system-vs-pgo.txt
%if 0%{?rhel}
# Deactivate virtual python environment created ealier
deactivate
%endif
%endif
#endregion Performance comparison
#region compat lib
cd ..
@ -1612,6 +1894,14 @@ EOF
# Add a symlink in bindir to clang-format-diff
ln -s ../share/clang/clang-format-diff.py %{buildroot}%{install_bindir}/clang-format-diff
# Install the PGO profile that was used to build this LLVM into the clang package
%if 0%{with pgo}
cp -v $RPM_BUILD_DIR/result.profdata %{buildroot}%{install_datadir}/llvm-pgo.profdata
%if 0%{run_pgo_perf_comparison}
cp -v %{builddir_perf_pgo}/results-system-vs-pgo.txt %{buildroot}%{install_datadir}/results-system-vs-pgo.txt
%endif
%endif
# File in the macros file for other packages to use. We are not doing this
# in the compat package, because the version macros would # conflict with
# eachother if both clang and the clang compat package were installed together.
@ -1632,7 +1922,7 @@ install -p -m644 clang/bindings/python/clang/* %{buildroot}%{python3_sitelib}/cl
%py_byte_compile %{__python3} %{buildroot}%{python3_sitelib}/clang
# install scanbuild-py to python sitelib.
mv %{buildroot}%{install_libdir}/{libear,libscanbuild} %{buildroot}%{python3_sitelib}
mv %{buildroot}%{install_prefix}/lib/{libear,libscanbuild} %{buildroot}%{python3_sitelib}
# Cannot use {libear,libscanbuild} style expansion in py_byte_compile.
%py_byte_compile %{__python3} %{buildroot}%{python3_sitelib}/libear
%py_byte_compile %{__python3} %{buildroot}%{python3_sitelib}/libscanbuild
@ -1646,7 +1936,7 @@ done
%else
# Not sure where to put these python modules for the compat build.
rm -Rf %{buildroot}%{install_libdir}/{libear,libscanbuild}
rm -Rf %{buildroot}%{install_prefix}/lib/{libear,libscanbuild}
rm %{buildroot}%{install_bindir}/scan-build-py
# Not sure where to put the emacs integration files for the compat build.
@ -1673,8 +1963,12 @@ rm -Rvf %{buildroot}%{install_datadir}/clang-doc
# TODO: What are the Fedora guidelines for packaging bash autocomplete files?
rm -vf %{buildroot}%{install_datadir}/clang/bash-autocomplete.sh
# Create sub-directories in the clang resource directory that will be
# populated by other packages
%if %{without compat_build}
# Move clang resource directory to default prefix.
mkdir -p %{buildroot}%{_prefix}/lib/clang
mv %{buildroot}%{install_prefix}/lib/clang/%{maj_ver} %{buildroot}%{_prefix}/lib/clang/%{maj_ver}
%endif
# Create any missing sub-directories in the clang resource directory.
mkdir -p %{buildroot}%{_prefix}/lib/clang/%{maj_ver}/{bin,include,lib,share}/
# Add versioned resource directory macro
@ -1760,7 +2054,7 @@ rmdir %{buildroot}%{install_prefix}/%{_lib}/python%{python3_version}
# python: fix binary libraries location
liblldb=$(basename $(readlink -e %{buildroot}%{install_libdir}/liblldb.so))
ln -vsf "../../../llvm%{maj_ver}/lib/${liblldb}" %{buildroot}%{python3_sitearch}/lldb/_lldb.so
ln -vsf "../../../${liblldb}" %{buildroot}%{python3_sitearch}/lldb/_lldb.so
%py_byte_compile %{__python3} %{buildroot}%{python3_sitearch}/lldb
%endif
%endif
@ -1801,45 +2095,9 @@ popd
rm -f %{buildroot}%{install_libdir}/libLLVMBOLT*.a
#endregion BOLT installation
# Do not create symlinks for i686 to avoid multilib conflicts.
# Don't ship man pages altogether.
%ifarch %{ix86}
rm -rf %{buildroot}%{install_mandir}
%else
# Create symlinks from the system install prefix to the llvm install prefix.
# Do this at the end so it includes any files added by preceding steps.
mkdir -p %{buildroot}%{_bindir}
for f in %{buildroot}%{install_bindir}/*; do
filename=`basename $f`
if [[ "$filename" == "clang-%{maj_ver}" ]]; then
continue
fi
# Add symlink for binaries with version suffix.
ln -s ../../%{install_bindir}/$filename %{buildroot}/%{_bindir}/$filename-%{maj_ver}
# For non-compat builds, also add a symlink without version suffix.
%if %{without compat_build}
ln -s ../../%{install_bindir}/$filename %{buildroot}/%{_bindir}/$filename
%endif
done
# Move man pages to system install prefix.
mkdir -p %{buildroot}%{_mandir}/man1
for f in %{buildroot}%{install_mandir}/man1/*; do
filename=`basename $f`
filename=${filename%.1}
mv $f %{buildroot}%{_mandir}/man1/$filename-%{maj_ver}.1
%if %{without compat_build}
ln -s $filename-%{maj_ver}.1 %{buildroot}%{_mandir}/man1/$filename.1
%endif
done
rmdir %{buildroot}%{install_mandir}/man1
rmdir %{buildroot}%{install_mandir}
%if %{without compat_build}
# We don't create directory symlinks, because RPM does not support
# switching between a directory and a symlink, causing upgrade/downgrade issues.
# Instead, recursively copy the directories while creating symlinks.
copy_with_relative_symlinks() {
# Move files from src to dest and replace the old files in src with relative
# symlinks.
move_and_replace_with_symlinks() {
local src="$1"
local dest="$2"
mkdir -p "$dest"
@ -1847,22 +2105,65 @@ copy_with_relative_symlinks() {
# Change to source directory to simplify relative paths
(cd "$src" && \
find * -type d -exec mkdir -p "$dest/{}" \; && \
find * \( -type f -o -type l \) -exec ln -s --relative "$src/{}" "$dest/{}" \;)
find * \( -type f -o -type l \) -exec mv "$src/{}" "$dest/{}" \; \
-exec ln -s --relative "$dest/{}" "$src/{}" \;)
}
# Add symlinks for libraries.
copy_with_relative_symlinks %{buildroot}%{install_libdir} %{buildroot}%{_libdir}
copy_with_relative_symlinks %{buildroot}%{install_libexecdir} %{buildroot}%{_libexecdir}
copy_with_relative_symlinks %{buildroot}%{install_includedir} %{buildroot}%{_includedir}
copy_with_relative_symlinks %{buildroot}%{install_datadir} %{buildroot}%{_datadir}
%if %{without compat_build}
# Move files from the llvm prefix to the system prefix and replace them with
# symlinks. We do it this way around because symlinks between multilib packages
# would conflict otherwise.
move_and_replace_with_symlinks %{buildroot}%{install_bindir} %{buildroot}%{_bindir}
move_and_replace_with_symlinks %{buildroot}%{install_libdir} %{buildroot}%{_libdir}
move_and_replace_with_symlinks %{buildroot}%{install_libexecdir} %{buildroot}%{_libexecdir}
move_and_replace_with_symlinks %{buildroot}%{install_includedir} %{buildroot}%{_includedir}
move_and_replace_with_symlinks %{buildroot}%{install_datadir} %{buildroot}%{_datadir}
%endif
%if %{maj_ver} >= 21 && %{with offload}
# Remove offload libaries since we only want to ship these in the configured
# install prefix.
rm -Rf %{buildroot}%{_libdir}/amdgcn-amd-amdhsa
rm -Rf %{buildroot}%{_libdir}/nvptx64-nvidia-cuda
%endif
# Create versioned symlinks for binaries.
# Do this at the end so it includes any files added by preceding steps.
mkdir -p %{buildroot}%{_bindir}
for f in %{buildroot}%{install_bindir}/*; do
filename=`basename $f`
if [[ "$filename" =~ ^(lit|ld|clang-%{maj_ver})$ ]]; then
continue
fi
%if %{with compat_build}
ln -s ../../%{install_bindir}/$filename %{buildroot}/%{_bindir}/$filename-%{maj_ver}
%else
# clang-NN is already created by the build system.
if [[ "$filename" == "clang" ]]; then
continue
fi
ln -s $filename %{buildroot}/%{_bindir}/$filename-%{maj_ver}
%endif
done
mkdir -p %{buildroot}%{_mandir}/man1
for f in %{buildroot}%{install_mandir}/man1/*; do
filename=`basename $f`
filename=${filename%.1}
%if %{with compat_build}
# Move man pages to system install prefix.
mv $f %{buildroot}%{_mandir}/man1/$filename-%{maj_ver}.1
%else
# Create suffixed symlink.
ln -s $filename.1 %{buildroot}%{_mandir}/man1/$filename-%{maj_ver}.1
%endif
done
rm -rf %{buildroot}%{install_mandir}
# As an exception, always keep llvm-config in the versioned prefix.
# The llvm-config in the default prefix will be managed by alternatives.
%if %{without compat_build}
rm %{buildroot}%{install_bindir}/llvm-config
mv %{buildroot}%{_bindir}/llvm-config %{buildroot}%{install_bindir}/llvm-config
%endif
# ghost presence for llvm-config, managed by alternatives.
touch %{buildroot}%{_bindir}/llvm-config-%{maj_ver}
%if %{without compat_build}
touch %{buildroot}%{_bindir}/llvm-config
%endif
%if %{with bundle_compat_lib}
@ -2041,13 +2342,14 @@ export LIT_XFAIL="$LIT_XFAIL;api_tests/test_ompd_get_curr_parallel_handle.c"
export LIT_XFAIL="$LIT_XFAIL;api_tests/test_ompd_get_display_control_vars.c"
export LIT_XFAIL="$LIT_XFAIL;api_tests/test_ompd_get_thread_handle.c"
%if %{with pgo}
# TODO(kkleine): I unset LIT_XFAIL here because the tests above unexpectedly passed since Aug 16th on fedora-40-x86_64
unset LIT_XFAIL
%endif
# The following test is flaky and we'll filter it out
test_list_filter_out+=("libomp :: ompt/teams/distribute_dispatch.c")
test_list_filter_out+=("libomp :: affinity/kmp-abs-hw-subset.c")
test_list_filter_out+=("libomp :: parallel/bug63197.c")
test_list_filter_out+=("libomp :: tasking/issue-69733.c")
test_list_filter_out+=("libarcher :: races/task-taskgroup-unrelated.c")
test_list_filter_out+=("libarcher :: races/task-taskwait-nested.c")
test_list_filter_out+=("libomp :: ompt/teams/distribute_dispatch.c")
# These tests fail more often than not, but not always.
test_list_filter_out+=("libomp :: worksharing/for/omp_collapse_many_GELTGT_int.c")
@ -2055,22 +2357,31 @@ test_list_filter_out+=("libomp :: worksharing/for/omp_collapse_many_GTGEGT_int.c
test_list_filter_out+=("libomp :: worksharing/for/omp_collapse_many_LTLEGE_int.c")
test_list_filter_out+=("libomp :: worksharing/for/omp_collapse_one_int.c")
%if %{maj_ver} < 21
# The following test is flaky and we'll filter it out
test_list_filter_out+=("libomp :: parallel/bug63197.c")
test_list_filter_out+=("libomp :: tasking/issue-69733.c")
test_list_filter_out+=("libarcher :: races/task-taskgroup-unrelated.c")
# The following tests have been failing intermittently.
# Issue upstream: https://github.com/llvm/llvm-project/issues/127796
test_list_filter_out+=("libarcher :: races/task-two.c")
test_list_filter_out+=("libarcher :: races/lock-nested-unrelated.c")
%endif
%ifarch s390x
test_list_filter_out+=("libomp :: flush/omp_flush.c")
test_list_filter_out+=("libomp :: worksharing/for/omp_for_schedule_guided.c")
%endif
%if %{maj_ver} < 21
%ifarch aarch64 s390x
# The following test has been failing intermittently on aarch64 and s390x.
# Re-enable it after https://github.com/llvm/llvm-project/issues/117773
# gets fixed.
test_list_filter_out+=("libarcher :: races/taskwait-depend.c")
%endif
%endif
# The following tests seem pass on ppc64le and x86_64 and aarch64 only:
%ifnarch ppc64le x86_64 s390x aarch64
@ -2114,6 +2425,7 @@ export LIT_XFAIL="$LIT_XFAIL;races/task-dependency.c"
export LIT_XFAIL="$LIT_XFAIL;races/task-taskgroup-unrelated.c"
export LIT_XFAIL="$LIT_XFAIL;races/task-two.c"
export LIT_XFAIL="$LIT_XFAIL;races/taskwait-depend.c"
export LIT_XFAIL="$LIT_XFAIL;races/task-taskwait-nested.c"
export LIT_XFAIL="$LIT_XFAIL;reduction/parallel-reduction-nowait.c"
export LIT_XFAIL="$LIT_XFAIL;reduction/parallel-reduction.c"
export LIT_XFAIL="$LIT_XFAIL;task/omp_task_depend_all.c"
@ -2172,6 +2484,19 @@ export LIT_XFAIL="$LIT_XFAIL;offloading/thread_state_2.c"
adjust_lit_filter_out test_list_filter_out
%if %{maj_ver} >= 21
# This allows openmp tests to be re-run 4 times. Once they pass
# after being re-run, they are marked as FLAKYPASS.
# See https://github.com/llvm/llvm-project/pull/141851 for the
# --max-retries-per-test option.
# We don't know if 4 is the right number to use here we just
# need to start with some number.
# Once https://github.com/llvm/llvm-project/pull/142413 landed
# we can see the exact number of attempts the tests needed
# to pass. And then we can adapt this number.
export LIT_OPTS="$LIT_OPTS --max-retries-per-test=4"
%endif
%if 0%{?rhel}
# libomp tests are often very slow on s390x brew builders
%ifnarch s390x riscv64
@ -2301,14 +2626,42 @@ cp %{_vpath_builddir}/.ninja_log %{buildroot}%{_datadir}
%ldconfig_scriptlets -n %{pkg_name_lld}-libs
%endif
%post -n %{pkg_name_llvm}-devel
update-alternatives --install %{_bindir}/llvm-config-%{maj_ver} llvm-config-%{maj_ver} %{install_bindir}/llvm-config %{__isa_bits}
%if %{without compat_build}
%pre -n %{pkg_name_llvm}-devel
# llvm-config used to be managed by alternatives.
# Remove them if they still exist.
update-alternatives --remove-all llvm-config 2>/dev/null || :
%if %{maj_ver} <= 20
update-alternatives --remove-all llvm-config-%{maj_ver} 2>/dev/null || :
# Prioritize newer LLVM versions over older and 64-bit over 32-bit.
update-alternatives --install %{_bindir}/llvm-config llvm-config %{install_bindir}/llvm-config $((%{maj_ver}*100+%{__isa_bits}))
# Remove old llvm-config-%{__isa_bits} alternative. This will only do something during the
# first upgrade from a version that used it. In all other cases it will error, so suppress the
# expected error message.
update-alternatives --remove llvm-config %{_bindir}/llvm-config-%{__isa_bits} 2>/dev/null ||:
# During the upgrade from LLVM 16 (F38) to LLVM 17 (F39), we found out the
# main llvm-devel package was leaving entries in the alternatives system.
# Try to remove them now.
for v in 14 15 16; do
if [[ -e %{_bindir}/llvm-config-$v
&& "x$(%{_bindir}/llvm-config-$v --version | awk -F . '{ print $1 }')" != "x$v" ]]; then
update-alternatives --remove llvm-config-$v %{install_bindir}/llvm-config%{exec_suffix}-%{__isa_bits}
fi
done
%endif
%postun -n %{pkg_name_llvm}-devel
if [ $1 -eq 0 ]; then
update-alternatives --remove llvm-config%{exec_suffix} %{install_bindir}/llvm-config
fi
%if %{without compat_build}
# There are a number of different cases here:
# Uninstall: Remove alternatives.
# Patch version upgrade: Keep alternatives.
# Major version upgrade with installation of compat package: Keep alternatives for compat package.
# Major version upgrade without installation of compat package: Remove alternatives. However, we
# can't distinguish it from the previous case, so we conservatively leave it behind.
if [ $1 -eq 0 ]; then
update-alternatives --remove llvm-config-%{maj_ver} %{install_bindir}/llvm-config
fi
%endif
%if %{without compat_build}
@ -2329,24 +2682,20 @@ fi
local maj_ver = rpm.expand("%{maj_ver}")
for arg in rpm.expand("%*"):gmatch("%S+") do
print(install_bindir .. "/" .. arg .. "\\n")
if not rpm.expand("%{ix86}"):find(rpm.expand("%{_arch}")) then
print(bindir .. "/" .. arg .. "-" .. maj_ver .. "\\n")
if rpm.expand("%{without compat_build}") == "1" then
print(bindir .. "/" .. arg .. "\\n")
end
print(bindir .. "/" .. arg .. "-" .. maj_ver .. "\\n")
if rpm.expand("%{without compat_build}") == "1" then
print(bindir .. "/" .. arg .. "\\n")
end
end
}
%define expand_mans() %{lua:
if not rpm.expand("%{ix86}"):find(rpm.expand("%{_arch}")) then
local mandir = rpm.expand("%{_mandir}")
local maj_ver = rpm.expand("%{maj_ver}")
for arg in rpm.expand("%*"):gmatch("%S+") do
print(mandir .. "/man1/" .. arg .. "-" .. maj_ver .. ".1.gz\\n")
if rpm.expand("%{without compat_build}") == "1" then
print(mandir .. "/man1/" .. arg .. ".1.gz\\n")
end
local mandir = rpm.expand("%{_mandir}")
local maj_ver = rpm.expand("%{maj_ver}")
for arg in rpm.expand("%*"):gmatch("%S+") do
print(mandir .. "/man1/" .. arg .. "-" .. maj_ver .. ".1.gz\\n")
if rpm.expand("%{without compat_build}") == "1" then
print(mandir .. "/man1/" .. arg .. ".1.gz\\n")
end
end
}
@ -2356,8 +2705,7 @@ fi
local install_dir = rpm.expand("%{-i*}")
for arg in rpm.expand("%*"):gmatch("%S+") do
print(install_dir .. "/" .. arg .. "\\n")
if rpm.expand("%{without compat_build}") == "1" and
not rpm.expand("%{ix86}"):find(rpm.expand("%{_arch}")) then
if rpm.expand("%{without compat_build}") == "1" then
print(dir .. "/" .. arg .. "\\n")
end
end
@ -2487,6 +2835,12 @@ fi
}}
%endif
%if %{maj_ver} >= 22
%{expand_bins %{expand:
llvm-ir2vec
}}
%endif
%{expand_mans %{expand:
bugpoint
clang-tblgen
@ -2545,6 +2899,12 @@ fi
tblgen
}}
%if %{maj_ver} >= 22
%{expand_mans %{expand:
llvm-ir2vec
}}
%endif
%expand_datas opt-viewer
%files -n %{pkg_name_llvm}-libs
@ -2572,7 +2932,12 @@ fi
%files -n %{pkg_name_llvm}-devel
%license llvm/LICENSE.TXT
%expand_bins llvm-config
%{install_bindir}/llvm-config
%ghost %{_bindir}/llvm-config-%{maj_ver}
%if %{without compat_build}
%ghost %{_bindir}/llvm-config
%endif
%expand_mans llvm-config
%expand_includes llvm llvm-c
%{expand_libs %{expand:
@ -2590,11 +2955,9 @@ fi
%exclude %{install_libdir}/libLLVMTestingSupport.a
%exclude %{install_libdir}/libLLVMTestingAnnotations.a
%if %{without compat_build}
%ifnarch %{ix86}
%exclude %{_libdir}/libLLVMTestingSupport.a
%exclude %{_libdir}/libLLVMTestingAnnotations.a
%endif
%endif
%files -n %{pkg_name_llvm}-cmake-utils
%license llvm/LICENSE.TXT
@ -2610,6 +2973,14 @@ fi
llvm-isel-fuzzer
llvm-opt-fuzzer
}}
%if %{maj_ver} >= 21
%{expand_bins %{expand:
llvm-test-mustache-spec
}}
%{expand_mans %{expand:
llvm-test-mustache-spec
}}
%endif
%files -n %{pkg_name_llvm}-googletest
%license llvm/LICENSE.TXT
@ -2649,6 +3020,14 @@ fi
%endif
%{expand_mans clang clang++}
%if 0%{with pgo}
%{expand_datas %{expand: llvm-pgo.profdata }}
%if 0%{run_pgo_perf_comparison}
%{expand_datas %{expand: results-system-vs-pgo.txt }}
%endif
%endif
%files -n %{pkg_name_clang}-libs
%license clang/LICENSE.TXT
%{_prefix}/lib/clang/%{maj_ver}/include/*
@ -2679,10 +3058,8 @@ fi
%expand_bins clang-tblgen
%dir %{install_datadir}/clang/
%if %{without compat_build}
%ifnarch %{ix86}
%dir %{_datadir}/clang
%endif
%endif
%files -n %{pkg_name_clang}-resource-filesystem
%license clang/LICENSE.TXT
@ -2857,10 +3234,12 @@ fi
libomptarget-nvptx*.bc
}}
%else
%{install_libdir}/amdgcn-amd-amdhsa/libompdevice.a
%{install_libdir}/amdgcn-amd-amdhsa/libomptarget-amdgpu.bc
%{install_libdir}/nvptx64-nvidia-cuda/libompdevice.a
%{install_libdir}/nvptx64-nvidia-cuda/libomptarget-nvptx.bc
%{expand_libs %{expand:
amdgcn-amd-amdhsa/libompdevice.a
amdgcn-amd-amdhsa/libomptarget-amdgpu.bc
nvptx64-nvidia-cuda/libompdevice.a
nvptx64-nvidia-cuda/libomptarget-nvptx.bc
}}
%endif
%expand_includes offload
@ -3096,10 +3475,13 @@ fi
#region changelog
%changelog
* Tue Jul 29 2025 Eduard Abdullin <eabdullin@almalinux.org> - 20.1.4-2.alma.1
* Wed Aug 13 2025 Eduard Abdullin <eabdullin@almalinux.org> - 20.1.8-1.alma.1
- Use x86_64-redhat-linux as default gcc triple for x86_64_v2
- Add riscv64 support
* Wed Jul 30 2025 Tom Stellard <tstellar@redhat.com> - 20.1.8-1
- LLVM 20.1.8 relase
* Mon Jul 28 2025 Tom Stellard <tstellar@redhat.com> - 20.1.4-2
- Remove bundled llvm19 compat package

View File

@ -1,4 +1,9 @@
---
inspections:
# We need to disable abidiff due to abidiff+testing-farm issues. Ref link:
# https://docs.testing-farm.io/Testing%20Farm/0.1/errors.html#TFE-1
abidiff: off
badfuncs:
# For compiler-rt, we allow the following forbidden functions:
# - gethostbyname

View File

@ -1,4 +1,2 @@
SHA512 (llvm-project-20.1.4.src.tar.xz) = acace8175a5468c7e84a89d1564e147e81fe92b6d910f22b058edf72094b27176677c06dbe141fccfbabdad77165f957bbf1ec8aff7bffc85f0757c0103f7e59
SHA512 (llvm-project-20.1.4.src.tar.xz.sig) = 634414ea877724ebdeeabe3bb1079d78938aa05dba2243d5458cf211c35444124dc01fa73a593548290196f8c0e40e1e6a4a72571dba4b716b5781c656c6f9b2
SHA512 (llvm-project-19.1.7.src.tar.xz) = c7d63286d662707a9cd54758c9e3aaf52794a91900c484c4a6efa62d90bc719d5e7a345e4192feeb0c9fd11c82570d64677c781e5be1d645556b6aa018e47ec8
SHA512 (llvm-project-19.1.7.src.tar.xz.sig) = 195797b06ac80a742e0ccbc03a50dc06dd2e04377d783d5474e3e72c5a75203b60292b047929312a411d22b137a239943fba414a4d136a2be14cbff978eb6bda
SHA512 (llvm-project-20.1.8.src.tar.xz) = f330e72e6a1da468569049437cc0ba7a41abb816ccece7367189344f7ebfef730f4788ac7af2bef0aa8a49341c15ab1d31e941ffa782f264d11fe0dc05470773
SHA512 (llvm-project-20.1.8.src.tar.xz.sig) = d74369bdb4d1b82775161ea53c9c5f3a23ce810f4df5ff617123023f9d8ce720e7d6ecc9e17f8ebd39fd9e7a9de79560abdf2ffe73bcb907a43148d43665d619

View File

@ -1,9 +1,9 @@
# Gating testplans for LLVM
The tests for LLVM are in a dedicated, separate repo: https://gitlab.com/redhat/centos-stream/tests/llvm.git
The tests for LLVM are in a separate repo:
* llvm: https://src.fedoraproject.org/tests/llvm.git/
This directory should contain only fmf plans (such as build-gating.fmf) which import
the tests from the tests repo. This can be done using the "url" parameter of the
plan's "discover" step.
Reference: https://tmt.readthedocs.io/en/stable/spec/plans.html#fmf
plan's "discover" step. Reference: https://tmt.readthedocs.io/en/stable/spec/plans.html#fmf