[Bf-blender-cvs] [cdf4591edbe] functions: Improve interface of IR generators and wrap IRBuilder<>
Jacques Lucke
noreply at git.blender.org
Thu Mar 28 12:49:15 CET 2019
Commit: cdf4591edbecfbec4ad9a0794d4c44194291ebf6
Author: Jacques Lucke
Date: Thu Mar 28 12:47:29 2019 +0100
Branches: functions
https://developer.blender.org/rBcdf4591edbecfbec4ad9a0794d4c44194291ebf6
Improve interface of IR generators and wrap IRBuilder<>
===================================================================
M source/blender/functions/CMakeLists.txt
M source/blender/functions/FN_llvm.hpp
M source/blender/functions/backends/llvm/build_ir_body.hpp
A source/blender/functions/backends/llvm/builder.cpp
A source/blender/functions/backends/llvm/builder.hpp
M source/blender/functions/backends/llvm/compiled_body.cpp
M source/blender/functions/backends/llvm/compiled_body.hpp
M source/blender/functions/backends/llvm/fgraph_ir_generation.cpp
M source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
M source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
D source/blender/functions/backends/llvm/ir_utils.cpp
D source/blender/functions/backends/llvm/ir_utils.hpp
M source/blender/functions/backends/llvm/llvm_types.cpp
M source/blender/functions/backends/llvm/llvm_types.hpp
M source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
M source/blender/functions/functions/scalar_math.cpp
M source/blender/functions/functions/vectors.cpp
M source/blender/functions/types/boolean.cpp
M source/blender/functions/types/numeric_lists.cpp
===================================================================
diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 41b591076f5..4ac1189eb4b 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -76,10 +76,10 @@ set(SRC
backends/llvm/compiled_body.cpp
backends/llvm/compile.hpp
backends/llvm/compile.cpp
- backends/llvm/ir_utils.hpp
- backends/llvm/ir_utils.cpp
backends/llvm/fgraph_ir_generation.hpp
backends/llvm/fgraph_ir_generation.cpp
+ backends/llvm/builder.hpp
+ backends/llvm/builder.cpp
types/lists.hpp
types/numeric_lists.hpp
diff --git a/source/blender/functions/FN_llvm.hpp b/source/blender/functions/FN_llvm.hpp
index 6cc0e069212..e4c63d4beef 100644
--- a/source/blender/functions/FN_llvm.hpp
+++ b/source/blender/functions/FN_llvm.hpp
@@ -6,4 +6,5 @@
#include "backends/llvm/ir_to_tuple_call.hpp"
#include "backends/llvm/ir_for_tuple_call.hpp"
#include "backends/llvm/compiled_body.hpp"
-#include "backends/llvm/fgraph_ir_generation.hpp"
\ No newline at end of file
+#include "backends/llvm/fgraph_ir_generation.hpp"
+#include "backends/llvm/builder.hpp"
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/build_ir_body.hpp b/source/blender/functions/backends/llvm/build_ir_body.hpp
index 62e07912558..742baac849d 100644
--- a/source/blender/functions/backends/llvm/build_ir_body.hpp
+++ b/source/blender/functions/backends/llvm/build_ir_body.hpp
@@ -1,12 +1,37 @@
#pragma once
-#include "FN_core.hpp"
-#include <llvm/IR/IRBuilder.h>
+#include "builder.hpp"
namespace FN {
- using LLVMValues = SmallVector<llvm::Value *>;
- using LLVMTypes = BLI::SmallVector<llvm::Type *>;
+ class BuildIRSettings {
+
+ };
+
+ class CodeInterface {
+ private:
+ LLVMValues &m_inputs;
+ LLVMValues &m_outputs;
+
+ public:
+ CodeInterface(LLVMValues &inputs, LLVMValues &outputs)
+ : m_inputs(inputs), m_outputs(outputs) {}
+
+ llvm::Value *get_input(uint index)
+ {
+ return m_inputs[index];
+ }
+
+ void set_output(uint index, llvm::Value *value)
+ {
+ m_outputs[index] = value;
+ }
+
+ const LLVMValues &inputs()
+ {
+ return m_inputs;
+ }
+ };
class LLVMBuildIRBody : public FunctionBody {
public:
@@ -15,9 +40,9 @@ namespace FN {
virtual ~LLVMBuildIRBody() {};
virtual void build_ir(
- llvm::IRBuilder<> &builder,
- const LLVMValues &inputs,
- LLVMValues &r_outputs) const = 0;
+ CodeBuilder &builder,
+ CodeInterface &interface,
+ const BuildIRSettings &settings) const = 0;
};
}
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
new file mode 100644
index 00000000000..ce5bec98026
--- /dev/null
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -0,0 +1,14 @@
+#include "builder.hpp"
+
+namespace FN {
+
+ LLVMTypes CodeBuilder::types_of_values(const LLVMValues &values)
+ {
+ LLVMTypes types;
+ for (llvm::Value *value : values) {
+ types.append(value->getType());
+ }
+ return types;
+ }
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
new file mode 100644
index 00000000000..b599e257af1
--- /dev/null
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -0,0 +1,200 @@
+#pragma once
+
+#include "FN_core.hpp"
+#include <llvm/IR/IRBuilder.h>
+
+namespace FN {
+
+ using LLVMValues = SmallVector<llvm::Value *>;
+ using LLVMTypes = BLI::SmallVector<llvm::Type *>;
+ class LLVMTypeInfo;
+
+ template<typename T>
+ static llvm::ArrayRef<T> to_array_ref(const SmallVector<T> &vector)
+ {
+ return llvm::ArrayRef<T>(vector.begin(), vector.end());
+ }
+
+
+ class CodeBuilder {
+ private:
+ llvm::IRBuilder<> m_builder;
+
+ public:
+ CodeBuilder(llvm::IRBuilder<> &builder)
+ : m_builder(builder) {}
+
+ CodeBuilder(llvm::BasicBlock *bb)
+ : m_builder(bb) {}
+
+ /* Getters
+ ***************************************/
+
+ llvm::LLVMContext &getContext()
+ {
+ return m_builder.getContext();
+ }
+
+ llvm::Module *getModule()
+ {
+ return m_builder.GetInsertBlock()->getModule();
+ }
+
+ llvm::BasicBlock *GetInsertBlock()
+ {
+ return m_builder.GetInsertBlock();
+ }
+
+ llvm::Type *getVoidTy()
+ {
+ return m_builder.getVoidTy();
+ }
+
+ llvm::Type *getVoidPtrTy()
+ {
+ return this->getVoidTy()->getPointerTo();
+ }
+
+ llvm::Type *getVoidPtrPtrTy()
+ {
+ return this->getVoidPtrTy()->getPointerTo();
+ }
+
+ llvm::Type *getFixedSizeType(uint size)
+ {
+ return llvm::ArrayType::get(m_builder.getInt8Ty(), size);
+ }
+
+
+ /* Value Builders
+ **************************************/
+
+ llvm::Value *getVoidPtr(void *ptr)
+ {
+ return this->getPtr(ptr, this->getVoidPtrTy());
+ }
+
+ llvm::Value *getPtr(void *ptr, llvm::Type *ptr_type)
+ {
+ llvm::Value *ptr_value = m_builder.getInt64((size_t)ptr);
+ return m_builder.CreateIntToPtr(ptr_value, ptr_type);
+ }
+
+ llvm::Value *getInt64(int64_t value)
+ {
+ return m_builder.getInt64(value);
+ }
+
+
+ /* Misc
+ **************************************/
+
+ LLVMTypes types_of_values(const LLVMValues &values);
+
+
+ /* Instruction Builders
+ **************************************/
+
+ void CreateRet(llvm::Value *value)
+ {
+ m_builder.CreateRet(value);
+ }
+
+ void CreateRetVoid()
+ {
+ m_builder.CreateRetVoid();
+ }
+
+ llvm::Value *CreateCastIntTo8(llvm::Value *value, bool is_signed)
+ {
+ return m_builder.CreateIntCast(value, m_builder.getInt8Ty(), is_signed);
+ }
+
+ llvm::Value *CreateCastIntTo1(llvm::Value *value)
+ {
+ return m_builder.CreateIntCast(value, m_builder.getInt1Ty(), false);
+ }
+
+ llvm::Value *CreateFAdd(llvm::Value *a, llvm::Value *b)
+ {
+ return m_builder.CreateFAdd(a, b);
+ }
+
+ llvm::Value *CreateAllocaBytes_VoidPtr(uint amount)
+ {
+ llvm::Type *size_type = this->getFixedSizeType(amount);
+ llvm::Value *addr = m_builder.CreateAlloca(size_type);
+ return this->CastToVoidPtr(addr);
+ }
+
+ llvm::Value *CreateAllocaBytes_BytePtr(uint amount)
+ {
+ llvm::Type *size_type = this->getFixedSizeType(amount);
+ llvm::Value *addr = m_builder.CreateAlloca(size_type);
+ return this->CastToBytePtr(addr);
+ }
+
+ llvm::Value *CastToPointerOf(llvm::Value *addr, llvm::Type *base_type)
+ {
+ return m_builder.CreatePointerCast(addr, base_type->getPointerTo());
+ }
+
+ llvm::Value *CastToVoidPtr(llvm::Value *addr)
+ {
+ return m_builder.CreatePointerCast(addr, this->getVoidPtrTy());
+ }
+
+ llvm::Value *CastToBytePtr(llvm::Value *addr)
+ {
+ return m_builder.CreatePointerCast(addr, m_builder.getInt8PtrTy());
+ }
+
+ llvm::Value *CreateLoad(llvm::Value *addr)
+ {
+ return m_builder.CreateLoad(addr);
+ }
+
+ void CreateStore(llvm::Value *value, llvm::Value *addr)
+ {
+ m_builder.CreateStore(value, addr, false);
+ }
+
+ llvm::Value *CreateExtractValue(llvm::Value *aggregate, uint index)
+ {
+ return m_builder.CreateExtractValue(aggregate, index);
+ }
+
+ llvm::Value *CreateInsertValue(llvm::Value *aggregate, llvm::Value *value, uint index)
+ {
+ return m_builder.CreateInsertValue(aggregate, value, index);
+ }
+
+ llvm::Value *CreateCallPointer(
+ void *func_ptr,
+ llvm::FunctionType *ftype,
+ const LLVMValues &args)
+ {
+ auto address_int = m_builder.getInt64((size_t)func_ptr);
+ auto address = m_builder.CreateIntToPtr(address_int, ftype->getPointerTo());
+ return m_builder.CreateCall(address, to_array_ref(args));
+ }
+
+ llvm::Value *CreateCall(
+ llvm::Function *function,
+ const LLVMValues &args)
+ {
+ return m_builder.CreateCall(function, to_array_ref(args));
+ }
+
+ llvm::Value *CreateConstGEP1_32(llvm::Value *addr, uint index)
+ {
+ return m_builder.CreateConstGEP1_32(addr, index);
+ }
+
+ llvm::Value *CreateGEP(llvm::Value *addr, llvm::Value *index)
+ {
+ return m_builder.CreateGEP(addr, index);
+ }
+ };
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/compiled_body.cpp b/source/blender/functions/backends/llvm/compiled_body.cpp
index 614b5f5a51a..1345a4a91e8 100644
--- a/source/blender/functions/backends/llvm/compiled_body.cpp
+++ b/source/blender/functions/backends/llvm/compiled_body.cpp
@@ -1,5 +1,4 @@
#include "FN_llvm.hpp"
-#include "ir_utils.hpp"
#include <llvm/IR/Verifier.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
@@ -9,21 +8,17 @@ namespace FN {
BLI_COMPOSITION_IMPLEMENTATION(LLVMCompiledBody);
void LLVMCompiledBody::build_ir(
- llvm::IRBuilder<> &builder,
- const LLVMValues &inputs,
- LLVMValues &r_outputs) const
+ CodeBuilder &builder,
+ CodeInterface &interface,
+ const BuildIRSettings &UNUSED(settings)) const
{
auto *ftype = function_type_from_signature(
this->owner()->signature(), builder.getContext());
- llvm::Value *output_struct = call_pointer(
- builder,
- this->function_ptr(),
- ftype,
- inputs);
+ llvm::Value *output_struct = builder.CreateCallPointer(this->function_ptr(), ftype, interface.inputs());
for (uint i = 0; i < ftype->getReturnType()->getStructNumElements(); i++) {
llvm::Value *out = builder.CreateExtractValue(output_struct, i);
- r_outputs.append(out);
+ interface.set_output(i, out);
}
}
@@ -55,14 +50,15 @@ namespace FN {
}
llvm::BasicBlock *bb = llvm::BasicBlock::Create(context, "entry", function);
- llvm::IRBuilder<> builder(bb);
+ CodeBuilder builder(bb);
LLVMBuildIRBody *gen_body = fn->body<LLVMBuildIRBody>();
BLI_assert(gen_body);
- LLVMValues output_values;
- gen_body->build_ir(builder, input_values, output_values);
- BLI_assert(output_values.size() == output_types.size());
+ LLVMValues output_values(output_types.size());
+ BuildIRSettings settings;
+ CodeInterface interface(input_values, output_values);
+ gen_body->build_ir(builder, interface, settings);
llvm::Value *return_value = llvm::UndefValue::get(output_type);
for (uint i = 0; i < output_values.size(); i++) {
diff --git a/source/blender/functions/backends/llvm/compiled_body.hpp b/source/blender/functions/backends/llvm/compiled_body.hpp
index 0a531bd5e07..4c2136a81e4 100644
--
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list