From 1275ec6774e0fb8eaf12fd1cb30b16a08044bcb7 Mon Sep 17 00:00:00 2001
From: Stephane Letz <letz@grame.fr>
Date: Wed, 30 Mar 2022 09:31:01 +0200
Subject: [PATCH] Add support for LLVM 14.

---
 compiler/generator/llvm/llvm_dsp_aux.cpp      |  4 +-
 .../generator/llvm/llvm_dynamic_dsp_aux.cpp   |  2 +-
 compiler/generator/llvm/llvm_instructions.hh  | 77 ++++++++-----------
 3 files changed, 35 insertions(+), 48 deletions(-)

diff --git a/compiler/generator/llvm/llvm_dsp_aux.cpp b/compiler/generator/llvm/llvm_dsp_aux.cpp
index 1d08a1be2a..232aef616c 100644
--- a/compiler/generator/llvm/llvm_dsp_aux.cpp
+++ b/compiler/generator/llvm/llvm_dsp_aux.cpp
@@ -116,7 +116,7 @@ void llvm_dsp_factory_aux::startLLVMLibrary()
 {
     if (llvm_dsp_factory_aux::gInstance++ == 0) {
         // Install the LLVM error handler
-    #if defined(__APPLE__) && LLVM_VERSION_MAJOR == 13
+    #if defined(__APPLE__) && LLVM_VERSION_MAJOR >= 11
         #warning Crash on OSX so deactivated in this case
     #else
         LLVMInstallFatalErrorHandler(llvm_dsp_factory_aux::LLVMFatalErrorHandler);
@@ -128,7 +128,7 @@ void llvm_dsp_factory_aux::stopLLVMLibrary()
 {
     if (--llvm_dsp_factory_aux::gInstance == 0) {
         // Remove the LLVM error handler
-    #if defined(__APPLE__) && (LLVM_VERSION_MAJOR >= 11 && LLVM_VERSION_MAJOR <= 13)
+    #if defined(__APPLE__) && LLVM_VERSION_MAJOR >= 11
         #warning Crash on OSX so deactivated in this case
     #else
         LLVMResetFatalErrorHandler();
diff --git a/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp b/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp
index 60a71df70f..3e5c30bf8e 100644
--- a/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp
+++ b/compiler/generator/llvm/llvm_dynamic_dsp_aux.cpp
@@ -65,7 +65,7 @@
 #include <llvm/Bitcode/BitcodeWriter.h>
 
 // Disappears in LLVM 15
-#if LLVM_VERSION_MAJOR >= 15
+#if LLVM_VERSION_MAJOR >= 14
 #include <llvm/MC/TargetRegistry.h>
 #else
 #include <llvm/Support/TargetRegistry.h>
diff --git a/compiler/generator/llvm/llvm_instructions.hh b/compiler/generator/llvm/llvm_instructions.hh
index 91ead36d37..c092db8c64 100644
--- a/compiler/generator/llvm/llvm_instructions.hh
+++ b/compiler/generator/llvm/llvm_instructions.hh
@@ -57,7 +57,16 @@ using namespace llvm;
 
 #define MakeIdx(beg, end) llvm::ArrayRef<LLVMValue>(beg, end)
 #define MakeArgs(args) llvm::ArrayRef<lLLVMValue>(args)
+#if LLVM_VERSION_MAJOR >= 14
+#define GetType(ptr) ptr->getType()->getScalarType()->getPointerElementType()
+#define MakeStructGEP(v1, v2) fBuilder->CreateStructGEP(GetType(v1), v1, v2);
+#define MyCreateLoad(var, is_volatile) fBuilder->CreateLoad(GetType(var), var, is_volatile)
+#define MyCreateLoad1(var) fBuilder->CreateLoad(GetType(var), var)
+#else
 #define MakeStructGEP(v1, v2) fBuilder->CreateStructGEP(v1, v2);
+#define MyCreateLoad(var, is_volatile) fBuilder->CreateLoad(var, is_volatile)
+#define MyCreateLoad1(var) fBuilder->CreateLoad(var)
+#endif
 #define MakeConstGEP32(type_def, llvm_name) fBuilder->CreateConstGEP2_32(type_def, llvm_name, 0, 0);
 #define MakeIntPtrType() fModule->getDataLayout().getIntPtrType(fModule->getContext())
 
@@ -284,42 +293,32 @@ class LLVMInstVisitor : public InstVisitor, public LLVMTypeHelper {
 
     LLVMValue loadStructVarAddress(const string& name)
     {
-#if LLVM_VERSION_MAJOR >= 15
-#warning FIXME
-        faustassert(false);
-        return {};
-#else
         return MakeStructGEP(loadFunArg("dsp"), fStructVisitor->getFieldIndex(name));
-#endif
     }
 
     LLVMValue loadStructArrayVarAddress(const string& name)
     {
-#if LLVM_VERSION_MAJOR >= 15
-#warning FIXME
-        faustassert(false);
-        return {};
-#else
         int       field_index = fStructVisitor->getFieldIndex(name);
         LLVMValue idx[]       = {genInt32(0), genInt32(field_index)};
+    #if LLVM_VERSION_MAJOR >= 14
+        return fBuilder->CreateInBoundsGEP(GetType(loadFunArg("dsp")), loadFunArg("dsp"), MakeIdx(idx, idx + 2));
+    #else
         return fBuilder->CreateInBoundsGEP(loadFunArg("dsp"), MakeIdx(idx, idx + 2));
-#endif
+    #endif
     }
 
-    LLVMValue loadArrayAsPointer(LLVMValue variable, bool is_volatile = false)
+    LLVMValue loadArrayAsPointer(LLVMValue var, bool is_volatile = false)
     {
-#if LLVM_VERSION_MAJOR >= 15
-#warning FIXME
-        faustassert(false);
-        return {};
-#else
-        if (isa<ArrayType>(variable->getType()->getPointerElementType())) {
+        if (isa<ArrayType>(var->getType()->getPointerElementType())) {
             LLVMValue idx[] = {genInt32(0), genInt32(0)};
-            return fBuilder->CreateInBoundsGEP(variable, MakeIdx(idx, idx + 2));
+        #if LLVM_VERSION_MAJOR >= 14
+            return fBuilder->CreateInBoundsGEP(GetType(var), var, MakeIdx(idx, idx + 2));
+        #else
+            return fBuilder->CreateInBoundsGEP(var, MakeIdx(idx, idx + 2));
+        #endif
         } else {
-            return fBuilder->CreateLoad(variable, is_volatile);
+            return MyCreateLoad(var, is_volatile);
         }
-#endif
     }
 
     LLVMValue loadFunArg(const string& name)
@@ -583,19 +582,21 @@ class LLVMInstVisitor : public InstVisitor, public LLVMTypeHelper {
             return nullptr;
         }
 
-#if LLVM_VERSION_MAJOR >= 15
-#warning FIXME
-        faustassert(false);
-        return {};
-#else
         // Indexed adresses can actually be values in an array or fields in a struct type
         if (isStructType(indexed_address->getName())) {
             LLVMValue idx[] = {genInt32(0), fCurValue};
+        #if LLVM_VERSION_MAJOR >= 14
+            return fBuilder->CreateInBoundsGEP(GetType(load_ptr), load_ptr, MakeIdx(idx, idx + 2));
+        #else
             return fBuilder->CreateInBoundsGEP(load_ptr, MakeIdx(idx, idx + 2));
+        #endif
         } else {
+        #if LLVM_VERSION_MAJOR >= 14
+            return fBuilder->CreateInBoundsGEP(GetType(load_ptr), load_ptr, fCurValue);
+        #else
             return fBuilder->CreateInBoundsGEP(load_ptr, fCurValue);
+        #endif
         }
-#endif
     }
     
     virtual LLVMValue visit(Address* address)
@@ -630,14 +631,8 @@ class LLVMInstVisitor : public InstVisitor, public LLVMTypeHelper {
                 fCurValue = loadArrayAsPointer(visit(inst->fAddress), named_address->fAccess & Address::kVolatile);
             }
         } else if (indexed_address) {
-
-#if LLVM_VERSION_MAJOR >= 15
-#warning FIXME
-        faustassert(false);
-        return;
-#else
-            fCurValue = fBuilder->CreateLoad(visit(inst->fAddress));
-#endif
+            Value* Ptr = visit(inst->fAddress);
+            fCurValue = MyCreateLoad1(Ptr);
         } else {
             faustassert(false);
         }
@@ -985,15 +980,7 @@ class LLVMInstVisitor : public InstVisitor, public LLVMTypeHelper {
         // Emit merge block
         function->getBasicBlockList().push_back(merge_block);
         fBuilder->SetInsertPoint(merge_block);
-        
-#if LLVM_VERSION_MAJOR >= 15
-#warning FIXME
-        faustassert(false);
-        return;
-#else
-        // Load result in fCurValue
-        fCurValue = fBuilder->CreateLoad(typed_res);
-#endif
+        fCurValue = MyCreateLoad1(typed_res);
     }
     
     virtual void visit(IfInst* inst)
