Blob Blame History Raw
commit 36a2e24f85aa3174d37b3a121632ac0b28bf990a
Author: Tristan Gingold <tgingold@free.fr>
Date:   Tue Sep 26 21:08:23 2023 +0200

    llvm-cbindings.cpp: adjust for llvm-17

diff --git a/src/ortho/llvm6/llvm-cbindings.cpp b/src/ortho/llvm6/llvm-cbindings.cpp
index 91a28a789..5f644a7f7 100644
--- a/src/ortho/llvm6/llvm-cbindings.cpp
+++ b/src/ortho/llvm6/llvm-cbindings.cpp
@@ -31,10 +31,18 @@
 #include "llvm-c/BitWriter.h"
 
 #include "llvm-c/Analysis.h"
-#include "llvm-c/Transforms/Scalar.h"
-#if LLVM_VERSION_MAJOR >= 7
+
+#if LLVM_VERSION_MAJOR < 17
+# include "llvm-c/Transforms/Scalar.h"
+# if LLVM_VERSION_MAJOR >= 7
 //  Not present in llvm-6, present in llvm-7
-#include "llvm-c/Transforms/Utils.h"
+#  include "llvm-c/Transforms/Utils.h"
+# endif
+#else
+# include "llvm/Passes/OptimizationLevel.h"
+# include "llvm/Analysis/LoopAnalysisManager.h"
+# include "llvm/Analysis/CGSCCPassManager.h"
+# include "llvm/Passes/PassBuilder.h"
 #endif
 
 #if LLVM_VERSION_MAJOR >= 6
@@ -77,7 +85,11 @@ static LLVMTargetRef TheTarget;
 static LLVMTargetMachineRef TheTargetMachine;
 static LLVMTargetDataRef TheTargetData;
 static LLVMRelocMode TheReloc = LLVMRelocDefault;
-static LLVMCodeGenOptLevel Optimization = LLVMCodeGenLevelDefault;
+static LLVMCodeGenOptLevel OptimizationCGLev = LLVMCodeGenLevelDefault;
+
+#if LLVM_VERSION_MAJOR >= 17
+static OptimizationLevel OptimizationLev = OptimizationLevel::O0;
+#endif
 
 static LLVMBuilderRef Builder;
 static LLVMBuilderRef DeclBuilder;
@@ -118,16 +130,28 @@ set_optimization_level (unsigned level)
 {
   switch(level) {
   case 0:
-    Optimization = LLVMCodeGenLevelNone;
+    OptimizationCGLev = LLVMCodeGenLevelNone;
+#if LLVM_VERSION_MAJOR >= 17
+    OptimizationLev = OptimizationLevel::O0;
+#endif
     break;
   case 1:
-    Optimization = LLVMCodeGenLevelLess;
+    OptimizationCGLev = LLVMCodeGenLevelLess;
+#if LLVM_VERSION_MAJOR >= 17
+    OptimizationLev = OptimizationLevel::O1;
+#endif
     break;
   case 2:
-    Optimization = LLVMCodeGenLevelDefault;
+    OptimizationCGLev = LLVMCodeGenLevelDefault;
+#if LLVM_VERSION_MAJOR >= 17
+    OptimizationLev = OptimizationLevel::O2;
+#endif
     break;
   default:
-    Optimization = LLVMCodeGenLevelAggressive;
+    OptimizationCGLev = LLVMCodeGenLevelAggressive;
+#if LLVM_VERSION_MAJOR >= 17
+    OptimizationLev = OptimizationLevel::O3;
+#endif
     break;
   }
 }
@@ -201,7 +225,34 @@ generateCommon()
     }
   }
 
-  if (Optimization > LLVMCodeGenLevelNone) {
+#if LLVM_VERSION_MAJOR >= 17
+  // Create the analysis managers.
+  LoopAnalysisManager LAM;
+  FunctionAnalysisManager FAM;
+  CGSCCAnalysisManager CGAM;
+  ModuleAnalysisManager MAM;
+
+  // Create the new pass manager builder.
+  // Take a look at the PassBuilder constructor parameters for more
+  // customization, e.g. specifying a TargetMachine or various debugging
+  // options.
+  PassBuilder PB;
+
+  // Register all the basic analyses with the managers.
+  PB.registerModuleAnalyses(MAM);
+  PB.registerCGSCCAnalyses(CGAM);
+  PB.registerFunctionAnalyses(FAM);
+  PB.registerLoopAnalyses(LAM);
+  PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
+
+  // Create the pass manager.
+  // This one corresponds to a typical -O2 optimization pipeline.
+  ModulePassManager MPM = PB.buildPerModuleDefaultPipeline(OptimizationLev);
+
+  // Optimize the IR!
+  MPM.run(*unwrap(TheModule), MAM);
+#else
+  if (OptimizationCGLev > LLVMCodeGenLevelNone) {
     LLVMPassManagerRef PassManager;
     PassManager = LLVMCreateFunctionPassManagerForModule (TheModule);
 
@@ -214,7 +265,9 @@ generateCommon()
       LLVMRunFunctionPassManager (PassManager, Func);
     }
   }
+#endif
 }
+
 extern "C" void
 generate_object(char *Filename)
 {
@@ -292,7 +345,7 @@ ortho_llvm_init(const char *Filename, unsigned FilenameLength)
 
   //  Create a target machine
   TheTargetMachine = LLVMCreateTargetMachine
-    (TheTarget, Triple, "", "", Optimization, TheReloc,
+    (TheTarget, Triple, "", "", OptimizationCGLev, TheReloc,
      LLVMCodeModelDefault);
 
 #if LLVM_VERSION_MAJOR < 4
@@ -353,7 +406,7 @@ ortho_llvm_init(const char *Filename, unsigned FilenameLength)
 					    StringRef(*DebugCurrentDirectory));
     DebugCurrentCU = DBuilder->createCompileUnit
       (llvm::dwarf::DW_LANG_C, DebugCurrentFile, StringRef("ortho-llvm"),
-       Optimization > LLVMCodeGenLevelNone, StringRef(), 0);
+       OptimizationCGLev > LLVMCodeGenLevelNone, StringRef(), 0);
 
     DebugCurrentScope = DebugCurrentCU;
   }