[Bf-blender-cvs] [b15422560b7] nodes_playground: PointerType template

Jacques Lucke noreply at git.blender.org
Sun Jan 6 17:25:53 CET 2019


Commit: b15422560b76b131ee3317d734b6060d61f75894
Author: Jacques Lucke
Date:   Sun Jan 6 17:12:10 2019 +0100
Branches: nodes_playground
https://developer.blender.org/rBb15422560b76b131ee3317d734b6060d61f75894

PointerType template

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

M	source/blender/modifiers/intern/node_compiler.cpp
M	source/blender/modifiers/intern/node_compiler.hpp
M	source/blender/modifiers/intern/node_compiler_testing.cpp

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

diff --git a/source/blender/modifiers/intern/node_compiler.cpp b/source/blender/modifiers/intern/node_compiler.cpp
index 7d430d310ec..37efefe839c 100644
--- a/source/blender/modifiers/intern/node_compiler.cpp
+++ b/source/blender/modifiers/intern/node_compiler.cpp
@@ -5,6 +5,9 @@
 
 namespace LLVMNodeCompiler {
 
+/* Type
+ ****************************************/
+
 llvm::Type *Type::getLLVMType(llvm::LLVMContext &context)
 {
 	if (!this->typePerContext.contains(&context)) {
@@ -28,6 +31,10 @@ void Type::buildFreeIR(
 	return;
 }
 
+
+/* LinkSet
+ ********************************************/
+
 AnySocket LinkSet::getOriginSocket(AnySocket socket) const
 {
 	assert(socket.is_input());
@@ -92,6 +99,9 @@ std::string Node::debug_id() const
 	return ss.str();
 }
 
+/* IR Utils
+ ********************************************/
+
 llvm::CallInst *callPointer(
 	llvm::IRBuilder<> &builder,
 	void *pointer, llvm::FunctionType *type, llvm::ArrayRef<llvm::Value *> arguments)
@@ -101,6 +111,27 @@ llvm::CallInst *callPointer(
 	return builder.CreateCall(address, arguments);
 }
 
+llvm::Value *voidPtrToIR(llvm::IRBuilder<> &builder, void *pointer)
+{
+	return builder.CreateIntToPtr(
+		builder.getInt64((size_t)pointer),
+		getVoidPtrTy(builder));
+}
+
+llvm::Type *getVoidPtrTy(llvm::IRBuilder<> &builder)
+{
+	return builder.getVoidTy()->getPointerTo();
+}
+
+llvm::Type *getVoidPtrTy(llvm::LLVMContext &context)
+{
+	return llvm::Type::getVoidTy(context)->getPointerTo();
+}
+
+
+/* DataFlowGraph
+ **********************************************/
+
 void DataFlowCallable::printCode()
 {
 	this->module->print(llvm::outs(), nullptr);
diff --git a/source/blender/modifiers/intern/node_compiler.hpp b/source/blender/modifiers/intern/node_compiler.hpp
index e495a0dc06a..cdcf994b906 100644
--- a/source/blender/modifiers/intern/node_compiler.hpp
+++ b/source/blender/modifiers/intern/node_compiler.hpp
@@ -23,6 +23,16 @@ struct Type;
 struct LinkSet;
 struct DataFlowGraph;
 
+llvm::CallInst *callPointer(
+	llvm::IRBuilder<> &builder,
+	void *pointer, llvm::FunctionType *type, llvm::ArrayRef<llvm::Value *> arguments);
+
+llvm::Value *voidPtrToIR(llvm::IRBuilder<> &builder, void *pointer);
+
+llvm::Type *getVoidPtrTy(llvm::IRBuilder<> &builder);
+llvm::Type *getVoidPtrTy(llvm::LLVMContext &context);
+
+
 class Type {
 private:
 	HashMap<llvm::LLVMContext *, llvm::Type *> typePerContext;
@@ -33,13 +43,48 @@ private:
 public:
 	llvm::Type *getLLVMType(llvm::LLVMContext &context);
 
-	virtual llvm::Value *buildCopyIR(
-		llvm::IRBuilder<> &builder,
-		llvm::Value *value);
+	virtual llvm::Value *buildCopyIR(llvm::IRBuilder<> &builder, llvm::Value *value);
+	virtual void buildFreeIR(llvm::IRBuilder<> &builder, llvm::Value *value);
+};
 
-	virtual void buildFreeIR(
-		llvm::IRBuilder<> &builder,
-		llvm::Value *value);
+template<typename T>
+class PointerType : public Type {
+private:
+	static void *copy_(PointerType<T> *self, void *value)
+	{ return (void *)self->copy((T *)value); }
+	static void free_(PointerType<T> *self, void *value)
+	{ self->free((T *)value); }
+
+public:
+	virtual T *copy(T *value) = 0;
+	virtual void free(T *value) = 0;
+
+	llvm::Value *buildCopyIR(llvm::IRBuilder<> &builder, llvm::Value *value)
+	{
+		llvm::Type *void_ptr = getVoidPtrTy(builder);
+
+		llvm::FunctionType *ftype = llvm::FunctionType::get(
+			void_ptr, { void_ptr, void_ptr }, false);
+
+		llvm::Value *this_pointer = voidPtrToIR(builder, this);
+		return callPointer(builder, (void *)copy_, ftype, { this_pointer, value });
+	}
+
+	void buildFreeIR(llvm::IRBuilder<> &builder, llvm::Value *value)
+	{
+		llvm::Type *void_ptr = getVoidPtrTy(builder);
+
+		llvm::FunctionType *ftype = llvm::FunctionType::get(
+			builder.getVoidTy(), {void_ptr, void_ptr}, false);
+
+		llvm::Value *this_pointer = voidPtrToIR(builder, this);
+		callPointer(builder, (void *)free_, ftype, { this_pointer, value });
+	}
+
+	llvm::Type *createLLVMType(llvm::LLVMContext &context)
+	{
+		return getVoidPtrTy(context);
+	}
 };
 
 struct AnySocket {
@@ -142,10 +187,6 @@ public:
 	{ return AnySocket::NewOutput(this, index); }
 };
 
-llvm::CallInst *callPointer(
-	llvm::IRBuilder<> &builder,
-	void *pointer, llvm::FunctionType *type, llvm::ArrayRef<llvm::Value *> arguments);
-
 class ExecuteFunctionNode : public Node {
 protected:
 	void *execute_function = nullptr;
@@ -164,9 +205,8 @@ public:
 		std::vector<llvm::Type *> arg_types;
 		std::vector<llvm::Value *> arguments;
 		if (this->use_this) {
-			llvm::Value *this_pointer = builder.CreateIntToPtr(builder.getInt64((size_t)this), llvm::Type::getVoidTy(context)->getPointerTo());
-			arguments.push_back(this_pointer);
-			arg_types.push_back(llvm::Type::getVoidTy(context)->getPointerTo());
+			arguments.push_back(voidPtrToIR(builder, this));
+			arg_types.push_back(getVoidPtrTy(builder));
 		}
 
 		arguments.insert(arguments.end(), inputs.begin(), inputs.end());
diff --git a/source/blender/modifiers/intern/node_compiler_testing.cpp b/source/blender/modifiers/intern/node_compiler_testing.cpp
index 43848f03ea0..4995303243c 100644
--- a/source/blender/modifiers/intern/node_compiler_testing.cpp
+++ b/source/blender/modifiers/intern/node_compiler_testing.cpp
@@ -25,26 +25,16 @@ struct MyTypeStruct {
 	int a, b, c;
 };
 
-class MyType : public NC::Type {
+class MyType : public NC::PointerType<MyTypeStruct> {
 public:
-	MyType() {}
-
-	llvm::Type *createLLVMType(llvm::LLVMContext &context)
+	MyTypeStruct *copy(MyTypeStruct *value)
 	{
-		return llvm::Type::getVoidTy(context)->getPointerTo();
-	}
-
-	llvm::Value *buildCopyIR(llvm::IRBuilder<> &builder, llvm::Value *value)
-	{
-		llvm::LLVMContext &context = builder.getContext();
-		llvm::FunctionType *ftype = llvm::FunctionType::get(
-			this->getLLVMType(context), this->getLLVMType(context), false);
-		return NC::callPointer(builder, (void *)copy, ftype, value);
+		return new MyTypeStruct(*value);
 	}
 
-	static MyTypeStruct *copy(MyTypeStruct *value)
+	void free(MyTypeStruct *value)
 	{
-		return new MyTypeStruct(*value);
+		delete value;
 	}
 };
 
@@ -88,7 +78,7 @@ private:
 	{
 		std::cout << "A: " << a->a << " " << a->b << " " << a->c << std::endl;
 		std::cout << "B: " << b->a << " " << b->b << " " << b->c << std::endl;
-		*r_value = 568;
+		*r_value = 1111;
 		printf("%p\n%p\n", a, b);
 		delete a;
 		delete b;



More information about the Bf-blender-cvs mailing list