Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/functions/intern/llvm.cc')
-rw-r--r--source/blender/functions/intern/llvm.cc36
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