diff options
Diffstat (limited to 'source/blender/functions/intern/llvm.cc')
-rw-r--r-- | source/blender/functions/intern/llvm.cc | 36 |
1 files changed, 34 insertions, 2 deletions
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 |