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();

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to