[Bf-blender-cvs] [9ba1fce6086] functions: use specialized llvm type info for pointer references

Jacques Lucke noreply at git.blender.org
Fri Sep 6 16:55:40 CEST 2019


Commit: 9ba1fce60862aa0983f7cd925294a5c195e27b46
Author: Jacques Lucke
Date:   Fri Sep 6 11:37:25 2019 +0200
Branches: functions
https://developer.blender.org/rB9ba1fce60862aa0983f7cd925294a5c195e27b46

use specialized llvm type info for pointer references

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

M	source/blender/functions/backends/llvm/llvm_type_info.hpp
M	source/blender/functions/types/external.cpp

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

diff --git a/source/blender/functions/backends/llvm/llvm_type_info.hpp b/source/blender/functions/backends/llvm/llvm_type_info.hpp
index f1feef827ae..a1794710cbc 100644
--- a/source/blender/functions/backends/llvm/llvm_type_info.hpp
+++ b/source/blender/functions/backends/llvm/llvm_type_info.hpp
@@ -136,6 +136,51 @@ class PointerLLVMTypeInfo : public LLVMTypeInfo {
   llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override;
 };
 
+/**
+ * Use this when the pointer is just referenced is owned by someone else.
+ */
+class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
+  llvm::Type *get_type(llvm::LLVMContext &context) const override
+  {
+    return llvm::Type::getInt8PtrTy(context);
+  }
+
+  llvm::Value *build_copy_ir(CodeBuilder &UNUSED(builder), llvm::Value *value) const override
+  {
+    return value;
+  }
+
+  void build_free_ir(CodeBuilder &UNUSED(builder), llvm::Value *UNUSED(value)) const override
+  {
+  }
+
+  void build_store_ir__copy(CodeBuilder &builder,
+                            llvm::Value *value,
+                            llvm::Value *address) const override
+  {
+    auto *addr = builder.CastToBytePtr(address);
+    builder.CreateStore(value, addr);
+  }
+
+  void build_store_ir__relocate(CodeBuilder &builder,
+                                llvm::Value *value,
+                                llvm::Value *address) const override
+  {
+    this->build_store_ir__copy(builder, value, address);
+  }
+
+  llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
+  {
+    auto *addr = builder.CastToBytePtr(address);
+    return builder.CreateLoad(addr);
+  }
+
+  llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override
+  {
+    return this->build_load_ir__copy(builder, address);
+  }
+};
+
 /**
  * The type has to implement a clone() method.
  */
diff --git a/source/blender/functions/types/external.cpp b/source/blender/functions/types/external.cpp
index 56c21b10f81..97f15f1df9d 100644
--- a/source/blender/functions/types/external.cpp
+++ b/source/blender/functions/types/external.cpp
@@ -15,8 +15,7 @@ void INIT_external(Vector<Type *> &types_to_free)
 {
   TYPE_object = new Type("Object");
   TYPE_object->add_extension<CPPTypeInfoForType<Object *>>();
-  TYPE_object->add_extension<PointerLLVMTypeInfo>([](void *value) { return value; },
-                                                  [](void *UNUSED(value)) {});
+  TYPE_object->add_extension<PointerRefLLVMTypeInfo>();
 
   TYPE_object_list = new_list_type(TYPE_object);



More information about the Bf-blender-cvs mailing list