[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