[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