aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-jitlink/llvm-jitlink.cpp')
-rw-r--r--llvm/tools/llvm-jitlink/llvm-jitlink.cpp38
1 files changed, 23 insertions, 15 deletions
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
index d5dc661..8e651d9 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp
@@ -483,8 +483,8 @@ static std::unique_ptr<JITLinkMemoryManager> createMemoryManager() {
}
LLVMJITLinkObjectLinkingLayer::LLVMJITLinkObjectLinkingLayer(
- Session &S, std::unique_ptr<JITLinkMemoryManager> MemMgr)
- : ObjectLinkingLayer(S.ES, std::move(MemMgr)), S(S) {}
+ Session &S, JITLinkMemoryManager &MemMgr)
+ : ObjectLinkingLayer(S.ES, MemMgr), S(S) {}
Error LLVMJITLinkObjectLinkingLayer::add(JITDylib &JD,
std::unique_ptr<MemoryBuffer> O,
@@ -580,7 +580,12 @@ public:
Expected<std::unique_ptr<Session>> Session::Create(Triple TT) {
Error Err = Error::success();
- std::unique_ptr<Session> S(new Session(std::move(TT), Err));
+
+ auto PageSize = sys::Process::getPageSize();
+ if (!PageSize)
+ return PageSize.takeError();
+
+ std::unique_ptr<Session> S(new Session(std::move(TT), *PageSize, Err));
if (Err)
return std::move(Err);
return std::move(S);
@@ -588,8 +593,10 @@ Expected<std::unique_ptr<Session>> Session::Create(Triple TT) {
// FIXME: Move to createJITDylib if/when we start using Platform support in
// llvm-jitlink.
-Session::Session(Triple TT, Error &Err)
- : ObjLayer(*this, createMemoryManager()), TT(std::move(TT)) {
+Session::Session(Triple TT, uint64_t PageSize, Error &Err)
+ : TPC(std::make_unique<SelfTargetProcessControl>(std::move(TT), PageSize,
+ createMemoryManager())),
+ ObjLayer(*this, TPC->getMemMgr()) {
/// Local ObjectLinkingLayer::Plugin class to forward modifyPassConfig to the
/// Session.
@@ -658,15 +665,14 @@ void Session::dumpSessionInfo(raw_ostream &OS) {
OS << "Registered addresses:\n" << SymbolInfos << FileInfos;
}
-void Session::modifyPassConfig(const Triple &FTT,
+void Session::modifyPassConfig(const Triple &TT,
PassConfiguration &PassConfig) {
if (!CheckFiles.empty())
PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) {
-
- if (TT.getObjectFormat() == Triple::ELF)
+ if (TPC->getTargetTriple().getObjectFormat() == Triple::ELF)
return registerELFGraphInfo(*this, G);
- if (TT.getObjectFormat() == Triple::MachO)
+ if (TPC->getTargetTriple().getObjectFormat() == Triple::MachO)
return registerMachOGraphInfo(*this, G);
return make_error<StringError>("Unsupported object format for GOT/stub "
@@ -780,7 +786,7 @@ Triple getFirstFileTriple() {
Error sanitizeArguments(const Session &S) {
if (EntryPointName.empty()) {
- if (S.TT.getObjectFormat() == Triple::MachO)
+ if (S.TPC->getTargetTriple().getObjectFormat() == Triple::MachO)
EntryPointName = "_main";
else
EntryPointName = "main";
@@ -805,7 +811,8 @@ Error loadProcessSymbols(Session &S) {
if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr, &ErrMsg))
return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
- char GlobalPrefix = S.TT.getObjectFormat() == Triple::MachO ? '_' : '\0';
+ char GlobalPrefix =
+ S.TPC->getTargetTriple().getObjectFormat() == Triple::MachO ? '_' : '\0';
auto InternedEntryPointName = S.ES.intern(EntryPointName);
auto FilterMainEntryPoint = [InternedEntryPointName](SymbolStringPtr Name) {
return Name != InternedEntryPointName;
@@ -899,7 +906,7 @@ Error loadObjects(Session &S) {
if (Magic == file_magic::archive ||
Magic == file_magic::macho_universal_binary)
JD.addGenerator(ExitOnErr(StaticLibraryDefinitionGenerator::Load(
- S.ObjLayer, InputFile.c_str(), S.TT)));
+ S.ObjLayer, InputFile.c_str(), S.TPC->getTargetTriple())));
else
ExitOnErr(S.ObjLayer.add(JD, std::move(ObjBuffer)));
}
@@ -947,9 +954,9 @@ Error loadObjects(Session &S) {
Error runChecks(Session &S) {
- auto TripleName = S.TT.str();
+ auto TripleName = S.TPC->getTargetTriple().str();
std::string ErrorStr;
- const Target *TheTarget = TargetRegistry::lookupTarget("", S.TT, ErrorStr);
+ const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, ErrorStr);
if (!TheTarget)
ExitOnErr(make_error<StringError>("Error accessing target '" + TripleName +
"': " + ErrorStr,
@@ -1013,7 +1020,8 @@ Error runChecks(Session &S) {
RuntimeDyldChecker Checker(
IsSymbolValid, GetSymbolInfo, GetSectionInfo, GetStubInfo, GetGOTInfo,
- S.TT.isLittleEndian() ? support::little : support::big,
+ S.TPC->getTargetTriple().isLittleEndian() ? support::little
+ : support::big,
Disassembler.get(), InstPrinter.get(), dbgs());
std::string CheckLineStart = "# " + CheckName + ":";