[Bf-blender-cvs] [2524a5e509d] functions: new TrivialLLVMTypeInfo to simplify creating other types
Jacques Lucke
noreply at git.blender.org
Tue Apr 30 13:59:14 CEST 2019
Commit: 2524a5e509d09af85be620148ca4012f6083c348
Author: Jacques Lucke
Date: Tue Apr 30 12:35:19 2019 +0200
Branches: functions
https://developer.blender.org/rB2524a5e509d09af85be620148ca4012f6083c348
new TrivialLLVMTypeInfo to simplify creating other types
===================================================================
M source/blender/functions/backends/llvm/llvm_types.cpp
M source/blender/functions/backends/llvm/llvm_types.hpp
M source/blender/functions/types/boolean.cpp
===================================================================
diff --git a/source/blender/functions/backends/llvm/llvm_types.cpp b/source/blender/functions/backends/llvm/llvm_types.cpp
index fe4a60c6199..814b4f1852c 100644
--- a/source/blender/functions/backends/llvm/llvm_types.cpp
+++ b/source/blender/functions/backends/llvm/llvm_types.cpp
@@ -6,45 +6,68 @@ namespace FN {
BLI_COMPOSITION_IMPLEMENTATION(LLVMTypeInfo);
-/******************** SimpleLLVMTypeInfo ********************/
+LLVMTypeInfo::~LLVMTypeInfo()
+{
+}
+
+/******************** TrivialLLVMTypeInfo ********************/
+
+llvm::Type *TrivialLLVMTypeInfo::get_type(llvm::LLVMContext &context) const
+{
+ return m_create_func(context);
+}
-llvm::Value *SimpleLLVMTypeInfo::build_copy_ir(CodeBuilder &UNUSED(builder),
- llvm::Value *value) const
+llvm::Value *TrivialLLVMTypeInfo::build_copy_ir(CodeBuilder &UNUSED(builder),
+ llvm::Value *value) const
{
return value;
}
-void SimpleLLVMTypeInfo::build_free_ir(CodeBuilder &UNUSED(builder),
- llvm::Value *UNUSED(value)) const
+void TrivialLLVMTypeInfo::build_free_ir(CodeBuilder &UNUSED(builder),
+ llvm::Value *UNUSED(value)) const
{
return;
}
-void SimpleLLVMTypeInfo::build_store_ir__relocate(CodeBuilder &builder,
- llvm::Value *value,
- llvm::Value *byte_addr) const
+llvm::Value *TrivialLLVMTypeInfo::build_load_ir__relocate(CodeBuilder &builder,
+ llvm::Value *address) const
+{
+ return this->build_load_ir__copy(builder, address);
+}
+
+void TrivialLLVMTypeInfo::build_store_ir__relocate(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const
+{
+ return this->build_store_ir__copy(builder, value, address);
+}
+
+/******************** SimpleLLVMTypeInfo ********************/
+
+void SimpleLLVMTypeInfo::build_store_ir__copy(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const
{
llvm::Type *type = value->getType();
- llvm::Value *addr = builder.CastToPointerOf(byte_addr, type);
+ llvm::Value *addr = builder.CastToPointerOf(address, type);
builder.CreateStore(value, addr);
}
llvm::Value *SimpleLLVMTypeInfo::build_load_ir__copy(CodeBuilder &builder,
- llvm::Value *byte_addr) const
+ llvm::Value *address) const
{
llvm::Type *type = this->get_type(builder.getContext());
- llvm::Value *addr = builder.CastToPointerOf(byte_addr, type);
+ llvm::Value *addr = builder.CastToPointerOf(address, type);
return builder.CreateLoad(addr);
}
-llvm::Value *SimpleLLVMTypeInfo::build_load_ir__relocate(CodeBuilder &builder,
- llvm::Value *byte_addr) const
+/******************** PointerLLVMTypeInfo ********************/
+
+llvm::Type *PointerLLVMTypeInfo::get_type(llvm::LLVMContext &context) const
{
- return this->build_load_ir__copy(builder, byte_addr);
+ return llvm::Type::getVoidTy(context)->getPointerTo();
}
-/******************** PointerLLVMTypeInfo ********************/
-
void *PointerLLVMTypeInfo::copy_value(PointerLLVMTypeInfo *info, void *value)
{
return info->m_copy_func(value);
@@ -76,26 +99,34 @@ void PointerLLVMTypeInfo::build_free_ir(CodeBuilder &builder, llvm::Value *value
{builder.getVoidPtr((void *)this), value});
}
+void PointerLLVMTypeInfo::build_store_ir__copy(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const
+{
+ auto *copied_value = this->build_copy_ir(builder, value);
+ this->build_store_ir__relocate(builder, copied_value, address);
+}
+
void PointerLLVMTypeInfo::build_store_ir__relocate(CodeBuilder &builder,
llvm::Value *value,
- llvm::Value *byte_addr) const
+ llvm::Value *address) const
{
- auto *addr = builder.CastToPointerOf(byte_addr, builder.getVoidPtrTy());
+ auto *addr = builder.CastToPointerOf(address, builder.getVoidPtrTy());
builder.CreateStore(value, addr);
}
llvm::Value *PointerLLVMTypeInfo::build_load_ir__copy(CodeBuilder &builder,
- llvm::Value *byte_addr) const
+ llvm::Value *address) const
{
- auto *value = this->build_load_ir__relocate(builder, byte_addr);
+ auto *value = this->build_load_ir__relocate(builder, address);
this->build_copy_ir(builder, value);
return value;
}
llvm::Value *PointerLLVMTypeInfo::build_load_ir__relocate(CodeBuilder &builder,
- llvm::Value *byte_addr) const
+ llvm::Value *address) const
{
- auto *addr = builder.CastToPointerOf(byte_addr, builder.getVoidPtrTy());
+ auto *addr = builder.CastToPointerOf(address, builder.getVoidPtrTy());
return builder.CreateLoad(addr);
}
diff --git a/source/blender/functions/backends/llvm/llvm_types.hpp b/source/blender/functions/backends/llvm/llvm_types.hpp
index 9e3a024e3fc..5d5b0f2ed61 100644
--- a/source/blender/functions/backends/llvm/llvm_types.hpp
+++ b/source/blender/functions/backends/llvm/llvm_types.hpp
@@ -13,53 +13,51 @@ class LLVMTypeInfo : public TypeExtension {
public:
BLI_COMPOSITION_DECLARATION(LLVMTypeInfo);
- virtual ~LLVMTypeInfo()
- {
- }
+ virtual ~LLVMTypeInfo();
virtual llvm::Type *get_type(llvm::LLVMContext &context) const = 0;
-
virtual llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const = 0;
-
virtual void build_free_ir(CodeBuilder &builder, llvm::Value *value) const = 0;
-
virtual void build_store_ir__relocate(CodeBuilder &builder,
llvm::Value *value,
- llvm::Value *byte_addr) const = 0;
-
- virtual llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *byte_addr) const = 0;
-
+ llvm::Value *address) const = 0;
+ virtual void build_store_ir__copy(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const = 0;
+ virtual llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const = 0;
virtual llvm::Value *build_load_ir__relocate(CodeBuilder &builder,
- llvm::Value *byte_addr) const = 0;
+ llvm::Value *address) const = 0;
};
-class SimpleLLVMTypeInfo : public LLVMTypeInfo {
- private:
+class TrivialLLVMTypeInfo : public LLVMTypeInfo {
+ protected:
typedef std::function<llvm::Type *(llvm::LLVMContext &context)> CreateFunc;
CreateFunc m_create_func;
public:
- SimpleLLVMTypeInfo(CreateFunc create_func) : m_create_func(create_func)
- {
- }
-
- llvm::Type *get_type(llvm::LLVMContext &context) const override
+ TrivialLLVMTypeInfo(CreateFunc create_func) : m_create_func(create_func)
{
- return m_create_func(context);
}
+ llvm::Type *get_type(llvm::LLVMContext &context) const override;
llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const override;
-
void build_free_ir(CodeBuilder &builder, llvm::Value *value) const override;
-
void build_store_ir__relocate(CodeBuilder &builder,
llvm::Value *value,
- llvm::Value *byte_addr) const override;
+ llvm::Value *address) const override;
+ llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override;
+};
- llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *byte_addr) const override;
+class SimpleLLVMTypeInfo : public TrivialLLVMTypeInfo {
+ public:
+ SimpleLLVMTypeInfo(CreateFunc create_func) : TrivialLLVMTypeInfo(create_func)
+ {
+ }
- llvm::Value *build_load_ir__relocate(CodeBuilder &builder,
- llvm::Value *byte_addr) const override;
+ llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override;
+ void build_store_ir__copy(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const override;
};
class PointerLLVMTypeInfo : public LLVMTypeInfo {
@@ -82,23 +80,17 @@ class PointerLLVMTypeInfo : public LLVMTypeInfo {
{
}
- llvm::Type *get_type(llvm::LLVMContext &context) const override
- {
- return llvm::Type::getVoidTy(context)->getPointerTo();
- }
-
+ llvm::Type *get_type(llvm::LLVMContext &context) const override;
llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const override;
-
void build_free_ir(CodeBuilder &builder, llvm::Value *value) const override;
-
+ void build_store_ir__copy(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const override;
void build_store_ir__relocate(CodeBuilder &builder,
llvm::Value *value,
- llvm::Value *byte_addr) const override;
-
- llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *byte_addr) const override;
-
- llvm::Value *build_load_ir__relocate(CodeBuilder &builder,
- llvm::Value *byte_addr) const override;
+ llvm::Value *address) const override;
+ llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list