[Bf-blender-cvs] [c1bad0da7a2] functions: improve LLVMCompiledBody

Jacques Lucke noreply at git.blender.org
Mon Mar 4 16:53:47 CET 2019


Commit: c1bad0da7a29f98eb5faf65c1a8ea8a58eb210db
Author: Jacques Lucke
Date:   Mon Mar 4 16:29:56 2019 +0100
Branches: functions
https://developer.blender.org/rBc1bad0da7a29f98eb5faf65c1a8ea8a58eb210db

improve LLVMCompiledBody

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

M	source/blender/functions/backends/llvm/compile.cpp
M	source/blender/functions/backends/llvm/compiled_body.cpp
M	source/blender/functions/backends/llvm/compiled_body.hpp
M	source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
M	source/blender/functions/core/function.hpp

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

diff --git a/source/blender/functions/backends/llvm/compile.cpp b/source/blender/functions/backends/llvm/compile.cpp
index f49cb41a273..e8415bd06e5 100644
--- a/source/blender/functions/backends/llvm/compile.cpp
+++ b/source/blender/functions/backends/llvm/compile.cpp
@@ -17,13 +17,13 @@ namespace FN {
 		llvm::Function *main_function)
 	{
 		BLI_assert(!llvm::verifyModule(*module, &llvm::outs()));
+		module->print(llvm::outs(), nullptr);
 
 		llvm::ExecutionEngine *ee = llvm::EngineBuilder(
 			std::unique_ptr<llvm::Module>(module)).create();
 		ee->finalizeObject();
 		ee->generateCodeForModule(module);
 
-		//module->print(llvm::outs(), nullptr);
 
 		uint64_t function_ptr = ee->getFunctionAddress(
 			main_function->getName().str());
diff --git a/source/blender/functions/backends/llvm/compiled_body.cpp b/source/blender/functions/backends/llvm/compiled_body.cpp
index 512c948f24d..6f6a9c96a66 100644
--- a/source/blender/functions/backends/llvm/compiled_body.cpp
+++ b/source/blender/functions/backends/llvm/compiled_body.cpp
@@ -17,6 +17,25 @@ namespace FN {
 		delete v;
 	}
 
+	void LLVMCompiledBody::build_ir(
+		llvm::IRBuilder<> &builder,
+		const LLVMValues &inputs,
+		LLVMValues &r_outputs) const
+	{
+		auto *ftype = function_type_from_signature(
+			this->owner()->signature(), builder.getContext());
+
+		llvm::Value *output_struct = call_pointer(
+			builder,
+			this->function_ptr(),
+			ftype,
+			inputs);
+		for (uint i = 0; i < ftype->getReturnType()->getStructNumElements(); i++) {
+			llvm::Value *out = builder.CreateExtractValue(output_struct, i);
+			r_outputs.append(out);
+		}
+	}
+
 	static LLVMCompiledBody *compile_body(
 		SharedFunction &fn,
 		llvm::LLVMContext &context)
diff --git a/source/blender/functions/backends/llvm/compiled_body.hpp b/source/blender/functions/backends/llvm/compiled_body.hpp
index c1e7b049dc7..ca00bc61bda 100644
--- a/source/blender/functions/backends/llvm/compiled_body.hpp
+++ b/source/blender/functions/backends/llvm/compiled_body.hpp
@@ -25,10 +25,15 @@ namespace FN {
 		LLVMCompiledBody(std::unique_ptr<CompiledLLVM> compiled)
 			: m_compiled(std::move(compiled)) {}
 
-		void *function_ptr()
+		void *function_ptr() const
 		{
 			return m_compiled->function_ptr();
 		}
+
+		void build_ir(
+			llvm::IRBuilder<> &builder,
+			const LLVMValues &inputs,
+			LLVMValues &r_outputs) const;
 	};
 
 	void derive_LLVMCompiledBody_from_LLVMBuildIRBody(
diff --git a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
index edb1f0da973..a787390d4f8 100644
--- a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
@@ -130,21 +130,12 @@ namespace FN {
 		llvm::LLVMContext &context)
 	{
 		auto *body = fn->body<LLVMCompiledBody>();
-		return compile_ir_to_tuple_call(fn, context, [&fn, body](
+		return compile_ir_to_tuple_call(fn, context, [body](
 				llvm::IRBuilder<> &builder,
 				const LLVMValues &inputs,
 				LLVMValues &outputs)
 			{
-				auto *ftype = function_type_from_signature(fn->signature(), builder.getContext());
-				llvm::Value *output_struct = call_pointer(
-					builder,
-					body->function_ptr(),
-					ftype,
-					inputs);
-				for (uint i = 0; i < ftype->getReturnType()->getStructNumElements(); i++) {
-					llvm::Value *out = builder.CreateExtractValue(output_struct, i);
-					outputs.append(out);
-				}
+				body->build_ir(builder, inputs, outputs);
 			});
 	}
 
diff --git a/source/blender/functions/core/function.hpp b/source/blender/functions/core/function.hpp
index 1f8c1d5198c..988121cc4b9 100644
--- a/source/blender/functions/core/function.hpp
+++ b/source/blender/functions/core/function.hpp
@@ -18,7 +18,7 @@ namespace FN {
 		friend class Function;
 
 	public:
-		Function *owner()
+		Function *owner() const
 		{
 			return m_owner;
 		}



More information about the Bf-blender-cvs mailing list