@@ -217,6 +217,41 @@ Status UseJITLinkIfEnabled(llvm::orc::LLJITBuilder& jit_builder) {
217217}
218218#endif
219219
220+ Result<std::unique_ptr<llvm::orc::LLJIT>> BuildJIT (
221+ llvm::orc::JITTargetMachineBuilder jtmb,
222+ std::shared_ptr<llvm::TargetMachine> target_machine,
223+ std::optional<std::reference_wrapper<GandivaObjectCache>> object_cache) {
224+ auto data_layout = target_machine->createDataLayout ();
225+
226+ llvm::orc::LLJITBuilder jit_builder;
227+
228+ #ifdef JIT_LINK_SUPPORTED
229+ ARROW_RETURN_NOT_OK (UseJITLinkIfEnabled (jit_builder));
230+ #endif
231+
232+ jit_builder.setJITTargetMachineBuilder (std::move (jtmb));
233+ jit_builder.setDataLayout (std::make_optional (data_layout));
234+
235+ if (object_cache.has_value ()) {
236+ jit_builder.setCompileFunctionCreator (
237+ [tm = std::move (target_machine),
238+ &object_cache](llvm::orc::JITTargetMachineBuilder JTMB)
239+ -> llvm::Expected<std::unique_ptr<llvm::orc::IRCompileLayer::IRCompiler>> {
240+ // after compilation, the object code will be stored into the given object
241+ // cache
242+ return std::make_unique<llvm::orc::SimpleCompiler>(*tm,
243+ &object_cache.value ().get ());
244+ });
245+ }
246+
247+ auto maybe_jit = jit_builder.create ();
248+ ARROW_ASSIGN_OR_RAISE (auto jit,
249+ AsArrowResult (maybe_jit, " Could not create LLJIT instance: " ));
250+
251+ AddProcessSymbol (*jit);
252+ return jit;
253+ }
254+
220255arrow::Status VerifyAndLinkModule (
221256 llvm::Module& dest_module,
222257 llvm::Expected<std::unique_ptr<llvm::Module>> src_module_or_error) {
@@ -343,35 +378,10 @@ Result<std::unique_ptr<Engine>> Engine::Make(
343378
344379 auto shared_target_machine =
345380 std::shared_ptr<llvm::TargetMachine>(std::move (target_machine));
346- auto data_layout = shared_target_machine->createDataLayout ();
347381
348382 // Build the LLJIT instance
349- llvm::orc::LLJITBuilder jit_builder;
350-
351- #ifdef JIT_LINK_SUPPORTED
352- ARROW_RETURN_NOT_OK (UseJITLinkIfEnabled (jit_builder));
353- #endif
354-
355- jit_builder.setJITTargetMachineBuilder (std::move (jtmb));
356- jit_builder.setDataLayout (std::make_optional (data_layout));
357-
358- if (object_cache.has_value ()) {
359- jit_builder.setCompileFunctionCreator (
360- [tm = shared_target_machine,
361- &object_cache](llvm::orc::JITTargetMachineBuilder JTMB)
362- -> llvm::Expected<std::unique_ptr<llvm::orc::IRCompileLayer::IRCompiler>> {
363- // after compilation, the object code will be stored into the given object
364- // cache
365- return std::make_unique<llvm::orc::SimpleCompiler>(*tm,
366- &object_cache.value ().get ());
367- });
368- }
369-
370- auto maybe_jit = jit_builder.create ();
371383 ARROW_ASSIGN_OR_RAISE (auto jit,
372- AsArrowResult (maybe_jit, " Could not create LLJIT instance: " ));
373-
374- AddProcessSymbol (*jit);
384+ BuildJIT (std::move (jtmb), shared_target_machine, object_cache));
375385
376386 std::unique_ptr<Engine> engine{
377387 new Engine (conf, std::move (jit), std::move (shared_target_machine), cached)};
0 commit comments