[Bf-blender-cvs] [0ed75e7dbe9] functions: only types know how they should be stored/loaded
Jacques Lucke
noreply at git.blender.org
Sat Mar 2 12:49:03 CET 2019
Commit: 0ed75e7dbe9f42208370bdac49c88196e151a396
Author: Jacques Lucke
Date: Sat Mar 2 12:48:47 2019 +0100
Branches: functions
https://developer.blender.org/rB0ed75e7dbe9f42208370bdac49c88196e151a396
only types know how they should be stored/loaded
===================================================================
M source/blender/functions/backends/llvm/llvm_types.cpp
M source/blender/functions/backends/llvm/llvm_types.hpp
M source/blender/functions/backends/llvm/to_tuple_call.cpp
===================================================================
diff --git a/source/blender/functions/backends/llvm/llvm_types.cpp b/source/blender/functions/backends/llvm/llvm_types.cpp
index 4be4374629f..b91e34d2c29 100644
--- a/source/blender/functions/backends/llvm/llvm_types.cpp
+++ b/source/blender/functions/backends/llvm/llvm_types.cpp
@@ -13,7 +13,8 @@ namespace FN {
delete value_;
}
- llvm::Type *LLVMTypeInfo::get_type(llvm::LLVMContext &context)
+ llvm::Type *LLVMTypeInfo::get_type(
+ llvm::LLVMContext &context) const
{
if (!m_type_per_context.contains(&context)) {
llvm::Type *type = this->create_type(context);
@@ -22,18 +23,43 @@ namespace FN {
return m_type_per_context.lookup(&context);
}
+ llvm::Type *LLVMTypeInfo::get_type_ptr(
+ llvm::LLVMContext &context) const
+ {
+ return this->get_type(context)->getPointerTo();
+ }
+
llvm::Value *LLVMTypeInfo::build_copy_ir(
llvm::IRBuilder<> &UNUSED(builder),
- llvm::Value *value)
+ llvm::Value *value) const
{
return value;
}
void LLVMTypeInfo::build_free_ir(
llvm::IRBuilder<> &UNUSED(builder),
- llvm::Value *UNUSED(value))
+ llvm::Value *UNUSED(value)) const
{
return;
}
+ void LLVMTypeInfo::build_store_ir__relocate(
+ llvm::IRBuilder<> &builder,
+ llvm::Value *value,
+ llvm::Value *byte_addr) const
+ {
+ llvm::Type *ptr_type = value->getType()->getPointerTo();
+ llvm::Value *addr = builder.CreatePointerCast(byte_addr, ptr_type);
+ builder.CreateStore(value, addr, false);
+ }
+
+ llvm::Value *LLVMTypeInfo::build_load_ir__copy(
+ llvm::IRBuilder<> &builder,
+ llvm::Value *byte_addr) const
+ {
+ llvm::Type *ptr_type = this->get_type_ptr(builder.getContext());
+ llvm::Value *addr = builder.CreatePointerCast(byte_addr, ptr_type);
+ return builder.CreateLoad(addr);
+ }
+
};
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/llvm_types.hpp b/source/blender/functions/backends/llvm/llvm_types.hpp
index 0ac15482e91..c419b79f1ee 100644
--- a/source/blender/functions/backends/llvm/llvm_types.hpp
+++ b/source/blender/functions/backends/llvm/llvm_types.hpp
@@ -16,21 +16,33 @@ namespace FN {
virtual ~LLVMTypeInfo() {}
llvm::Type *get_type(
- llvm::LLVMContext &context);
+ llvm::LLVMContext &context) const;
+
+ llvm::Type *get_type_ptr(
+ llvm::LLVMContext &context) const;
virtual llvm::Value *build_copy_ir(
llvm::IRBuilder<> &builder,
- llvm::Value *value);
+ llvm::Value *value) const;
virtual void build_free_ir(
llvm::IRBuilder<> &builder,
- llvm::Value *value);
+ llvm::Value *value) const;
+
+ virtual void build_store_ir__relocate(
+ llvm::IRBuilder<> &builder,
+ llvm::Value *value,
+ llvm::Value *byte_addr) const;
+
+ virtual llvm::Value *build_load_ir__copy(
+ llvm::IRBuilder<> &builder,
+ llvm::Value *byte_addr) const;
private:
- SmallMap<llvm::LLVMContext *, llvm::Type *> m_type_per_context;
+ mutable SmallMap<llvm::LLVMContext *, llvm::Type *> m_type_per_context;
virtual llvm::Type *create_type(
- llvm::LLVMContext &context) = 0;
+ llvm::LLVMContext &context) const = 0;
};
class SimpleLLVMTypeInfo : public LLVMTypeInfo {
@@ -38,7 +50,7 @@ namespace FN {
typedef std::function<llvm::Type *(llvm::LLVMContext &context)> CreateFunc;
CreateFunc m_create_func;
- llvm::Type *create_type(llvm::LLVMContext &context)
+ llvm::Type *create_type(llvm::LLVMContext &context) const
{
return m_create_func(context);
}
diff --git a/source/blender/functions/backends/llvm/to_tuple_call.cpp b/source/blender/functions/backends/llvm/to_tuple_call.cpp
index 1ef1fea343c..2dc3e9e911a 100644
--- a/source/blender/functions/backends/llvm/to_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/to_tuple_call.cpp
@@ -12,7 +12,7 @@ namespace FN {
using LLVMTypes = BLI::SmallVector<llvm::Type *>;
- static LLVMTypeInfo *type_info(const SharedType &type)
+ static LLVMTypeInfo *get_type_info(const SharedType &type)
{
auto ext = type->extension<LLVMTypeInfo>();
BLI_assert(ext);
@@ -74,13 +74,14 @@ namespace FN {
LLVMValues input_values;
for (uint i = 0; i < fn->signature().inputs().size(); i++) {
- llvm::Type *value_type = type_info(fn->signature().inputs()[i].type())->get_type(context);
-
llvm::Value *value_byte_addr = lookup_tuple_address(
builder, fn_in_data, fn_in_offsets, i);
- llvm::Value *value_addr = builder.CreatePointerCast(
- value_byte_addr, value_type->getPointerTo());
- llvm::Value *value = builder.CreateLoad(value_addr);
+
+ LLVMTypeInfo *type_info = get_type_info(
+ fn->signature().inputs()[i].type());
+ llvm::Value *value = type_info->build_load_ir__copy(
+ builder, value_byte_addr);
+
input_values.append(value);
}
@@ -90,13 +91,13 @@ namespace FN {
body->build_ir(builder, input_values, output_values);
for (uint i = 0; i < output_values.size(); i++) {
- llvm::Type *value_type = output_values[i]->getType();
-
llvm::Value *value_byte_addr = lookup_tuple_address(
builder, fn_out_data, fn_out_offsets, i);
- llvm::Value *value_addr = builder.CreatePointerCast(
- value_byte_addr, value_type->getPointerTo());
- builder.CreateStore(output_values[i], value_addr);
+
+ LLVMTypeInfo *type_info = get_type_info(
+ fn->signature().outputs()[i].type());
+ type_info->build_store_ir__relocate(
+ builder, output_values[i], value_byte_addr);
}
builder.CreateRetVoid();
More information about the Bf-blender-cvs
mailing list