[Bf-blender-cvs] [cc32f73a295] temp-llvm-testing: add object cache

Jacques Lucke noreply at git.blender.org
Wed Dec 29 21:45:49 CET 2021


Commit: cc32f73a2959fc5be23f294c3045884d807eeb82
Author: Jacques Lucke
Date:   Wed Dec 29 20:14:47 2021 +0100
Branches: temp-llvm-testing
https://developer.blender.org/rBcc32f73a2959fc5be23f294c3045884d807eeb82

add object cache

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

M	source/blender/functions/intern/llvm.cc

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

diff --git a/source/blender/functions/intern/llvm.cc b/source/blender/functions/intern/llvm.cc
index bdbb982de6b..de255962dda 100644
--- a/source/blender/functions/intern/llvm.cc
+++ b/source/blender/functions/intern/llvm.cc
@@ -14,16 +14,18 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#include <fstream>
 #include <iostream>
 
 #include <llvm/ExecutionEngine/ExecutionEngine.h>
+#include <llvm/ExecutionEngine/ObjectCache.h>
 #include <llvm/IR/IRBuilder.h>
 #include <llvm/IR/LLVMContext.h>
 #include <llvm/IR/Type.h>
 #include <llvm/IR/Verifier.h>
 #include <llvm/Support/CommandLine.h>
-#include <llvm/Support/TargetSelect.h>
 #include <llvm/Support/TargetRegistry.h>
+#include <llvm/Support/TargetSelect.h>
 
 #include "FN_llvm.hh"
 
@@ -31,12 +33,38 @@
 
 namespace blender::fn {
 
+  const std::string object_file_path = "C:\\Users\\jacques\\Documents\\my_object.o";
+
+class MyObjectCache : public llvm::ObjectCache {
+  void notifyObjectCompiled(const llvm::Module *module, llvm::MemoryBufferRef obj) override
+  {
+    std::cout << "Compiled Module: " << module->getName().str() << "   -    "
+              << module->getModuleIdentifier() << "\n";
+    std::cout << "Size: " << obj.getBufferSize() << "\n";
+
+    std::ofstream f;    
+    f.open(object_file_path, std::ofstream::out | std::ofstream::binary);
+    f.write(obj.getBufferStart(), obj.getBufferSize());
+    f.close();
+  }
+
+  std::unique_ptr<llvm::MemoryBuffer> getObject(const llvm::Module *module) override
+  {
+    //return {};
+    std::cout << "Request Cache: " << module->getName().str() << "   -    "
+              << module->getModuleIdentifier() << "\n";
+    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer_err = llvm::MemoryBuffer::getFile(object_file_path);
+    std::unique_ptr<llvm::MemoryBuffer> buffer = std::move(*buffer_err);
+    return buffer;
+  }
+};
+
 void playground()
 {
   static bool initialized = []() {
     /* Set assembly syntax flavour. */
     char const *args[] = {"some-random-name-for-the-parser", "--x86-asm-syntax=intel"};
-    bool parse_result = llvm::cl::ParseCommandLineOptions(std::size(args), args);
+    llvm::cl::ParseCommandLineOptions(std::size(args), args);
 
     llvm::InitializeNativeTarget();
     llvm::InitializeNativeTargetAsmPrinter();
@@ -60,8 +88,11 @@ void playground()
 
   BLI_assert(!llvm::verifyModule(*module, &llvm::outs()));
 
+  MyObjectCache object_cache;
+
   llvm::Module *module_ptr = &*module;
   std::unique_ptr<llvm::ExecutionEngine> ee{llvm::EngineBuilder(std::move(module)).create()};
+  ee->setObjectCache(&object_cache);
   ee->finalizeObject();
 
   const uint64_t function_ptr = ee->getFunctionAddress(function->getName().str());
@@ -78,6 +109,7 @@ void playground()
                               nullptr);
   */
   // function->dump();
+  function->print(llvm::outs());
 }
 
 }  // namespace blender::fn



More information about the Bf-blender-cvs mailing list