[Bf-blender-cvs] [8a8b7d40ac9] functions: deduplicate compilation code

Jacques Lucke noreply at git.blender.org
Sun Mar 3 20:45:03 CET 2019


Commit: 8a8b7d40ac9ce737820626053408b2f1ba8138ad
Author: Jacques Lucke
Date:   Sun Mar 3 20:41:54 2019 +0100
Branches: functions
https://developer.blender.org/rB8a8b7d40ac9ce737820626053408b2f1ba8138ad

deduplicate compilation code

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

M	source/blender/functions/CMakeLists.txt
A	source/blender/functions/backends/llvm/compile.cpp
A	source/blender/functions/backends/llvm/compile.hpp
M	source/blender/functions/backends/llvm/compiled_body.cpp
M	source/blender/functions/backends/llvm/compiled_body.hpp
M	source/blender/functions/backends/llvm/to_tuple_call.cpp
M	source/blender/functions/c_wrapper.cpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index cdc051a7bbc..d9adf6899ce 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -62,6 +62,8 @@ set(SRC
 	backends/llvm/from_tuple_call.cpp
 	backends/llvm/compiled_body.hpp
 	backends/llvm/compiled_body.cpp
+	backends/llvm/compile.hpp
+	backends/llvm/compile.cpp
 	backends/llvm/ir_utils.hpp
 	backends/llvm/ir_utils.cpp
 
diff --git a/source/blender/functions/backends/llvm/compile.cpp b/source/blender/functions/backends/llvm/compile.cpp
new file mode 100644
index 00000000000..eb334128666
--- /dev/null
+++ b/source/blender/functions/backends/llvm/compile.cpp
@@ -0,0 +1,37 @@
+#include "compile.hpp"
+#include "BLI_utildefines.h"
+
+#include <llvm/IR/Verifier.h>
+#include <llvm/ExecutionEngine/ExecutionEngine.h>
+
+namespace FN {
+
+	CompiledLLVM::~CompiledLLVM()
+	{
+		delete m_engine;
+	}
+
+	std::unique_ptr<CompiledLLVM>
+	CompiledLLVM::FromIR(
+		llvm::Module *module,
+		llvm::Function *main_function)
+	{
+		BLI_assert(!llvm::verifyModule(*module, &llvm::outs()));
+
+		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());
+
+		auto result = std::unique_ptr<CompiledLLVM>(new CompiledLLVM());
+		result->m_engine = ee;
+		result->m_func_ptr = (void *)function_ptr;
+		return result;
+	}
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/compile.hpp b/source/blender/functions/backends/llvm/compile.hpp
new file mode 100644
index 00000000000..55eef05c801
--- /dev/null
+++ b/source/blender/functions/backends/llvm/compile.hpp
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <memory>
+
+namespace llvm {
+	class ExecutionEngine;
+	class Module;
+	class Function;
+}
+
+namespace FN {
+
+	class CompiledLLVM {
+	private:
+		llvm::ExecutionEngine *m_engine;
+		void *m_func_ptr;
+
+		CompiledLLVM() = default;
+	public:
+		~CompiledLLVM();
+
+		static std::unique_ptr<CompiledLLVM> FromIR(
+			llvm::Module *module,
+			llvm::Function *main_function);
+
+		void *function_ptr() const
+		{
+			return m_func_ptr;
+		}
+	};
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/compiled_body.cpp b/source/blender/functions/backends/llvm/compiled_body.cpp
index e3d23e8d676..e3a01c213c8 100644
--- a/source/blender/functions/backends/llvm/compiled_body.cpp
+++ b/source/blender/functions/backends/llvm/compiled_body.cpp
@@ -17,33 +17,6 @@ namespace FN {
 		delete v;
 	}
 
-	CompiledLLVMBody::~CompiledLLVMBody()
-	{
-		delete m_engine;
-	}
-
-	CompiledLLVMBody *CompiledLLVMBody::FromIR(
-		llvm::Module *module,
-		llvm::Function *main_func)
-	{
-		BLI_assert(!llvm::verifyModule(*module, &llvm::outs()));
-
-		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_func->getName().str());
-
-		auto body = new CompiledLLVMBody();
-		body->m_engine = ee;
-		body->m_func_ptr = (void *)function_ptr;
-		return body;
-	}
-
 	static CompiledLLVMBody *compile_llvm_body(
 		SharedFunction &fn,
 		llvm::LLVMContext &context)
@@ -87,8 +60,8 @@ namespace FN {
 		}
 		builder.CreateRet(return_value);
 
-		return CompiledLLVMBody::FromIR(
-			module, function);
+		auto compiled = CompiledLLVM::FromIR(module, function);
+		return new CompiledLLVMBody(std::move(compiled));
 	}
 
 	bool try_ensure_CompiledLLVMBody(
diff --git a/source/blender/functions/backends/llvm/compiled_body.hpp b/source/blender/functions/backends/llvm/compiled_body.hpp
index 479da64489f..c35e8556cf9 100644
--- a/source/blender/functions/backends/llvm/compiled_body.hpp
+++ b/source/blender/functions/backends/llvm/compiled_body.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "FN_core.hpp"
+#include "compile.hpp"
 
 namespace llvm {
 	class ExecutionEngine;
@@ -13,8 +14,7 @@ namespace FN {
 
 	class CompiledLLVMBody : public FunctionBody {
 	private:
-		void *m_func_ptr;
-		llvm::ExecutionEngine *m_engine;
+		std::unique_ptr<CompiledLLVM> m_compiled;
 
 		CompiledLLVMBody() = default;
 
@@ -22,15 +22,12 @@ namespace FN {
 		static const char *identifier_in_composition();
 		static void free_self(void *value);
 
-		static CompiledLLVMBody *FromIR(
-			llvm::Module *module,
-			llvm::Function *main_func);
-
-		~CompiledLLVMBody();
+		CompiledLLVMBody(std::unique_ptr<CompiledLLVM> compiled)
+			: m_compiled(std::move(compiled)) {}
 
 		void *function_ptr()
 		{
-			return m_func_ptr;
+			return m_compiled->function_ptr();
 		}
 	};
 
diff --git a/source/blender/functions/backends/llvm/to_tuple_call.cpp b/source/blender/functions/backends/llvm/to_tuple_call.cpp
index db01077ee8f..5138f3cbd30 100644
--- a/source/blender/functions/backends/llvm/to_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/to_tuple_call.cpp
@@ -89,11 +89,15 @@ namespace FN {
 
 	class LLVMTupleCall : public TupleCallBody {
 	private:
+		std::unique_ptr<CompiledLLVM> m_compiled;
 		LLVMCallFN m_call;
 
 	public:
-		LLVMTupleCall(LLVMCallFN call)
-			: m_call(call) {}
+		LLVMTupleCall(std::unique_ptr<CompiledLLVM> compiled)
+			: m_compiled(std::move(compiled))
+		{
+			m_call = (LLVMCallFN)m_compiled->function_ptr();
+		}
 
 		void call(const Tuple &fn_in, Tuple &fn_out) const override
 		{
@@ -117,20 +121,8 @@ namespace FN {
 		llvm::Module *module = new llvm::Module(fn->name(), context);
 		llvm::Function *function = insert_tuple_call_function(fn, build_ir, module);
 
-		module->print(llvm::outs(), nullptr);
-
-		llvm::verifyFunction(*function, &llvm::outs());
-		llvm::verifyModule(*module, &llvm::outs());
-
-		llvm::ExecutionEngine *ee = llvm::EngineBuilder(
-			std::unique_ptr<llvm::Module>(module)).create();
-		ee->finalizeObject();
-		ee->generateCodeForModule(module);
-
-		uint64_t fn_ptr = ee->getFunctionAddress(
-			function->getName().str());
-
-		return new LLVMTupleCall((LLVMCallFN)fn_ptr);
+		auto compiled = CompiledLLVM::FromIR(module, function);
+		return new LLVMTupleCall(std::move(compiled));
 	}
 
 	static TupleCallBody *build_from_compiled(
diff --git a/source/blender/functions/c_wrapper.cpp b/source/blender/functions/c_wrapper.cpp
index d3dcd2c3b9a..cf2fe988199 100644
--- a/source/blender/functions/c_wrapper.cpp
+++ b/source/blender/functions/c_wrapper.cpp
@@ -26,7 +26,7 @@ static void playground()
 	SharedFunction fn = Functions::add_floats();
 
 	llvm::LLVMContext *context = new llvm::LLVMContext();
-	try_ensure_CompiledLLVMBody(fn, *context);
+	//try_ensure_CompiledLLVMBody(fn, *context);
 	try_ensure_TupleCallBody(fn, *context);
 
 	Tuple fn_in(fn->signature().input_types());



More information about the Bf-blender-cvs mailing list