[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