[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