[Bf-blender-cvs] [e0c2784327c] functions: support for calling printf from llvm ir
Jacques Lucke
noreply at git.blender.org
Mon May 13 10:16:38 CEST 2019
Commit: e0c2784327c9367cbaeb25ff8159641e8498389e
Author: Jacques Lucke
Date: Thu May 9 12:23:12 2019 +0200
Branches: functions
https://developer.blender.org/rBe0c2784327c9367cbaeb25ff8159641e8498389e
support for calling printf from llvm ir
===================================================================
M source/blender/functions/backends/llvm/builder.cpp
M source/blender/functions/backends/llvm/builder.hpp
===================================================================
diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
index 2b8d91265cb..ca73fd2365c 100644
--- a/source/blender/functions/backends/llvm/builder.cpp
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -1,5 +1,6 @@
#include "builder.hpp"
#include "BLI_string.h"
+#include "llvm/IR/TypeBuilder.h"
namespace FN {
@@ -51,6 +52,7 @@ llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
LLVMValuesRef args,
const char *function_name)
{
+ BLI_assert(!ftype->isVarArg());
char name[64];
BLI_snprintf(name, sizeof(name), "%s (%p)", function_name, func_ptr);
@@ -90,21 +92,29 @@ llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
return this->CreateCallPointer(func_ptr, LLVMValuesRef(args), return_type, function_name);
}
-template<typename T> void simple_print(T value)
-{
- std::cout << value;
-}
+/* Printing
+ **********************************/
-void CodeBuilder::CreatePrint(const char *str)
+void CodeBuilder::CreatePrintf(const char *format, const LLVMValues &values)
{
- this->CreateCallPointer(
- (void *)simple_print<const char *>, {this->getVoidPtr((void *)str)}, this->getVoidTy());
-}
+ llvm::FunctionType *printf_ftype = llvm::TypeBuilder<int(char *, ...), false>::get(
+ this->getContext());
-void CodeBuilder::CreatePrintFloat(llvm::Value *value)
-{
- BLI_assert(value->getType()->isFloatTy());
- this->CreateCallPointer((void *)simple_print<float>, {value}, this->getVoidTy());
+ llvm::Function *printf_func = llvm::cast<llvm::Function>(
+ this->getModule()->getOrInsertFunction("printf", printf_ftype));
+ printf_func->addParamAttr(0, llvm::Attribute::NoAlias);
+
+ LLVMValues args;
+ args.append(this->getInt8Ptr(format));
+ for (llvm::Value *arg : values) {
+ llvm::Value *passed_arg = arg;
+ if (arg->getType()->isFloatTy()) {
+ passed_arg = this->CastFloatToDouble(arg);
+ }
+ args.append(passed_arg);
+ }
+ args.extend(values);
+ m_builder.CreateCall(printf_func, to_llvm_array_ref(args));
}
/* For Loop
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index 6f96531bf80..54921e52742 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -65,6 +65,11 @@ class CodeBuilder {
return m_builder.getFloatTy();
}
+ llvm::Type *getDoubleTy()
+ {
+ return m_builder.getDoubleTy();
+ }
+
llvm::Type *getVoidTy()
{
return m_builder.getVoidTy();
@@ -80,6 +85,16 @@ class CodeBuilder {
return this->getVoidPtrTy()->getPointerTo();
}
+ llvm::Type *getInt8Ty()
+ {
+ return m_builder.getInt8Ty();
+ }
+
+ llvm::Type *getInt8PtrTy()
+ {
+ return m_builder.getInt8PtrTy();
+ }
+
llvm::Type *getInt32Ty()
{
return m_builder.getInt32Ty();
@@ -129,11 +144,21 @@ class CodeBuilder {
return m_builder.getInt32(value);
}
+ llvm::Value *getInt8Ptr(const char *ptr)
+ {
+ return this->getPtr((void *)ptr, this->getInt8PtrTy());
+ }
+
llvm::Constant *getFloat(float value)
{
return llvm::ConstantFP::get(this->getFloatTy(), value);
}
+ llvm::Constant *getDouble(double value)
+ {
+ return llvm::ConstantFP::get(this->getDoubleTy(), value);
+ }
+
/* Create new blocks
**************************************/
@@ -264,6 +289,11 @@ class CodeBuilder {
return m_builder.CreatePointerCast(addr, m_builder.getInt8PtrTy());
}
+ llvm::Value *CastFloatToDouble(llvm::Value *value)
+ {
+ return m_builder.CreateFPCast(value, this->getDoubleTy());
+ }
+
llvm::Value *CreateLoad(llvm::Value *addr)
{
return m_builder.CreateLoad(addr);
@@ -390,8 +420,7 @@ class CodeBuilder {
/* Print
**************************************/
- void CreatePrint(const char *str);
- void CreatePrintFloat(llvm::Value *value);
+ void CreatePrintf(const char *format, const LLVMValues &values);
/* Control Flow Construction
**************************************/
More information about the Bf-blender-cvs
mailing list