1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[lli] Add --jit-linker command line argument

The argument value determines the dynamic linker to use (`default`, `rtdyld` or `jitlink`). The JITLink implementation only supports in-process JITing for now. This is the first commit for the reviewed patch.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D97339
This commit is contained in:
Stefan Gränitz 2021-03-02 10:41:52 +01:00
parent 0d25232cae
commit 0621b0f242

View File

@ -22,6 +22,7 @@
#include "llvm/Config/llvm-config.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/Interpreter.h"
#include "llvm/ExecutionEngine/JITSymbol.h"
#include "llvm/ExecutionEngine/JITEventListener.h"
#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/ExecutionEngine/ObjectCache.h"
@ -32,6 +33,9 @@
#include "llvm/ExecutionEngine/Orc/MachOPlatform.h"
#include "llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h"
#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
#include "llvm/ExecutionEngine/Orc/SymbolStringPool.h"
#include "llvm/ExecutionEngine/Orc/TPCEHFrameRegistrar.h"
#include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"
#include "llvm/ExecutionEngine/Orc/TargetProcess/TargetExecutionUtils.h"
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
#include "llvm/IR/IRBuilder.h"
@ -78,6 +82,7 @@ static codegen::RegisterCodeGenFlags CGF;
namespace {
enum class JITKind { MCJIT, OrcLazy };
enum class JITLinkerKind { Default, RuntimeDyld, JITLink };
cl::opt<std::string>
InputFile(cl::desc("<input bitcode>"), cl::Positional, cl::init("-"));
@ -96,6 +101,16 @@ namespace {
clEnumValN(JITKind::OrcLazy, "orc-lazy",
"Orc-based lazy JIT.")));
cl::opt<JITLinkerKind>
JITLinker("jit-linker", cl::desc("Choose the dynamic linker/loader."),
cl::init(JITLinkerKind::Default),
cl::values(clEnumValN(JITLinkerKind::Default, "default",
"Default for platform and JIT-kind"),
clEnumValN(JITLinkerKind::RuntimeDyld, "rtdyld",
"RuntimeDyld"),
clEnumValN(JITLinkerKind::JITLink, "jitlink",
"Orc-specific linker")));
cl::opt<unsigned>
LazyJITCompileThreads("compile-threads",
cl::desc("Choose the number of compile threads "
@ -260,6 +275,11 @@ namespace {
ExitOnError ExitOnErr;
}
LLVM_ATTRIBUTE_USED void linkComponents() {
errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper
<< (void *)&llvm_orc_deregisterEHFrameSectionWrapper;
}
//===----------------------------------------------------------------------===//
// Object cache
//
@ -893,6 +913,20 @@ int runOrcLazyJIT(const char *ProgName) {
}
}
std::unique_ptr<orc::TargetProcessControl> TPC = nullptr;
if (JITLinker == JITLinkerKind::JITLink) {
TPC = ExitOnErr(orc::SelfTargetProcessControl::Create(
std::make_shared<orc::SymbolStringPool>()));
Builder.setObjectLinkingLayerCreator([&TPC](orc::ExecutionSession &ES,
const Triple &) {
auto L = std::make_unique<orc::ObjectLinkingLayer>(ES, TPC->getMemMgr());
L->addPlugin(std::make_unique<orc::EHFrameRegistrationPlugin>(
ES, ExitOnErr(orc::TPCEHFrameRegistrar::Create(*TPC))));
return L;
});
}
auto J = ExitOnErr(Builder.create());
auto *ObjLayer = &J->getObjLinkingLayer();
@ -997,13 +1031,19 @@ int runOrcLazyJIT(const char *ProgName) {
AltEntryThreads.push_back(std::thread([EntryPoint]() { EntryPoint(); }));
}
// Run main.
auto MainSym = ExitOnErr(J->lookup("main"));
// Resolve and run the main function.
JITEvaluatedSymbol MainSym = ExitOnErr(J->lookup("main"));
int Result;
typedef int (*MainFnPtr)(int, char *[]);
auto Result = orc::runAsMain(
jitTargetAddressToFunction<MainFnPtr>(MainSym.getAddress()), InputArgv,
StringRef(InputFile));
if (TPC) {
// TargetProcessControl-based execution with JITLink.
Result = ExitOnErr(TPC->runAsMain(MainSym.getAddress(), InputArgv));
} else {
// Manual in-process execution with RuntimeDyld.
using MainFnTy = int(int, char *[]);
auto MainFn = jitTargetAddressToFunction<MainFnTy *>(MainSym.getAddress());
Result = orc::runAsMain(MainFn, InputArgv, StringRef(InputFile));
}
// Wait for -entry-point threads.
for (auto &AltEntryThread : AltEntryThreads)