2525#include < llvm/TargetParser/Triple.h>
2626
2727#include " tpde-llvm/LLVMCompiler.hpp"
28+ #include " tpde-llvm/OrcCompiler.hpp"
2829
2930#include < dlfcn.h>
3031#include < iostream>
@@ -86,10 +87,10 @@ int main(int argc, char *argv[]) {
8687 }
8788#endif
8889
89- llvm::LLVMContext context ;
90+ auto context = std::make_unique< llvm::LLVMContext>() ;
9091 llvm::SMDiagnostic diag{};
9192
92- auto mod = llvm::parseIRFile (ir_path.Get (), diag, context);
93+ auto mod = llvm::parseIRFile (ir_path.Get (), diag, * context);
9394 if (!mod) {
9495 diag.print (argv[0 ], llvm::errs ());
9596 return 1 ;
@@ -103,13 +104,13 @@ int main(int argc, char *argv[]) {
103104
104105 std::string triple_str = llvm::sys::getProcessTriple ();
105106 llvm::Triple triple (triple_str);
106- auto compiler = tpde_llvm::LLVMCompiler::create (triple);
107- if (!compiler) {
108- std::cerr << " Unknown architecture: " << triple_str << " \n " ;
109- return 1 ;
110- }
111107
112108 if (!orc) {
109+ auto compiler = tpde_llvm::LLVMCompiler::create (triple);
110+ if (!compiler) {
111+ std::cerr << " Unknown architecture: " << triple_str << " \n " ;
112+ return 1 ;
113+ }
113114 auto mapper = compiler->compile_and_map (*mod, [](std::string_view name) {
114115 return ::dlsym (RTLD_DEFAULT, std::string (name).c_str ());
115116 });
@@ -121,29 +122,23 @@ int main(int argc, char *argv[]) {
121122 return ((int (*)(int , char **))main_addr)(0 , nullptr );
122123 }
123124
124- std::vector<uint8_t > buf;
125- if (!compiler->compile_to_elf (*mod, buf)) {
126- std::cerr << " Failed to compile\n " ;
127- return 1 ;
128- }
129- llvm::StringRef buf_strref (reinterpret_cast <char *>(buf.data ()), buf.size ());
130- auto obj_membuf = llvm::MemoryBuffer::getMemBuffer (buf_strref, " " , false );
131- assert (obj_membuf->getBufferSize ());
132-
133125 size_t page_size = exit_on_err (llvm::sys::Process::getPageSize ());
134126 llvm::orc::ExecutionSession es (
135127 exit_on_err (llvm::orc::SelfExecutorProcessControl::Create ()));
136128 llvm::orc::MapperJITLinkMemoryManager memory_manager (
137129 page_size, std::make_unique<llvm::orc::InProcessMemoryMapper>(page_size));
138130 llvm::orc::ObjectLinkingLayer object_layer (es, memory_manager);
131+ llvm::orc::IRCompileLayer compile_layer (
132+ es, object_layer, std::make_unique<tpde_llvm::OrcCompiler>(triple));
139133 llvm::orc::JITDylib &dylib = exit_on_err (es.createJITDylib (" <main>" ));
140134
141135 // TODO: correct global prefix for MachO/COFF platforms
142136 dylib.addGenerator (exit_on_err (
143137 llvm::orc::DynamicLibrarySearchGenerator::GetForCurrentProcess (
144138 /* GlobalPrefix=*/ ' \0 ' )));
145139
146- exit_on_err (object_layer.add (dylib, std::move (obj_membuf)));
140+ llvm::orc::ThreadSafeModule tsm (std::move (mod), std::move (context));
141+ exit_on_err (compile_layer.add (dylib, std::move (tsm)));
147142
148143#if LLVM_VERSION_MAJOR >= 21
149144 object_layer.addPlugin (
0 commit comments