[Bf-blender-cvs] [a22b7177d22] functions: improve llvm type info for shared immutable types
Jacques Lucke
noreply at git.blender.org
Fri Sep 6 16:55:42 CEST 2019
Commit: a22b7177d22c9d23b9db04c0d638eeafe2342474
Author: Jacques Lucke
Date: Fri Sep 6 12:17:16 2019 +0200
Branches: functions
https://developer.blender.org/rBa22b7177d22c9d23b9db04c0d638eeafe2342474
improve llvm type info for shared immutable types
===================================================================
M source/blender/functions/backends/llvm/builder.hpp
M source/blender/functions/backends/llvm/llvm_type_info.hpp
M source/blender/functions/types/lists.cpp
===================================================================
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index f87278edc9d..2458d3a62eb 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -331,6 +331,11 @@ class CodeBuilder {
return this->CastToPointerOf(addr, stride_type);
}
+ llvm::Value *CastToAnyPtrPtr(llvm::Value *addr)
+ {
+ return this->CastToPointerOf(addr, this->getAnyPtrTy());
+ }
+
llvm::Value *CastToAnyPtr(llvm::Value *addr)
{
return m_builder.CreatePointerCast(addr, this->getAnyPtrTy());
diff --git a/source/blender/functions/backends/llvm/llvm_type_info.hpp b/source/blender/functions/backends/llvm/llvm_type_info.hpp
index a1794710cbc..29834abcca8 100644
--- a/source/blender/functions/backends/llvm/llvm_type_info.hpp
+++ b/source/blender/functions/backends/llvm/llvm_type_info.hpp
@@ -158,7 +158,7 @@ class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
llvm::Value *value,
llvm::Value *address) const override
{
- auto *addr = builder.CastToBytePtr(address);
+ auto *addr = builder.CastToAnyPtrPtr(address);
builder.CreateStore(value, addr);
}
@@ -171,7 +171,7 @@ class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
{
- auto *addr = builder.CastToBytePtr(address);
+ auto *addr = builder.CastToAnyPtrPtr(address);
return builder.CreateLoad(addr);
}
@@ -181,6 +181,86 @@ class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
}
};
+/**
+ * Use this when the type is reference counted. Furthermore, the type has to be immutable when
+ * object is owned by more than one.
+ */
+template<typename T> class SharedImmutablePointerLLVMTypeInfo : public LLVMTypeInfo {
+ private:
+ static T *copy_by_incrementing_refcount(T *value)
+ {
+ if (value == nullptr) {
+ return nullptr;
+ }
+ else {
+ value->incref();
+ return value;
+ }
+ }
+
+ static void free_by_decrementing_refcount(T *value)
+ {
+ if (value != nullptr) {
+ value->decref();
+ }
+ }
+
+ public:
+ llvm::Type *get_type(llvm::LLVMContext &context) const override
+ {
+ return llvm::Type::getInt8PtrTy(context);
+ }
+
+ llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const override
+ {
+ return builder.CreateCallPointer((void *)copy_by_incrementing_refcount,
+ {value},
+ builder.getAnyPtrTy(),
+ "copy by incrementing refcount");
+ }
+
+ void build_free_ir(CodeBuilder &builder, llvm::Value *value) const override
+ {
+ builder.CreateCallPointer((void *)free_by_decrementing_refcount,
+ {value},
+ builder.getVoidTy(),
+ "free by decrementing refcount");
+ }
+
+ void build_store_ir__copy(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const override
+ {
+ auto copied_value = this->build_copy_ir(builder, value);
+ this->build_store_ir__relocate(builder, copied_value, address);
+ }
+
+ void build_store_ir__relocate(CodeBuilder &builder,
+ llvm::Value *value,
+ llvm::Value *address) const override
+ {
+ auto *addr = builder.CastToAnyPtrPtr(address);
+ builder.CreateStore(value, addr);
+ }
+
+ llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
+ {
+ auto *addr = builder.CastToAnyPtrPtr(address);
+ auto *value = builder.CreateLoad(addr);
+ auto *copied_value = this->build_copy_ir(builder, value);
+ return copied_value;
+ }
+
+ llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override
+ {
+ auto *addr = builder.CastToAnyPtrPtr(address);
+ auto *value = builder.CreateLoad(addr);
+ auto *nullptr_value = builder.getAnyPtr((void *)nullptr);
+ builder.CreateStore(nullptr_value, addr);
+ return value;
+ }
+};
+
/**
* The type has to implement a clone() method.
*/
@@ -232,13 +312,13 @@ template<typename T> class OwningPointerLLVMTypeInfo : public LLVMTypeInfo {
llvm::Value *value,
llvm::Value *address) const override
{
- auto *addr = builder.CastToBytePtr(address);
+ auto *addr = builder.CastToAnyPtrPtr(address);
builder.CreateStore(value, addr);
}
llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
{
- auto *addr = builder.CastToBytePtr(address);
+ auto *addr = builder.CastToAnyPtrPtr(address);
auto *value = builder.CreateLoad(addr);
auto *copied_value = this->build_copy_ir(builder, value);
return copied_value;
@@ -246,9 +326,9 @@ template<typename T> class OwningPointerLLVMTypeInfo : public LLVMTypeInfo {
llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override
{
- auto *addr = builder.CastToBytePtr(address);
+ auto *addr = builder.CastToAnyPtrPtr(address);
auto *value = builder.CreateLoad(addr);
- auto *nullptr_value = builder.getPtr(nullptr, builder.getAnyPtrTy());
+ auto *nullptr_value = builder.getAnyPtr((void *)nullptr);
builder.CreateStore(nullptr_value, addr);
return value;
}
diff --git a/source/blender/functions/types/lists.cpp b/source/blender/functions/types/lists.cpp
index ea7b7be6203..aaa30dd3e83 100644
--- a/source/blender/functions/types/lists.cpp
+++ b/source/blender/functions/types/lists.cpp
@@ -32,20 +32,10 @@ class ListTypeInfo : public CPPTypeInfoForType<SharedList> {
Type *new_list_type(Type *base_type)
{
+ BLI_STATIC_ASSERT(sizeof(SharedList) == sizeof(List *), "");
Type *type = new Type(base_type->name() + " List");
type->add_extension<ListTypeInfo>(base_type);
- type->add_extension<PointerLLVMTypeInfo>(
- /* Copy list by incrementing the reference counter. */
- [](void *list) -> void * {
- List *list_ = static_cast<List *>(list);
- list_->incref();
- return static_cast<void *>(list);
- },
- /* Free list by decrementing the reference counter. */
- [](void *list) {
- List *list_ = static_cast<List *>(list);
- list_->decref();
- });
+ type->add_extension<SharedImmutablePointerLLVMTypeInfo<List>>();
return type;
}
More information about the Bf-blender-cvs
mailing list