[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