|
46 | 46 | #include "clang/Sema/Lookup.h" |
47 | 47 | #include "clang/Serialization/ObjectFilePCHContainerReader.h" |
48 | 48 | #include "llvm/ExecutionEngine/JITSymbol.h" |
| 49 | +#include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" |
49 | 50 | #include "llvm/ExecutionEngine/Orc/LLJIT.h" |
50 | 51 | #include "llvm/IR/Module.h" |
51 | 52 | #include "llvm/Support/Errc.h" |
@@ -455,10 +456,11 @@ const char *const Runtimes = R"( |
455 | 456 | )"; |
456 | 457 |
|
457 | 458 | llvm::Expected<std::unique_ptr<Interpreter>> |
458 | | -Interpreter::create(std::unique_ptr<CompilerInstance> CI) { |
| 459 | +Interpreter::create(std::unique_ptr<CompilerInstance> CI, |
| 460 | + std::unique_ptr<llvm::orc::LLJITBuilder> JB) { |
459 | 461 | llvm::Error Err = llvm::Error::success(); |
460 | | - auto Interp = |
461 | | - std::unique_ptr<Interpreter>(new Interpreter(std::move(CI), Err)); |
| 462 | + auto Interp = std::unique_ptr<Interpreter>( |
| 463 | + new Interpreter(std::move(CI), Err, JB ? std::move(JB) : nullptr)); |
462 | 464 | if (Err) |
463 | 465 | return std::move(Err); |
464 | 466 |
|
@@ -617,6 +619,25 @@ createJITTargetMachineBuilder(const std::string &TT) { |
617 | 619 | return llvm::orc::JITTargetMachineBuilder(llvm::Triple(TT)); |
618 | 620 | } |
619 | 621 |
|
| 622 | +llvm::Expected<std::unique_ptr<llvm::orc::LLJITBuilder>> |
| 623 | +Interpreter::createLLJITBuilder( |
| 624 | + std::unique_ptr<llvm::orc::ExecutorProcessControl> EPC, |
| 625 | + llvm::StringRef OrcRuntimePath) { |
| 626 | + const std::string &TT = EPC->getTargetTriple().getTriple(); |
| 627 | + auto JTMB = createJITTargetMachineBuilder(TT); |
| 628 | + if (!JTMB) |
| 629 | + return JTMB.takeError(); |
| 630 | + auto JB = IncrementalExecutor::createDefaultJITBuilder(std::move(*JTMB)); |
| 631 | + if (!JB) |
| 632 | + return JB.takeError(); |
| 633 | + |
| 634 | + (*JB)->setExecutorProcessControl(std::move(EPC)); |
| 635 | + (*JB)->setPlatformSetUp( |
| 636 | + llvm::orc::ExecutorNativePlatform(OrcRuntimePath.str())); |
| 637 | + |
| 638 | + return std::move(*JB); |
| 639 | +} |
| 640 | + |
620 | 641 | llvm::Error Interpreter::CreateExecutor() { |
621 | 642 | if (IncrExecutor) |
622 | 643 | return llvm::make_error<llvm::StringError>("Operation failed. " |
@@ -756,11 +777,13 @@ llvm::Error Interpreter::LoadDynamicLibrary(const char *name) { |
756 | 777 | if (!EE) |
757 | 778 | return EE.takeError(); |
758 | 779 |
|
759 | | - auto &DL = EE->getDataLayout(); |
760 | | - |
761 | | - if (auto DLSG = llvm::orc::DynamicLibrarySearchGenerator::Load( |
762 | | - name, DL.getGlobalPrefix())) |
763 | | - EE->getMainJITDylib().addGenerator(std::move(*DLSG)); |
| 780 | + if (llvm::Expected< |
| 781 | + std::unique_ptr<llvm::orc::EPCDynamicLibrarySearchGenerator>> |
| 782 | + DLSG = llvm::orc::EPCDynamicLibrarySearchGenerator::Load( |
| 783 | + EE->getExecutionSession(), name)) |
| 784 | + // FIXME: Eventually we should put each library in its own JITDylib and |
| 785 | + // turn off process symbols by default. |
| 786 | + EE->getProcessSymbolsJITDylib()->addGenerator(std::move(*DLSG)); |
764 | 787 | else |
765 | 788 | return DLSG.takeError(); |
766 | 789 | #endif |
|
0 commit comments