[Bf-blender-cvs] [7b4867d1ba2] temp-llvm-testing: progress

Jacques Lucke noreply at git.blender.org
Sat Nov 27 13:02:56 CET 2021


Commit: 7b4867d1ba2c294abf37ced3d7c7e46f658bfe78
Author: Jacques Lucke
Date:   Sat Nov 27 13:02:34 2021 +0100
Branches: temp-llvm-testing
https://developer.blender.org/rB7b4867d1ba2c294abf37ced3d7c7e46f658bfe78

progress

===================================================================

M	source/blender/functions/intern/llvm.cc

===================================================================

diff --git a/source/blender/functions/intern/llvm.cc b/source/blender/functions/intern/llvm.cc
index 5ac9e2a406d..bdbb982de6b 100644
--- a/source/blender/functions/intern/llvm.cc
+++ b/source/blender/functions/intern/llvm.cc
@@ -21,7 +21,9 @@
 #include <llvm/IR/LLVMContext.h>
 #include <llvm/IR/Type.h>
 #include <llvm/IR/Verifier.h>
+#include <llvm/Support/CommandLine.h>
 #include <llvm/Support/TargetSelect.h>
+#include <llvm/Support/TargetRegistry.h>
 
 #include "FN_llvm.hh"
 
@@ -31,33 +33,50 @@ namespace blender::fn {
 
 void playground()
 {
-  llvm::InitializeNativeTarget();
-  llvm::InitializeNativeTargetAsmPrinter();
-  llvm::InitializeNativeTargetAsmParser();
+  static bool initialized = []() {
+    /* Set assembly syntax flavour. */
+    char const *args[] = {"some-random-name-for-the-parser", "--x86-asm-syntax=intel"};
+    bool parse_result = llvm::cl::ParseCommandLineOptions(std::size(args), args);
+
+    llvm::InitializeNativeTarget();
+    llvm::InitializeNativeTargetAsmPrinter();
+    llvm::InitializeNativeTargetAsmParser();
+    return true;
+  }();
 
   llvm::LLVMContext context;
   std::unique_ptr<llvm::Module> module = std::make_unique<llvm::Module>("My Module", context);
 
-  llvm::Type *ret_type = llvm::Type::getInt32Ty(context);
-  llvm::FunctionType *function_type = llvm::FunctionType::get(ret_type, false);
+  llvm::Type *int32_type = llvm::Type::getInt32Ty(context);
+  llvm::FunctionType *function_type = llvm::FunctionType::get(
+      int32_type, {int32_type, int32_type}, false);
   llvm::Function *function = llvm::Function::Create(
       function_type, llvm::GlobalValue::LinkageTypes::ExternalLinkage, "My Func", *module);
   llvm::BasicBlock *bb = llvm::BasicBlock::Create(context, "entry", function);
   llvm::IRBuilder<> builder{bb};
-  llvm::Value *value = builder.getInt32(42);
-  builder.CreateRet(value);
+  llvm::Value *sum_value = builder.CreateAdd(function->getArg(0), function->getArg(1));
+  llvm::Value *product_value = builder.CreateMul(function->getArg(0), sum_value);
+  builder.CreateRet(product_value);
 
-  BLI_assert(llvm::verifyModule(*module, &llvm::outs()));
+  BLI_assert(!llvm::verifyModule(*module, &llvm::outs()));
 
-  llvm::ExecutionEngine *ee = llvm::EngineBuilder(std::move(module)).create();
+  llvm::Module *module_ptr = &*module;
+  std::unique_ptr<llvm::ExecutionEngine> ee{llvm::EngineBuilder(std::move(module)).create()};
   ee->finalizeObject();
 
   const uint64_t function_ptr = ee->getFunctionAddress(function->getName().str());
-  using FuncType = int (*)();
+  using FuncType = int (*)(int, int);
   const FuncType generated_function = (FuncType)function_ptr;
-  const int result = generated_function();
+  const int result = generated_function(3, 5);
   std::cout << result << "\n";
 
+  /*
+  LLVMTargetMachineEmitToFile((LLVMTargetMachineRef)ee->getTargetMachine(),
+                              llvm::wrap(module_ptr),
+                              (char *)"C:\\Users\\jacques\\Documents\\machine_code.txt",
+                              LLVMAssemblyFile,
+                              nullptr);
+  */
   // function->dump();
 }



More information about the Bf-blender-cvs mailing list