summaryrefslogtreecommitdiff
path: root/libre/clamav/Add-support-for-LLVM-3.7.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libre/clamav/Add-support-for-LLVM-3.7.patch')
-rw-r--r--libre/clamav/Add-support-for-LLVM-3.7.patch740
1 files changed, 740 insertions, 0 deletions
diff --git a/libre/clamav/Add-support-for-LLVM-3.7.patch b/libre/clamav/Add-support-for-LLVM-3.7.patch
new file mode 100644
index 000000000..8bcd1d7ea
--- /dev/null
+++ b/libre/clamav/Add-support-for-LLVM-3.7.patch
@@ -0,0 +1,740 @@
+From 3b1b2e757d0d1f13a3f234abf05d6e5015f52744 Mon Sep 17 00:00:00 2001
+From: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
+Date: Fri, 14 Oct 2016 20:24:39 +0200
+Subject: Add support for LLVM 3.7
+
+Main changes:
+The DataLayoutPass is no longer necessary.
+The LoopInfo pass is now a WrapperPass.
+Before creating TargetLibraryInfo one needs to create a
+TargetLibraryInfoImpl.
+PassManager is now in the legacy:: namespace.
+GetElementPtrInst::getIndexedType changed behavior causing segfaults in
+the testsuite; emulating the old behavior now.
+CreateCallX functions for fixed number X of elements got removed.
+JITEmitDebugInfo Option was removed.
+DIDescriptor was removed.
+
+Patch-Name: Add-support-for-LLVM-3.7.patch
+---
+ libclamav/c++/ClamBCRTChecks.cpp | 34 ++++++-
+ libclamav/c++/PointerTracking.cpp | 44 ++++++++-
+ libclamav/c++/bytecode2llvm.cpp | 181 +++++++++++++++++++++++++++++++++++---
+ libclamav/c++/m4/llvm-flags.m4 | 4 +-
+ 4 files changed, 244 insertions(+), 19 deletions(-)
+
+diff --git a/libclamav/c++/ClamBCRTChecks.cpp b/libclamav/c++/ClamBCRTChecks.cpp
+index 97099b2..35f7272 100644
+--- a/libclamav/c++/ClamBCRTChecks.cpp
++++ b/libclamav/c++/ClamBCRTChecks.cpp
+@@ -201,9 +201,11 @@ namespace llvm {
+ TD = &getAnalysis<TargetData>();
+ #elif LLVM_VERSION < 35
+ TD = &getAnalysis<DataLayout>();
+-#else
++#elif LLVM_VERSION < 37
+ DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>();
+ TD = DLP ? &DLP->getDataLayout() : 0;
++#else
++ TD = &F.getEntryBlock().getModule()->getDataLayout();
+ #endif
+ SE = &getAnalysis<ScalarEvolution>();
+ PT = &getAnalysis<PointerTracking>();
+@@ -212,7 +214,11 @@ namespace llvm {
+ #else
+ DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
+ #endif
++#if LLVM_VERSION < 37
+ expander = new SCEVExpander(*SE OPT("SCEVexpander"));
++#else
++ expander = new SCEVExpander(*SE, *TD OPT("SCEVexpander"));
++#endif
+
+ std::vector<Instruction*> insns;
+
+@@ -351,8 +357,10 @@ namespace llvm {
+ AU.addRequired<TargetData>();
+ #elif LLVM_VERSION < 35
+ AU.addRequired<DataLayout>();
+-#else
++#elif LLVM_VERSION < 37
+ AU.addRequired<DataLayoutPass>();
++#else
++ // No DataLayout pass needed anymore.
+ #endif
+ #if LLVM_VERSION < 35
+ AU.addRequired<DominatorTree>();
+@@ -406,7 +414,11 @@ namespace llvm {
+ if (BaseMap.count(P)) {
+ return BaseMap[Ptr] = BaseMap[P];
+ }
++#if LLVM_VERSION < 37
+ Value *P2 = GetUnderlyingObject(P, TD);
++#else
++ Value *P2 = GetUnderlyingObject(P, *TD);
++#endif
+ if (P2 != P) {
+ Value *V = getPointerBase(P2);
+ return BaseMap[Ptr] = V;
+@@ -524,7 +536,11 @@ namespace llvm {
+ }
+ }
+ if (LoadInst *LI = dyn_cast<LoadInst>(Base)) {
++#if LLVM_VERSION < 37
+ Value *V = GetUnderlyingObject(LI->getPointerOperand()->stripPointerCasts(), TD);
++#else
++ Value *V = GetUnderlyingObject(LI->getPointerOperand()->stripPointerCasts(), *TD);
++#endif
+ if (Argument *A = dyn_cast<Argument>(V)) {
+ if (A->getArgNo() == 0) {
+ // pointers from hidden ctx are trusted to be at least the
+@@ -651,7 +667,11 @@ namespace llvm {
+ }
+ BasicBlock *BB = I->getParent();
+ BasicBlock::iterator It = I;
++#if LLVM_VERSION < 37
+ BasicBlock *newBB = SplitBlock(BB, &*It, this);
++#else
++ BasicBlock *newBB = SplitBlock(BB, &*It);
++#endif
+ PHINode *PN;
+ unsigned MDDbgKind = I->getContext().getMDKindID("dbg");
+ //verifyFunction(*BB->getParent());
+@@ -696,9 +716,15 @@ namespace llvm {
+ unsigned locationid = 0;
+ bool Approximate;
+ if (MDNode *Dbg = getLocation(I, Approximate, MDDbgKind)) {
++#if LLVM_VERSION < 37
+ DILocation Loc(Dbg);
+ locationid = Loc.getLineNumber() << 8;
+ unsigned col = Loc.getColumnNumber();
++#else
++ DebugLoc Loc(Dbg);
++ locationid = Loc.getLine() << 8;
++ unsigned col = Loc.getCol();
++#endif
+ if (col > 254)
+ col = 254;
+ if (Approximate)
+@@ -912,7 +938,11 @@ INITIALIZE_PASS_DEPENDENCY(TargetData)
+ #elif LLVM_VERSION < 35
+ INITIALIZE_PASS_DEPENDENCY(DataLayout)
+ #else
++#if LLVM_VERSION < 37
+ INITIALIZE_PASS_DEPENDENCY(DataLayoutPass)
++#else
++// No DataLayout pass needed anymore.
++#endif
+ #endif
+ #if LLVM_VERSION < 35
+ INITIALIZE_PASS_DEPENDENCY(DominatorTree)
+diff --git a/libclamav/c++/PointerTracking.cpp b/libclamav/c++/PointerTracking.cpp
+index 8e17a4a..67340e8 100644
+--- a/libclamav/c++/PointerTracking.cpp
++++ b/libclamav/c++/PointerTracking.cpp
+@@ -30,7 +30,11 @@
+ #include "llvm/IR/InstIterator.h"
+ #endif
+ #include "llvm/Support/raw_ostream.h"
++#if LLVM_VERSION < 37
+ #include "llvm/Target/TargetLibraryInfo.h"
++#else
++#include <llvm/Analysis/TargetLibraryInfo.h>
++#endif
+
+ #if LLVM_VERSION < 32
+ #include "llvm/Target/TargetData.h"
+@@ -70,7 +74,11 @@ INITIALIZE_PASS_DEPENDENCY(DominatorTree)
+ #else
+ INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
+ #endif
++#if LLVM_VERSION < 37
+ INITIALIZE_PASS_DEPENDENCY(LoopInfo)
++#else
++INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
++#endif
+ INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
+ #if LLVM_VERSION < 35
+ INITIALIZE_PASS_DEPENDENCY(DominatorTree)
+@@ -96,12 +104,18 @@ bool PointerTracking::runOnFunction(Function &F) {
+ TD = getAnalysisIfAvailable<TargetData>();
+ #elif LLVM_VERSION < 35
+ TD = getAnalysisIfAvailable<DataLayout>();
+-#else
++#elif LLVM_VERSION < 37
+ DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>();
+ TD = DLP ? &DLP->getDataLayout() : 0;
++#else
++ TD = &F.getEntryBlock().getModule()->getDataLayout();
+ #endif
+ SE = &getAnalysis<ScalarEvolution>();
++#if LLVM_VERSION < 37
+ LI = &getAnalysis<LoopInfo>();
++#else
++ LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
++#endif
+ #if LLVM_VERSION < 35
+ DT = &getAnalysis<DominatorTree>();
+ #else
+@@ -116,7 +130,11 @@ void PointerTracking::getAnalysisUsage(AnalysisUsage &AU) const {
+ #else
+ AU.addRequiredTransitive<DominatorTreeWrapperPass>();
+ #endif
++#if LLVM_VERSION < 37
+ AU.addRequiredTransitive<LoopInfo>();
++#else
++ AU.addRequiredTransitive<LoopInfoWrapperPass>();
++#endif
+ AU.addRequiredTransitive<ScalarEvolution>();
+ AU.setPreservesAll();
+ }
+@@ -178,12 +196,19 @@ const SCEV *PointerTracking::computeAllocationCount(Value *P,
+ if (CallInst *CI = extractMallocCall(V)) {
+ Value *arraySize = getMallocArraySize(CI, TD);
+ constType* AllocTy = getMallocAllocatedType(CI);
+-#else
++#elif LLVM_VERSION < 37
+ TargetLibraryInfo* TLI = new TargetLibraryInfo();
+
+ if (CallInst *CI = extractMallocCall(V, TLI)) {
+ Value *arraySize = getMallocArraySize(CI, TD, TLI);
+ constType* AllocTy = getMallocAllocatedType(CI, TLI);
++#else
++ TargetLibraryInfoImpl* TLII = new TargetLibraryInfoImpl();
++ TargetLibraryInfo* TLI = new TargetLibraryInfo(*TLII);
++
++ if (CallInst *CI = extractMallocCall(V, TLI)) {
++ Value *arraySize = getMallocArraySize(CI, *TD, TLI);
++ constType* AllocTy = getMallocAllocatedType(CI, TLI);
+ #endif
+ if (!AllocTy || !arraySize) return SE->getCouldNotCompute();
+ Ty = AllocTy;
+@@ -240,7 +265,7 @@ Value *PointerTracking::computeAllocationCountValue(Value *P, constType *&Ty) co
+ if (!Ty)
+ return 0;
+ Value *arraySize = getMallocArraySize(CI, TD);
+-#else
++#elif LLVM_VERSION < 37
+ TargetLibraryInfo* TLI = new TargetLibraryInfo();
+
+ if (CallInst *CI = extractMallocCall(V, TLI)) {
+@@ -248,6 +273,15 @@ Value *PointerTracking::computeAllocationCountValue(Value *P, constType *&Ty) co
+ if (!Ty)
+ return 0;
+ Value *arraySize = getMallocArraySize(CI, TD, TLI);
++#else
++ TargetLibraryInfoImpl* TLII = new TargetLibraryInfoImpl();
++ TargetLibraryInfo* TLI = new TargetLibraryInfo(*TLII);
++
++ if (CallInst *CI = extractMallocCall(V, TLI)) {
++ Ty = getMallocAllocatedType(CI, TLI);
++ if (!Ty)
++ return 0;
++ Value *arraySize = getMallocArraySize(CI, *TD, TLI);
+ #endif
+ if (!arraySize) {
+ Ty = Type::getInt8Ty(P->getContext());
+@@ -351,7 +385,11 @@ void PointerTracking::getPointerOffset(Value *Pointer, Value *&Base,
+ const SCEV *&Offset) const
+ {
+ Pointer = Pointer->stripPointerCasts();
++#if LLVM_VERSION < 37
+ Base = GetUnderlyingObject(Pointer, TD);
++#else
++ Base = GetUnderlyingObject(Pointer, *TD);
++#endif
+ Limit = getAllocationSizeInBytes(Base);
+ if (isa<SCEVCouldNotCompute>(Limit)) {
+ Base = 0;
+diff --git a/libclamav/c++/bytecode2llvm.cpp b/libclamav/c++/bytecode2llvm.cpp
+index e5aea03..2171993 100644
+--- a/libclamav/c++/bytecode2llvm.cpp
++++ b/libclamav/c++/bytecode2llvm.cpp
+@@ -63,7 +63,11 @@
+ #include "llvm/Object/ObjectFile.h"
+ #endif
+ #include "llvm/ExecutionEngine/JITEventListener.h"
++#if LLVM_VERSION < 37
+ #include "llvm/PassManager.h"
++#else
++#include "llvm/IR/LegacyPassManager.h"
++#endif
+ #include "llvm/Support/Compiler.h"
+ #include "llvm/Support/Debug.h"
+ #include "llvm/Support/CommandLine.h"
+@@ -231,7 +235,9 @@ namespace {
+ #define llvm_report_error(x) report_fatal_error(x)
+ #define llvm_install_error_handler(x) install_fatal_error_handler(x)
+ #define DwarfExceptionHandling JITExceptionHandling
++#if LLVM_VERSION < 37
+ #define SetCurrentDebugLocation(x) SetCurrentDebugLocation(DebugLoc::getFromDILocation(x))
++#endif
+ #define DEFINEPASS(passname) passname() : FunctionPass(ID)
+ #else
+ #define DEFINEPASS(passname) passname() : FunctionPass(&ID)
+@@ -718,7 +724,11 @@ class RuntimeLimits : public FunctionPass {
+ BBMap[BB] = apicalls;
+ }
+ if (!BackedgeTargets.empty()) {
++#if LLVM_VERSION < 37
+ LoopInfo &LI = getAnalysis<LoopInfo>();
++#else
++ LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
++#endif
+ ScalarEvolution &SE = getAnalysis<ScalarEvolution>();
+
+ // Now check whether any of these backedge targets are part of a loop
+@@ -802,7 +812,11 @@ class RuntimeLimits : public FunctionPass {
+ #endif
+ // Load Flag that tells us we timed out (first byte in bc_ctx)
+ Value *Cond = Builder.CreateLoad(Flag, true);
++#if LLVM_VERSION < 37
+ BasicBlock *newBB = SplitBlock(BB, BB->getTerminator(), this);
++#else
++ BasicBlock *newBB = SplitBlock(BB, BB->getTerminator());
++#endif
+ TerminatorInst *TI = BB->getTerminator();
+ BranchInst::Create(AbrtBB, newBB, Cond, TI);
+ TI->eraseFromParent();
+@@ -823,7 +837,11 @@ class RuntimeLimits : public FunctionPass {
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
++#if LLVM_VERSION < 37
+ AU.addRequired<LoopInfo>();
++#else
++ AU.addRequired<LoopInfoWrapperPass>();
++#endif
+ AU.addRequired<ScalarEvolution>();
+ #if LLVM_VERSION < 35
+ AU.addRequired<DominatorTree>();
+@@ -916,7 +934,11 @@ class LLVMCodegen {
+ Module *M;
+ LLVMContext &Context;
+ ExecutionEngine *EE;
++#if LLVM_VERSION < 37
+ FunctionPassManager &PM, &PMUnsigned;
++#else
++ legacy::FunctionPassManager &PM, &PMUnsigned;
++#endif
+ LLVMTypeMapper *TypeMap;
+
+ Function **apiFuncs;
+@@ -1089,7 +1111,11 @@ class LLVMCodegen {
+ Constant *C = ConstantExpr::getPointerCast(GV, IP8Ty);
+ //TODO: check constant bounds here
+ return ConstantExpr::getPointerCast(
++#if LLVM_VERSION < 37
+ ConstantExpr::getInBoundsGetElementPtr(C, ARRAYREF(Value*, idxs, 1)),
++#else
++ ConstantExpr::getInBoundsGetElementPtr(Ty, C, ARRAYREF(Value*, idxs, 1)),
++#endif
+ PTy);
+ }
+ if (isa<IntegerType>(Ty)) {
+@@ -1118,15 +1144,21 @@ class LLVMCodegen {
+
+ public:
+ LLVMCodegen(const struct cli_bc *bc, Module *M, struct CommonFunctions *CF, FunctionMapTy &cFuncs,
++#if LLVM_VERSION < 37
+ ExecutionEngine *EE, FunctionPassManager &PM, FunctionPassManager &PMUnsigned,
++#else
++ ExecutionEngine *EE, legacy::FunctionPassManager &PM, legacy::FunctionPassManager &PMUnsigned,
++#endif
+ Function **apiFuncs, LLVMTypeMapper &apiMap)
+ : bc(bc), M(M), Context(M->getContext()), EE(EE),
+ PM(PM),PMUnsigned(PMUnsigned), TypeMap(), apiFuncs(apiFuncs),apiMap(apiMap),
+ compiledFunctions(cFuncs), BytecodeID("bc"+Twine(bc->id)),
+ #if LLVM_VERSION < 32
+ Folder(EE->getTargetData()), Builder(Context, Folder), Values(), CF(CF) {
+-#else
++#elif LLVM_VERSION < 37
+ Folder(EE->getDataLayout()), Builder(Context, Folder), Values(), CF(CF) {
++#else
++ Folder(*EE->getDataLayout()), Builder(Context, Folder), Values(), CF(CF) {
+ #endif
+
+ for (unsigned i=0;i<cli_apicall_maxglobal - _FIRST_GLOBAL;i++) {
+@@ -1141,7 +1173,17 @@ class LLVMCodegen {
+ template <typename InputIterator>
+ #endif
+ Value* createGEP(Value *Base, constType *ETy, ARRAYREFPARAM(Value*,InputIterator Start,InputIterator End,ARef)) {
++#if LLVM_VERSION < 37
+ constType *Ty = GetElementPtrInst::getIndexedType(Base->getType(),ARRAYREFP(Start,End,ARef));
++#else
++ Type *Ty = NULL;
++ // This used to be done internally in LLVM's getIndexedTypeInternal.
++ PointerType *PTy = dyn_cast<PointerType>(Base->getType()->getScalarType());
++ if (PTy) {
++ Type *Agg = PTy->getElementType();
++ Ty = GetElementPtrInst::getIndexedType(Agg,ARRAYREFP(Start,End,ARef));
++ }
++#endif
+ if (!Ty || (ETy && (Ty != ETy && (!isa<IntegerType>(Ty) || !isa<IntegerType>(ETy))))) {
+ if (cli_debug_flag) {
+ std::string str;
+@@ -1457,7 +1499,11 @@ class LLVMCodegen {
+ if (func->dbgnodes[c] != ~0u) {
+ unsigned j = func->dbgnodes[c];
+ assert(j < mdnodes.size());
++#if LLVM_VERSION < 37
+ Builder.SetCurrentDebugLocation(mdnodes[j]);
++#else
++ Builder.SetCurrentDebugLocation(DebugLoc(mdnodes[j]));
++#endif
+ } else
+ Builder.SetCurrentDebugLocation(0);
+ }
+@@ -1767,11 +1813,16 @@ class LLVMCodegen {
+ #if LLVM_VERSION < 29
+ CallInst *c = Builder.CreateCall4(CF->FMemset, Dst, Val, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+-#else
++#elif LLVM_VERSION < 37
+ CallInst *c = Builder.CreateCall5(CF->FMemset, Dst, Val, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1),
+ ConstantInt::get(Type::getInt1Ty(Context), 0)
+ );
++#else
++ Value *args[] = { Dst, Val, Len,
++ ConstantInt::get(Type::getInt32Ty(Context), 1),
++ ConstantInt::get(Type::getInt1Ty(Context), 0)};
++ CallInst *c = Builder.CreateCall(CF->FMemset, ARRAYREF(Value*, args, args + 5));
+ #endif
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+@@ -1788,11 +1839,16 @@ class LLVMCodegen {
+ #if LLVM_VERSION < 29
+ CallInst *c = Builder.CreateCall4(CF->FMemcpy, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+-#else
++#elif LLVM_VERSION < 37
+ CallInst *c = Builder.CreateCall5(CF->FMemcpy, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1),
+ ConstantInt::get(Type::getInt1Ty(Context), 0)
+ );
++#else
++ Value *args[] = { Dst, Src, Len,
++ ConstantInt::get(Type::getInt32Ty(Context), 1),
++ ConstantInt::get(Type::getInt1Ty(Context), 0)};
++ CallInst *c = Builder.CreateCall(CF->FMemcpy, ARRAYREF(Value*, args, args + 5));
+ #endif
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+@@ -1809,10 +1865,15 @@ class LLVMCodegen {
+ #if LLVM_VERSION < 29
+ CallInst *c = Builder.CreateCall4(CF->FMemmove, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+-#else
++#elif LLVM_VERSION < 37
+ CallInst *c = Builder.CreateCall5(CF->FMemmove, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1),
+ ConstantInt::get(Type::getInt1Ty(Context), 0));
++#else
++ Value *args[] = {Dst, Src, Len,
++ ConstantInt::get(Type::getInt32Ty(Context), 1),
++ ConstantInt::get(Type::getInt1Ty(Context), 0)};
++ CallInst *c = Builder.CreateCall(CF->FMemmove, args);
+ #endif
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+@@ -1830,7 +1891,12 @@ class LLVMCodegen {
+ #else
+ Value *Len = convertOperand(func, EE->getDataLayout()->getIntPtrType(Context), inst->u.three[2]);
+ #endif
++#if LLVM_VERSION < 37
+ CallInst *c = Builder.CreateCall3(CF->FRealmemcmp, Dst, Src, Len);
++#else
++ Value *args[] = {Dst, Src, Len};
++ CallInst *c = Builder.CreateCall(CF->FRealmemcmp, ARRAYREF(Value*, args, args + 3));
++#endif
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+ Store(inst->dest, c);
+@@ -2211,7 +2277,11 @@ static void addFunctionProtos(struct CommonFunctions *CF, ExecutionEngine *EE, M
+ }
+ #if LLVM_VERSION >= 29
+ INITIALIZE_PASS_BEGIN(RuntimeLimits, "rl", "Runtime Limits", false, false)
++#if LLVM_VERSION < 37
+ INITIALIZE_PASS_DEPENDENCY(LoopInfo)
++#else
++INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
++#endif
+ INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
+ #if LLVM_VERSION < 35
+ INITIALIZE_PASS_DEPENDENCY(DominatorTree)
+@@ -2437,8 +2507,10 @@ static void addFPasses(FunctionPassManager &FPM, bool trusted, const TargetData
+ static void addFPasses(FunctionPassManager &FPM, bool trusted, const DataLayout *TD)
+ #elif LLVM_VERSION < 36
+ static void addFPasses(FunctionPassManager &FPM, bool trusted, const Module *M)
+-#else
++#elif LLVM_VERSION < 37
+ static void addFPasses(FunctionPassManager &FPM, bool trusted, Module *M)
++#else
++static void addFPasses(legacy::FunctionPassManager &FPM, bool trusted, Module *M)
+ #endif
+ {
+ // Set up the optimizer pipeline. Start with registering info about how
+@@ -2449,10 +2521,12 @@ static void addFPasses(FunctionPassManager &FPM, bool trusted, Module *M)
+ FPM.add(new DataLayout(*TD));
+ #elif LLVM_VERSION < 36
+ FPM.add(new DataLayoutPass(M));
+-#else
++#elif LLVM_VERSION < 37
+ DataLayoutPass *DLP = new DataLayoutPass();
+ DLP->doInitialization(*M);
+ FPM.add(DLP);
++#else
++ // No DataLayout pass needed anymore.
+ #endif
+ // Promote allocas to registers.
+ FPM.add(createPromoteMemoryToRegisterPass());
+@@ -2482,6 +2556,8 @@ int cli_bytecode_prepare_jit(struct cli_all_bc *bcs)
+
+ #if LLVM_VERSION >= 31
+ TargetOptions Options;
++#if LLVM_VERSION < 37
++ // This option was removed.
+ #ifdef CL_DEBUG
+ //disable this for now, it leaks
+ Options.JITEmitDebugInfo = false;
+@@ -2489,6 +2565,7 @@ int cli_bytecode_prepare_jit(struct cli_all_bc *bcs)
+ #else
+ Options.JITEmitDebugInfo = false;
+ #endif
++#endif
+ #if LLVM_VERSION < 34
+ Options.DwarfExceptionHandling = false;
+ #else
+@@ -2525,7 +2602,11 @@ int cli_bytecode_prepare_jit(struct cli_all_bc *bcs)
+ struct CommonFunctions CF;
+ addFunctionProtos(&CF, EE, M);
+
++#if LLVM_VERSION < 37
+ FunctionPassManager OurFPM(M), OurFPMUnsigned(M);
++#else
++ legacy::FunctionPassManager OurFPM(M), OurFPMUnsigned(M);
++#endif
+ #if LLVM_VERSION < 32
+ M->setDataLayout(EE->getTargetData()->getStringRepresentation());
+ #else
+@@ -2665,17 +2746,23 @@ int cli_bytecode_prepare_jit(struct cli_all_bc *bcs)
+ break;
+ }
+ }
++#if LLVM_VERSION < 37
+ PassManager PM;
++#else
++ legacy::PassManager PM;
++#endif
+ #if LLVM_VERSION < 32
+ PM.add(new TargetData(*EE->getTargetData()));
+ #elif LLVM_VERSION < 35
+ PM.add(new DataLayout(*EE->getDataLayout()));
+ #elif LLVM_VERSION < 36
+ PM.add(new DataLayoutPass(M));
+-#else
++#elif LLVM_VERSION < 37
+ DataLayoutPass *DLP = new DataLayoutPass();
+ DLP->doInitialization(*M);
+ PM.add(DLP);
++#else
++ // No DataLayout pass needed anymore.
+ #endif
+ // TODO: only run this on the untrusted bytecodes, not all of them...
+ if (has_untrusted)
+@@ -2987,11 +3074,19 @@ static Metadata *findDbgGlobalDeclare(GlobalVariable *V) {
+ return 0;
+
+ for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
++#if LLVM_VERSION < 37
+ DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
+ if (!DIG.isGlobalVariable())
+ continue;
+ if (DIGlobalVariable(DIG).getGlobal() == V)
+ return DIG;
++#else
++ MDNode *DIG = NMD->getOperand(i);
++ if (!DIGlobalVariable::classof(DIG))
++ continue;
++ if ((cast<DIGlobalVariable>(DIG))->getVariable() == V)
++ return DIG;
++#endif
+ }
+ return 0;
+ }
+@@ -3008,11 +3103,19 @@ static Metadata *findDbgSubprogramDeclare(Function *V) {
+ return 0;
+
+ for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
++#if LLVM_VERSION < 37
+ DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
+ if (!DIG.isSubprogram())
+ continue;
+ if (DISubprogram(DIG).getFunction() == V)
+ return DIG;
++#else
++ MDNode *DIG = NMD->getOperand(i);
++ if (!DISubprogram::classof(DIG))
++ continue;
++ if ((cast<DISubprogram>(DIG))->getFunction() == V)
++ return DIG;
++#endif
+ }
+ return 0;
+ }
+@@ -3061,22 +3164,39 @@ static bool getLocationInfo(const Value *V, std::string &DisplayName,
+ Metadata *DIGV = findDbgGlobalDeclare(GV);
+ #endif
+ if (!DIGV) return false;
++#if LLVM_VERSION < 37
+ DIGlobalVariable Var(cast<MDNode>(DIGV));
++#else
++ DIGlobalVariable *Var = cast<DIGlobalVariable>(DIGV);
++#endif
+
++#if LLVM_VERSION < 37
+ StringRef D = Var.getDisplayName();
++#else
++ StringRef D = Var->getDisplayName();
++#endif
+ if (!D.empty())
+ DisplayName = D;
++#if LLVM_VERSION < 37
+ LineNo = Var.getLineNumber();
++#else
++ LineNo = Var->getLine();
++#endif
+ #if LLVM_VERSION < 33
+ Unit = Var.getCompileUnit();
+-#else
++#elif LLVM_VERSION < 37
+ G = Var.getFilename();
+ H = Var.getDirectory();
++#else
++ G = Var->getFilename();
++ H = Var->getDirectory();
+ #endif
+ #if LLVM_VERSION < 35
+ TypeD = Var.getType();
+-#else
++#elif LLVM_VERSION < 37
+ T = Var.getType().getName();
++#else
++ T = (cast<DIType>(*Var->getType())).getName();
+ #endif
+ } else if (Function *F = dyn_cast<Function>(const_cast<Value*>(V))){
+ #if LLVM_VERSION < 36
+@@ -3085,32 +3205,61 @@ static bool getLocationInfo(const Value *V, std::string &DisplayName,
+ Metadata *DIF = findDbgSubprogramDeclare(F);
+ #endif
+ if (!DIF) return false;
++#if LLVM_VERSION < 37
+ DISubprogram Var(cast<MDNode>(DIF));
++#else
++ DISubprogram *Var = cast<DISubprogram>(DIF);
++#endif
+
++#if LLVM_VERSION < 37
+ StringRef D = Var.getDisplayName();
++#else
++ StringRef D = Var->getDisplayName();
++#endif
+ if (!D.empty())
+ DisplayName = D;
++#if LLVM_VERSION < 37
+ LineNo = Var.getLineNumber();
++#else
++ LineNo = Var->getLine();
++#endif
+ #if LLVM_VERSION < 33
+ Unit = Var.getCompileUnit();
+-#else
++#elif LLVM_VERSION < 37
+ G = Var.getFilename();
+ H = Var.getDirectory();
++#else
++ G = Var->getFilename();
++ H = Var->getDirectory();
+ #endif
+ #if LLVM_VERSION < 35
+ TypeD = Var.getType();
+-#else
++#elif LLVM_VERSION < 37
+ T = Var.getType().getName();
++#else
++ T = Var->getType()->getName();
+ #endif
+ } else {
+ const DbgDeclareInst *DDI = findDbgDeclare(V);
+ if (!DDI) return false;
++#if LLVM_VERSION < 37
+ DIVariable Var(cast<MDNode>(DDI->getVariable()));
++#else
++ DIVariable* Var = DDI->getVariable();
++#endif
+
++#if LLVM_VERSION < 37
+ StringRef D = Var.getName();
++#else
++ StringRef D = Var->getName();
++#endif
+ if (!D.empty())
+ DisplayName = D;
++#if LLVM_VERSION < 37
+ LineNo = Var.getLineNumber();
++#else
++ LineNo = Var->getLine();
++#endif
+ #if LLVM_VERSION < 33
+ Unit = Var.getCompileUnit();
+ #else
+@@ -3120,8 +3269,10 @@ static bool getLocationInfo(const Value *V, std::string &DisplayName,
+ #endif
+ #if LLVM_VERSION < 35
+ TypeD = Var.getType();
+-#else
++#elif LLVM_VERSION < 37
+ T = Var.getType().getName();
++#else
++ T = (cast<DIType>(*Var->getType())).getName();
+ #endif
+ }
+
+@@ -3157,9 +3308,15 @@ void printValue(llvm::Value *V, bool a, bool b) {
+
+ void printLocation(llvm::Instruction *I, bool a, bool b) {
+ if (MDNode *N = I->getMetadata("dbg")) {
++#if LLVM_VERSION < 37
+ DILocation Loc(N);
+ errs() << Loc.getFilename() << ":" << Loc.getLineNumber();
+ if (unsigned Col = Loc.getColumnNumber()) {
++#else
++ DebugLoc Loc(N);
++ errs() << Loc.get()->getFilename() << ":" << Loc.getLine();
++ if (unsigned Col = Loc.getCol()) {
++#endif
+ errs() << ":" << Col;
+ }
+ errs() << ": ";
+diff --git a/libclamav/c++/m4/llvm-flags.m4 b/libclamav/c++/m4/llvm-flags.m4
+index dce4e10..04d6833 100644
+--- a/libclamav/c++/m4/llvm-flags.m4
++++ b/libclamav/c++/m4/llvm-flags.m4
+@@ -98,14 +98,14 @@ elif test $llvmver_test -lt 290; then
+ elif test $llvmver_test -lt 360; then
+ llvmcomp="jit nativecodegen scalaropts ipo"
+ AC_MSG_RESULT([ok ($llvmver)])
+-elif test $llvmver_test -lt 370; then
++elif test $llvmver_test -lt 380; then
+ dnl LLVM 3.6.0 removed jit, so we have to use mcjit
+ dnl and we're using InitializeNativeTargetAsmParser, so we need the architecture specific parsers
+ llvmcomp="mcjit nativecodegen scalaropts ipo x86asmparser powerpcasmparser"
+ AC_MSG_RESULT([ok ($llvmver)])
+ else
+ AC_MSG_RESULT([no ($llvmver)])
+- AC_MSG_ERROR([LLVM < 3.7 required, but "$llvmver"($llvmver_test) found])
++ AC_MSG_ERROR([LLVM < 3.8 required, but "$llvmver"($llvmver_test) found])
+ fi
+
+ dnl aquire the required flags to properly link in external LLVM