[Bf-blender-cvs] [6ad32d66758] functions: create llvm wrapper function for calls to pointers

Jacques Lucke noreply at git.blender.org
Fri May 3 12:43:36 CEST 2019


Commit: 6ad32d66758b28af8aa1d6ec9d661c57b7d76c40
Author: Jacques Lucke
Date:   Fri May 3 12:09:40 2019 +0200
Branches: functions
https://developer.blender.org/rB6ad32d66758b28af8aa1d6ec9d661c57b7d76c40

create llvm wrapper function for calls to pointers

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

M	source/blender/functions/backends/llvm/builder.cpp
M	source/blender/functions/backends/llvm/builder.hpp

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

diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
index a1d4cd141b6..d69d2f12003 100644
--- a/source/blender/functions/backends/llvm/builder.cpp
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -1,4 +1,5 @@
 #include "builder.hpp"
+#include "BLI_string.h"
 
 namespace FN {
 
@@ -16,13 +17,50 @@ LLVMTypes CodeBuilder::types_of_values(const LLVMValues &values)
   return this->types_of_values(LLVMValuesRef(values));
 }
 
+static llvm::Function *create_wrapper_function(llvm::Module *module,
+                                               llvm::FunctionType *ftype,
+                                               void *func_ptr,
+                                               const char *name)
+{
+  llvm::Function *function = llvm::Function::Create(
+      ftype, llvm::GlobalValue::LinkageTypes::InternalLinkage, name, module);
+
+  llvm::BasicBlock *bb = llvm::BasicBlock::Create(module->getContext(), "entry", function);
+  llvm::IRBuilder<> builder(bb);
+
+  LLVMValues args;
+  for (auto &arg : function->args()) {
+    args.append(&arg);
+  }
+
+  llvm::Value *address_int = builder.getInt64((size_t)func_ptr);
+  llvm::Value *address = builder.CreateIntToPtr(address_int, ftype->getPointerTo());
+  llvm::Value *result = builder.CreateCall(address, to_llvm_array_ref(args));
+
+  if (ftype->getReturnType() == builder.getVoidTy()) {
+    builder.CreateRetVoid();
+  }
+  else {
+    builder.CreateRet(result);
+  }
+  return function;
+}
+
 llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
                                             llvm::FunctionType *ftype,
-                                            LLVMValuesRef args)
+                                            LLVMValuesRef args,
+                                            const char *function_name)
 {
-  auto address_int = m_builder.getInt64((size_t)func_ptr);
-  auto address = m_builder.CreateIntToPtr(address_int, ftype->getPointerTo());
-  return m_builder.CreateCall(address, to_llvm_array_ref(args));
+  char name[64];
+  BLI_snprintf(name, sizeof(name), "%s (%p)", function_name, func_ptr);
+
+  llvm::Module *module = this->getModule();
+  llvm::Function *wrapper_function = module->getFunction(name);
+  if (wrapper_function == nullptr) {
+    wrapper_function = create_wrapper_function(module, ftype, func_ptr, name);
+  }
+
+  return m_builder.CreateCall(wrapper_function, to_llvm_array_ref(args));
 }
 
 llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index af98ecd3b4d..b6829b7f2d2 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -233,6 +233,11 @@ class CodeBuilder {
     return this->CastToBytePtr(addr);
   }
 
+  llvm::Value *CreateIntToPtr(llvm::Value *value, llvm::Type *pointer_type)
+  {
+    return m_builder.CreateIntToPtr(value, pointer_type);
+  }
+
   llvm::Value *CastToPointerOf(llvm::Value *addr, llvm::Type *base_type)
   {
     return m_builder.CreatePointerCast(addr, base_type->getPointerTo());
@@ -288,7 +293,10 @@ class CodeBuilder {
     return m_builder.CreateInsertElement(vector, value, index);
   }
 
-  llvm::Value *CreateCallPointer(void *func_ptr, llvm::FunctionType *ftype, LLVMValuesRef args);
+  llvm::Value *CreateCallPointer(void *func_ptr,
+                                 llvm::FunctionType *ftype,
+                                 LLVMValuesRef args,
+                                 const char *function_name = "");
   llvm::Value *CreateCallPointer(void *func_ptr,
                                  llvm::FunctionType *ftype,
                                  const LLVMValues &args);



More information about the Bf-blender-cvs mailing list