diff --git a/.files b/.files
index da50c96..8b9d58a 100644
Binary files a/.files and b/.files differ
diff --git a/.rev b/.rev
index 167ba84..272247e 100644
--- a/.rev
+++ b/.rev
@@ -1065,4 +1065,12 @@
966170
+
+ 607281e8e5dc2490060f77c2be105658
+ 4.00c
+
+ dimstar_suse
+ - Add llvm14-fix-build.patch: fix build with LLVM 14. (forwarded request 980763 from aaronpuchert)
+ 980919
+
diff --git a/afl.changes b/afl.changes
index 4bc460b..eda64b6 100644
--- a/afl.changes
+++ b/afl.changes
@@ -1,4 +1,9 @@
-------------------------------------------------------------------
+Sat Jun 4 13:26:34 UTC 2022 - Aaron Puchert
+
+- Add llvm14-fix-build.patch: fix build with LLVM 14.
+
+-------------------------------------------------------------------
Wed Feb 23 22:21:07 UTC 2022 - Aaron Puchert
- Fix build with armv7l on Leap: we have afl-llvm-rt-lto{,-32}.o.
diff --git a/afl.spec b/afl.spec
index 730ba35..77c8e51 100644
--- a/afl.spec
+++ b/afl.spec
@@ -45,6 +45,7 @@ URL: https://github.com/AFLplusplus/AFLplusplus
Source: https://github.com/AFLplusplus/AFLplusplus/archive/%{version}.tar.gz
Source1: afl-rpmlintrc
Patch1: afl-3.0c-fix-paths.patch
+Patch2: https://github.com/AFLplusplus/AFLplusplus/commit/675d17d737ee5dee88766d9c181567771592c94c.patch#/llvm14-fix-build.patch
BuildRequires: clang
BuildRequires: gcc-c++
%ifarch x86_64
@@ -76,6 +77,7 @@ use cases - say, common image parsing or file compression libraries.
%prep
%setup -q -n AFLplusplus-%version
%patch1 -p1
+%patch2 -p1
sed -i 's|#!/usr/bin/env sh|#!/bin/sh|g' afl-cmin
sed -i 's|#!/usr/bin/env bash|#!/bin/bash|g' afl-cmin.bash
diff --git a/llvm14-fix-build.patch b/llvm14-fix-build.patch
new file mode 100644
index 0000000..9d8aa43
--- /dev/null
+++ b/llvm14-fix-build.patch
@@ -0,0 +1,140 @@
+From 05119990b6075aaf8f16a385a763651f68b8b1ef Mon Sep 17 00:00:00 2001
+From: Raphael Isemann
+Date: Tue, 22 Feb 2022 10:54:51 +0100
+Subject: [PATCH] LLVM 14 fixes
+
+---
+ instrumentation/SanitizerCoverageLTO.so.cc | 5 +++--
+ instrumentation/SanitizerCoveragePCGUARD.so.cc | 1 +
+ instrumentation/afl-llvm-dict2file.so.cc | 4 ++--
+ instrumentation/afl-llvm-lto-instrumentlist.so.cc | 1 +
+ instrumentation/afl-llvm-pass.so.cc | 1 +
+ instrumentation/compare-transform-pass.so.cc | 4 ++--
+ src/afl-cc.c | 4 ++--
+ 7 files changed, 12 insertions(+), 8 deletions(-)
+
+diff --git a/instrumentation/SanitizerCoverageLTO.so.cc b/instrumentation/SanitizerCoverageLTO.so.cc
+index 6a4a071f7..1bdc53768 100644
+--- a/instrumentation/SanitizerCoverageLTO.so.cc
++++ b/instrumentation/SanitizerCoverageLTO.so.cc
+@@ -17,6 +17,7 @@
+ #include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
+ #include "llvm/ADT/ArrayRef.h"
+ #include "llvm/ADT/SmallVector.h"
++#include "llvm/ADT/Triple.h"
+ #include "llvm/Analysis/EHPersonalities.h"
+ #include "llvm/Analysis/PostDominators.h"
+ #include "llvm/Analysis/ValueTracking.h"
+@@ -757,7 +758,7 @@ bool ModuleSanitizerCoverage::instrumentModule(
+ if (!HasStr2) {
+
+ auto *Ptr = dyn_cast(Str2P);
+- if (Ptr && Ptr->isGEPWithNoNotionalOverIndexing()) {
++ if (Ptr && Ptr->getOpcode() == Instruction::GetElementPtr) {
+
+ if (auto *Var = dyn_cast(Ptr->getOperand(0))) {
+
+@@ -838,7 +839,7 @@ bool ModuleSanitizerCoverage::instrumentModule(
+
+ auto Ptr = dyn_cast(Str1P);
+
+- if (Ptr && Ptr->isGEPWithNoNotionalOverIndexing()) {
++ if (Ptr && Ptr->getOpcode() == Instruction::GetElementPtr) {
+
+ if (auto *Var = dyn_cast(Ptr->getOperand(0))) {
+
+diff --git a/instrumentation/SanitizerCoveragePCGUARD.so.cc b/instrumentation/SanitizerCoveragePCGUARD.so.cc
+index e4ffeb508..48bb5a2cc 100644
+--- a/instrumentation/SanitizerCoveragePCGUARD.so.cc
++++ b/instrumentation/SanitizerCoveragePCGUARD.so.cc
+@@ -13,6 +13,7 @@
+ #include "llvm/Transforms/Instrumentation/SanitizerCoverage.h"
+ #include "llvm/ADT/ArrayRef.h"
+ #include "llvm/ADT/SmallVector.h"
++#include "llvm/ADT/Triple.h"
+ #include "llvm/Analysis/EHPersonalities.h"
+ #include "llvm/Analysis/PostDominators.h"
+ #include "llvm/IR/CFG.h"
+diff --git a/instrumentation/afl-llvm-dict2file.so.cc b/instrumentation/afl-llvm-dict2file.so.cc
+index 391246606..94dc6984d 100644
+--- a/instrumentation/afl-llvm-dict2file.so.cc
++++ b/instrumentation/afl-llvm-dict2file.so.cc
+@@ -435,7 +435,7 @@ bool AFLdict2filePass::runOnModule(Module &M) {
+ if (!HasStr2) {
+
+ auto *Ptr = dyn_cast(Str2P);
+- if (Ptr && Ptr->isGEPWithNoNotionalOverIndexing()) {
++ if (Ptr && Ptr->getOpcode() == Instruction::GetElementPtr) {
+
+ if (auto *Var = dyn_cast(Ptr->getOperand(0))) {
+
+@@ -519,7 +519,7 @@ bool AFLdict2filePass::runOnModule(Module &M) {
+
+ auto Ptr = dyn_cast(Str1P);
+
+- if (Ptr && Ptr->isGEPWithNoNotionalOverIndexing()) {
++ if (Ptr && Ptr->getOpcode() == Instruction::GetElementPtr) {
+
+ if (auto *Var = dyn_cast(Ptr->getOperand(0))) {
+
+diff --git a/instrumentation/afl-llvm-lto-instrumentlist.so.cc b/instrumentation/afl-llvm-lto-instrumentlist.so.cc
+index 35ba9c5a0..2ddbc7253 100644
+--- a/instrumentation/afl-llvm-lto-instrumentlist.so.cc
++++ b/instrumentation/afl-llvm-lto-instrumentlist.so.cc
+@@ -43,6 +43,7 @@
+ #include "llvm/IR/IRBuilder.h"
+ #include "llvm/IR/LegacyPassManager.h"
+ #include "llvm/IR/Module.h"
++#include "llvm/Pass.h"
+ #include "llvm/Support/Debug.h"
+ #include "llvm/Transforms/IPO/PassManagerBuilder.h"
+ #include "llvm/IR/CFG.h"
+diff --git a/instrumentation/afl-llvm-pass.so.cc b/instrumentation/afl-llvm-pass.so.cc
+index 5246ba089..6419cd1dc 100644
+--- a/instrumentation/afl-llvm-pass.so.cc
++++ b/instrumentation/afl-llvm-pass.so.cc
+@@ -45,6 +45,7 @@ typedef long double max_align_t;
+ #endif
+
+ #include "llvm/IR/IRBuilder.h"
++#include "llvm/Pass.h"
+ #include "llvm/IR/LegacyPassManager.h"
+ #include "llvm/IR/BasicBlock.h"
+ #include "llvm/IR/Module.h"
+diff --git a/instrumentation/compare-transform-pass.so.cc b/instrumentation/compare-transform-pass.so.cc
+index c3a4ee344..1e250d7aa 100644
+--- a/instrumentation/compare-transform-pass.so.cc
++++ b/instrumentation/compare-transform-pass.so.cc
+@@ -246,7 +246,7 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
+ if (!(HasStr1 || HasStr2)) {
+
+ auto *Ptr = dyn_cast(Str2P);
+- if (Ptr && Ptr->isGEPWithNoNotionalOverIndexing()) {
++ if (Ptr && Ptr->getOpcode() == Instruction::GetElementPtr) {
+
+ if (auto *Var = dyn_cast(Ptr->getOperand(0))) {
+
+@@ -271,7 +271,7 @@ bool CompareTransform::transformCmps(Module &M, const bool processStrcmp,
+ if (!HasStr2) {
+
+ Ptr = dyn_cast(Str1P);
+- if (Ptr && Ptr->isGEPWithNoNotionalOverIndexing()) {
++ if (Ptr && Ptr->getOpcode() == Instruction::GetElementPtr) {
+
+ if (auto *Var = dyn_cast(Ptr->getOperand(0))) {
+
+diff --git a/src/afl-cc.c b/src/afl-cc.c
+index ed57ca1ed..bacd9de96 100644
+--- a/src/afl-cc.c
++++ b/src/afl-cc.c
+@@ -549,8 +549,8 @@ static void edit_params(u32 argc, char **argv, char **envp) {
+ }
+
+ #if LLVM_MAJOR >= 13
+- // fuck you llvm 13
+- cc_params[cc_par_cnt++] = "-fno-experimental-new-pass-manager";
++ // Use the old pass manager in LLVM 14 which the afl++ passes still use.
++ cc_params[cc_par_cnt++] = "-flegacy-pass-manager";
+ #endif
+
+ if (lto_mode && !have_c) {