diff options
author | Stefan Gränitz <stefan.graenitz@gmail.com> | 2024-03-25 09:44:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-25 09:44:25 +0100 |
commit | 0cf4788d9d0df60980cb48d28aafe7a86aa15a14 (patch) | |
tree | 6131dbc30582fb745ba59e31cb434b7ffbe480b4 /clang/lib/Interpreter/Interpreter.cpp | |
parent | aa962d67ee896f416e285a9298e45fc08ff95eef (diff) | |
download | llvm-0cf4788d9d0df60980cb48d28aafe7a86aa15a14.zip llvm-0cf4788d9d0df60980cb48d28aafe7a86aa15a14.tar.gz llvm-0cf4788d9d0df60980cb48d28aafe7a86aa15a14.tar.bz2 |
[clang-repl] Factor out CreateJITBuilder() and allow specialization in derived classes (#84461)
The LLJITBuilder interface provides a very convenient way to configure
the ORCv2 JIT engine. IncrementalExecutor already used it internally to
construct the JIT, but didn't provide external access. This patch lifts
control of the creation process to the Interpreter and allows injection
of a custom instance through the extended interface. The Interpreter's
default behavior remains unchanged and the IncrementalExecutor remains
an implementation detail.
Diffstat (limited to 'clang/lib/Interpreter/Interpreter.cpp')
-rw-r--r-- | clang/lib/Interpreter/Interpreter.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 7fa52f2..cf31456 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -372,15 +372,35 @@ Interpreter::Parse(llvm::StringRef Code) { return IncrParser->Parse(Code); } +static llvm::Expected<llvm::orc::JITTargetMachineBuilder> +createJITTargetMachineBuilder(const std::string &TT) { + if (TT == llvm::sys::getProcessTriple()) + // This fails immediately if the target backend is not registered + return llvm::orc::JITTargetMachineBuilder::detectHost(); + + // If the target backend is not registered, LLJITBuilder::create() will fail + return llvm::orc::JITTargetMachineBuilder(llvm::Triple(TT)); +} + +llvm::Expected<std::unique_ptr<llvm::orc::LLJITBuilder>> +Interpreter::CreateJITBuilder(CompilerInstance &CI) { + auto JTMB = createJITTargetMachineBuilder(CI.getTargetOpts().Triple); + if (!JTMB) + return JTMB.takeError(); + return IncrementalExecutor::createDefaultJITBuilder(std::move(*JTMB)); +} + llvm::Error Interpreter::CreateExecutor() { - const clang::TargetInfo &TI = - getCompilerInstance()->getASTContext().getTargetInfo(); if (IncrExecutor) return llvm::make_error<llvm::StringError>("Operation failed. " "Execution engine exists", std::error_code()); + llvm::Expected<std::unique_ptr<llvm::orc::LLJITBuilder>> JB = + CreateJITBuilder(*getCompilerInstance()); + if (!JB) + return JB.takeError(); llvm::Error Err = llvm::Error::success(); - auto Executor = std::make_unique<IncrementalExecutor>(*TSCtx, Err, TI); + auto Executor = std::make_unique<IncrementalExecutor>(*TSCtx, **JB, Err); if (!Err) IncrExecutor = std::move(Executor); |