xref: /llvm-project/llvm/tools/llvm-jitlink/llvm-jitlink.cpp (revision 6073dd923b82a526803d1f85f3531bc0a0721a88)
1 //===- llvm-jitlink.cpp -- Command line interface/tester for llvm-jitlink -===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This utility provides a simple command line interface to the llvm jitlink
10 // library, which makes relocatable object files executable in memory. Its
11 // primary function is as a testing utility for the jitlink library.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "llvm-jitlink.h"
16 #include "llvm/BinaryFormat/Magic.h"
17 #include "llvm/Config/llvm-config.h" // for LLVM_ON_UNIX, LLVM_ENABLE_THREADS
18 #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h"
19 #include "llvm/ExecutionEngine/Orc/COFFPlatform.h"
20 #include "llvm/ExecutionEngine/Orc/COFFVCRuntimeSupport.h"
21 #include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
22 #include "llvm/ExecutionEngine/Orc/Debugging/DebugInfoSupport.h"
23 #include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupportPlugin.h"
24 #include "llvm/ExecutionEngine/Orc/Debugging/PerfSupportPlugin.h"
25 #include "llvm/ExecutionEngine/Orc/Debugging/VTuneSupportPlugin.h"
26 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h"
27 #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h"
28 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
29 #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
30 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
31 #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
32 #include "llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h"
33 #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
34 #include "llvm/ExecutionEngine/Orc/LoadLinkableFile.h"
35 #include "llvm/ExecutionEngine/Orc/MachO.h"
36 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h"
37 #include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h"
38 #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
39 #include "llvm/ExecutionEngine/Orc/SectCreate.h"
40 #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
41 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"
42 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.h"
43 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderVTune.h"
44 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"
45 #include "llvm/MC/MCAsmInfo.h"
46 #include "llvm/MC/MCContext.h"
47 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
48 #include "llvm/MC/MCInstPrinter.h"
49 #include "llvm/MC/MCInstrAnalysis.h"
50 #include "llvm/MC/MCInstrInfo.h"
51 #include "llvm/MC/MCRegisterInfo.h"
52 #include "llvm/MC/MCSubtargetInfo.h"
53 #include "llvm/MC/MCTargetOptions.h"
54 #include "llvm/MC/TargetRegistry.h"
55 #include "llvm/Object/COFF.h"
56 #include "llvm/Object/MachO.h"
57 #include "llvm/Object/ObjectFile.h"
58 #include "llvm/Support/CommandLine.h"
59 #include "llvm/Support/Debug.h"
60 #include "llvm/Support/InitLLVM.h"
61 #include "llvm/Support/MemoryBuffer.h"
62 #include "llvm/Support/Path.h"
63 #include "llvm/Support/Process.h"
64 #include "llvm/Support/TargetSelect.h"
65 #include "llvm/Support/Timer.h"
66 #include <cstring>
67 #include <deque>
68 #include <string>
69 
70 #ifdef LLVM_ON_UNIX
71 #include <netdb.h>
72 #include <netinet/in.h>
73 #include <sys/socket.h>
74 #include <unistd.h>
75 #endif // LLVM_ON_UNIX
76 
77 #define DEBUG_TYPE "llvm_jitlink"
78 
79 using namespace llvm;
80 using namespace llvm::jitlink;
81 using namespace llvm::orc;
82 
83 static cl::OptionCategory JITLinkCategory("JITLink Options");
84 
85 static cl::list<bool> LazyLink("lazy",
86                                cl::desc("Link the following file lazily"),
87                                cl::cat(JITLinkCategory));
88 
89 static cl::list<std::string> InputFiles(cl::Positional, cl::OneOrMore,
90                                         cl::desc("input files"),
91                                         cl::cat(JITLinkCategory));
92 
93 static cl::list<std::string>
94     LibrarySearchPaths("L",
95                        cl::desc("Add dir to the list of library search paths"),
96                        cl::Prefix, cl::cat(JITLinkCategory));
97 
98 static cl::list<std::string>
99     Libraries("l",
100               cl::desc("Link against library X in the library search paths"),
101               cl::Prefix, cl::cat(JITLinkCategory));
102 
103 static cl::list<std::string>
104     LibrariesHidden("hidden-l",
105                     cl::desc("Link against library X in the library search "
106                              "paths with hidden visibility"),
107                     cl::Prefix, cl::cat(JITLinkCategory));
108 
109 static cl::list<std::string>
110     LoadHidden("load_hidden",
111                cl::desc("Link against library X with hidden visibility"),
112                cl::cat(JITLinkCategory));
113 
114 static cl::opt<bool> SearchSystemLibrary(
115     "search-sys-lib",
116     cl::desc("Add system library paths to library search paths"),
117     cl::init(false), cl::cat(JITLinkCategory));
118 
119 static cl::opt<bool> NoExec("noexec", cl::desc("Do not execute loaded code"),
120                             cl::init(false), cl::cat(JITLinkCategory));
121 
122 static cl::list<std::string>
123     CheckFiles("check", cl::desc("File containing verifier checks"),
124                cl::cat(JITLinkCategory));
125 
126 static cl::opt<std::string>
127     CheckName("check-name", cl::desc("Name of checks to match against"),
128               cl::init("jitlink-check"), cl::cat(JITLinkCategory));
129 
130 static cl::opt<std::string>
131     EntryPointName("entry", cl::desc("Symbol to call as main entry point"),
132                    cl::init(""), cl::cat(JITLinkCategory));
133 
134 static cl::list<std::string> JITDylibs(
135     "jd",
136     cl::desc("Specifies the JITDylib to be used for any subsequent "
137              "input file, -L<seacrh-path>, and -l<library> arguments"),
138     cl::cat(JITLinkCategory));
139 
140 static cl::list<std::string>
141     Dylibs("preload",
142            cl::desc("Pre-load dynamic libraries (e.g. language runtimes "
143                     "required by the ORC runtime)"),
144            cl::cat(JITLinkCategory));
145 
146 static cl::list<std::string> InputArgv("args", cl::Positional,
147                                        cl::desc("<program arguments>..."),
148                                        cl::PositionalEatsArgs,
149                                        cl::cat(JITLinkCategory));
150 
151 static cl::opt<bool>
152     DebuggerSupport("debugger-support",
153                     cl::desc("Enable debugger suppport (default = !-noexec)"),
154                     cl::init(true), cl::Hidden, cl::cat(JITLinkCategory));
155 
156 static cl::opt<bool> PerfSupport("perf-support",
157                                  cl::desc("Enable perf profiling support"),
158                                  cl::init(false), cl::Hidden,
159                                  cl::cat(JITLinkCategory));
160 
161 static cl::opt<bool> VTuneSupport("vtune-support",
162                                   cl::desc("Enable vtune profiling support"),
163                                   cl::init(false), cl::Hidden,
164                                   cl::cat(JITLinkCategory));
165 static cl::opt<bool>
166     NoProcessSymbols("no-process-syms",
167                      cl::desc("Do not resolve to llvm-jitlink process symbols"),
168                      cl::init(false), cl::cat(JITLinkCategory));
169 
170 static cl::list<std::string> AbsoluteDefs(
171     "abs",
172     cl::desc("Inject absolute symbol definitions (syntax: <name>=<addr>)"),
173     cl::cat(JITLinkCategory));
174 
175 static cl::list<std::string>
176     Aliases("alias",
177             cl::desc("Inject symbol aliases (syntax: <alias-name>=<aliasee>)"),
178             cl::cat(JITLinkCategory));
179 
180 static cl::list<std::string>
181     SectCreate("sectcreate",
182                cl::desc("given <sectname>,<filename>[@<sym>=<offset>,...]  "
183                         "add the content of <filename> to <sectname>"),
184                cl::cat(JITLinkCategory));
185 
186 static cl::list<std::string> TestHarnesses("harness", cl::Positional,
187                                            cl::desc("Test harness files"),
188                                            cl::PositionalEatsArgs,
189                                            cl::cat(JITLinkCategory));
190 
191 static cl::opt<bool>
192     ShowLinkedFiles("show-linked-files",
193                     cl::desc("List each file/graph name if/when it is linked"),
194                     cl::init(false), cl::cat(JITLinkCategory));
195 
196 static cl::opt<bool> ShowInitialExecutionSessionState(
197     "show-init-es",
198     cl::desc("Print ExecutionSession state before resolving entry point"),
199     cl::init(false), cl::cat(JITLinkCategory));
200 
201 static cl::opt<bool> ShowEntryExecutionSessionState(
202     "show-entry-es",
203     cl::desc("Print ExecutionSession state after resolving entry point"),
204     cl::init(false), cl::cat(JITLinkCategory));
205 
206 static cl::opt<bool> ShowAddrs(
207     "show-addrs",
208     cl::desc("Print registered symbol, section, got and stub addresses"),
209     cl::init(false), cl::cat(JITLinkCategory));
210 
211 static cl::opt<std::string> ShowLinkGraphs(
212     "show-graphs",
213     cl::desc("Takes a posix regex and prints the link graphs of all files "
214              "matching that regex after fixups have been applied"),
215     cl::Optional, cl::cat(JITLinkCategory));
216 
217 static cl::opt<bool> ShowTimes("show-times",
218                                cl::desc("Show times for llvm-jitlink phases"),
219                                cl::init(false), cl::cat(JITLinkCategory));
220 
221 static cl::opt<std::string> SlabAllocateSizeString(
222     "slab-allocate",
223     cl::desc("Allocate from a slab of the given size "
224              "(allowable suffixes: Kb, Mb, Gb. default = "
225              "Kb)"),
226     cl::init(""), cl::cat(JITLinkCategory));
227 
228 static cl::opt<uint64_t> SlabAddress(
229     "slab-address",
230     cl::desc("Set slab target address (requires -slab-allocate and -noexec)"),
231     cl::init(~0ULL), cl::cat(JITLinkCategory));
232 
233 static cl::opt<uint64_t> SlabPageSize(
234     "slab-page-size",
235     cl::desc("Set page size for slab (requires -slab-allocate and -noexec)"),
236     cl::init(0), cl::cat(JITLinkCategory));
237 
238 static cl::opt<bool> ShowRelocatedSectionContents(
239     "show-relocated-section-contents",
240     cl::desc("show section contents after fixups have been applied"),
241     cl::init(false), cl::cat(JITLinkCategory));
242 
243 static cl::opt<bool> PhonyExternals(
244     "phony-externals",
245     cl::desc("resolve all otherwise unresolved externals to null"),
246     cl::init(false), cl::cat(JITLinkCategory));
247 
248 static cl::opt<std::string> OutOfProcessExecutor(
249     "oop-executor", cl::desc("Launch an out-of-process executor to run code"),
250     cl::ValueOptional, cl::cat(JITLinkCategory));
251 
252 static cl::opt<std::string> OutOfProcessExecutorConnect(
253     "oop-executor-connect",
254     cl::desc("Connect to an out-of-process executor via TCP"),
255     cl::cat(JITLinkCategory));
256 
257 static cl::opt<std::string>
258     OrcRuntime("orc-runtime", cl::desc("Use ORC runtime from given path"),
259                cl::init(""), cl::cat(JITLinkCategory));
260 
261 static cl::opt<bool> AddSelfRelocations(
262     "add-self-relocations",
263     cl::desc("Add relocations to function pointers to the current function"),
264     cl::init(false), cl::cat(JITLinkCategory));
265 
266 static cl::opt<bool>
267     ShowErrFailedToMaterialize("show-err-failed-to-materialize",
268                                cl::desc("Show FailedToMaterialize errors"),
269                                cl::init(false), cl::cat(JITLinkCategory));
270 
271 static cl::opt<bool> UseSharedMemory(
272     "use-shared-memory",
273     cl::desc("Use shared memory to transfer generated code and data"),
274     cl::init(false), cl::cat(JITLinkCategory));
275 
276 static cl::opt<std::string>
277     OverrideTriple("triple", cl::desc("Override target triple detection"),
278                    cl::init(""), cl::cat(JITLinkCategory));
279 
280 static cl::opt<bool> AllLoad("all_load",
281                              cl::desc("Load all members of static archives"),
282                              cl::init(false), cl::cat(JITLinkCategory));
283 
284 static cl::opt<bool> ForceLoadObjC(
285     "ObjC",
286     cl::desc("Load all members of static archives that implement "
287              "Objective-C classes or categories, or Swift structs, "
288              "classes or extensions"),
289     cl::init(false), cl::cat(JITLinkCategory));
290 
291 static ExitOnError ExitOnErr;
292 
293 static LLVM_ATTRIBUTE_USED void linkComponents() {
294   errs() << "Linking in runtime functions\n"
295          << (void *)&llvm_orc_registerEHFrameSectionWrapper << '\n'
296          << (void *)&llvm_orc_deregisterEHFrameSectionWrapper << '\n'
297          << (void *)&llvm_orc_registerJITLoaderGDBWrapper << '\n'
298          << (void *)&llvm_orc_registerJITLoaderGDBAllocAction << '\n'
299          << (void *)&llvm_orc_registerJITLoaderPerfStart << '\n'
300          << (void *)&llvm_orc_registerJITLoaderPerfEnd << '\n'
301          << (void *)&llvm_orc_registerJITLoaderPerfImpl << '\n'
302          << (void *)&llvm_orc_registerVTuneImpl << '\n'
303          << (void *)&llvm_orc_unregisterVTuneImpl << '\n'
304          << (void *)&llvm_orc_test_registerVTuneImpl << '\n';
305 }
306 
307 static bool UseTestResultOverride = false;
308 static int64_t TestResultOverride = 0;
309 
310 extern "C" LLVM_ATTRIBUTE_USED void
311 llvm_jitlink_setTestResultOverride(int64_t Value) {
312   TestResultOverride = Value;
313   UseTestResultOverride = true;
314 }
315 
316 static Error addSelfRelocations(LinkGraph &G);
317 
318 namespace {
319 
320 template <typename ErrT>
321 
322 class ConditionalPrintErr {
323 public:
324   ConditionalPrintErr(bool C) : C(C) {}
325   void operator()(ErrT &EI) {
326     if (C) {
327       errs() << "llvm-jitlink error: ";
328       EI.log(errs());
329       errs() << "\n";
330     }
331   }
332 
333 private:
334   bool C;
335 };
336 
337 Expected<std::unique_ptr<MemoryBuffer>> getFile(const Twine &FileName) {
338   if (auto F = MemoryBuffer::getFile(FileName))
339     return std::move(*F);
340   else
341     return createFileError(FileName, F.getError());
342 }
343 
344 void reportLLVMJITLinkError(Error Err) {
345   handleAllErrors(
346       std::move(Err),
347       ConditionalPrintErr<orc::FailedToMaterialize>(ShowErrFailedToMaterialize),
348       ConditionalPrintErr<ErrorInfoBase>(true));
349 }
350 
351 } // end anonymous namespace
352 
353 namespace llvm {
354 
355 static raw_ostream &
356 operator<<(raw_ostream &OS, const Session::MemoryRegionInfo &MRI) {
357   return OS << "target addr = "
358             << format("0x%016" PRIx64, MRI.getTargetAddress())
359             << ", content: " << (const void *)MRI.getContent().data() << " -- "
360             << (const void *)(MRI.getContent().data() + MRI.getContent().size())
361             << " (" << MRI.getContent().size() << " bytes)";
362 }
363 
364 static raw_ostream &
365 operator<<(raw_ostream &OS, const Session::SymbolInfoMap &SIM) {
366   OS << "Symbols:\n";
367   for (auto &SKV : SIM)
368     OS << "  \"" << SKV.first << "\" " << SKV.second << "\n";
369   return OS;
370 }
371 
372 static raw_ostream &
373 operator<<(raw_ostream &OS, const Session::FileInfo &FI) {
374   for (auto &SIKV : FI.SectionInfos)
375     OS << "  Section \"" << SIKV.first() << "\": " << SIKV.second << "\n";
376   for (auto &GOTKV : FI.GOTEntryInfos)
377     OS << "  GOT \"" << GOTKV.first() << "\": " << GOTKV.second << "\n";
378   for (auto &StubKVs : FI.StubInfos) {
379     OS << "  Stubs \"" << StubKVs.first() << "\":";
380     for (auto MemRegion : StubKVs.second)
381       OS << " " << MemRegion;
382     OS << "\n";
383   }
384   return OS;
385 }
386 
387 static raw_ostream &
388 operator<<(raw_ostream &OS, const Session::FileInfoMap &FIM) {
389   for (auto &FIKV : FIM)
390     OS << "File \"" << FIKV.first() << "\":\n" << FIKV.second;
391   return OS;
392 }
393 
394 bool lazyLinkingRequested() {
395   for (auto LL : LazyLink)
396     if (LL)
397       return true;
398   return false;
399 }
400 
401 static Error applyHarnessPromotions(Session &S, LinkGraph &G) {
402 
403   // If this graph is part of the test harness there's nothing to do.
404   if (S.HarnessFiles.empty() || S.HarnessFiles.count(G.getName()))
405     return Error::success();
406 
407   LLVM_DEBUG(dbgs() << "Applying promotions to graph " << G.getName() << "\n");
408 
409   // If this graph is part of the test then promote any symbols referenced by
410   // the harness to default scope, remove all symbols that clash with harness
411   // definitions.
412   std::vector<Symbol *> DefinitionsToRemove;
413   for (auto *Sym : G.defined_symbols()) {
414 
415     if (!Sym->hasName())
416       continue;
417 
418     if (Sym->getLinkage() == Linkage::Weak) {
419       if (!S.CanonicalWeakDefs.count(*Sym->getName()) ||
420           S.CanonicalWeakDefs[*Sym->getName()] != G.getName()) {
421         LLVM_DEBUG({
422           dbgs() << "  Externalizing weak symbol " << Sym->getName() << "\n";
423         });
424         DefinitionsToRemove.push_back(Sym);
425       } else {
426         LLVM_DEBUG({
427           dbgs() << "  Making weak symbol " << Sym->getName() << " strong\n";
428         });
429         if (S.HarnessExternals.count(*Sym->getName()))
430           Sym->setScope(Scope::Default);
431         else
432           Sym->setScope(Scope::Hidden);
433         Sym->setLinkage(Linkage::Strong);
434       }
435     } else if (S.HarnessExternals.count(*Sym->getName())) {
436       LLVM_DEBUG(dbgs() << "  Promoting " << Sym->getName() << "\n");
437       Sym->setScope(Scope::Default);
438       Sym->setLive(true);
439       continue;
440     } else if (S.HarnessDefinitions.count(*Sym->getName())) {
441       LLVM_DEBUG(dbgs() << "  Externalizing " << Sym->getName() << "\n");
442       DefinitionsToRemove.push_back(Sym);
443     }
444   }
445 
446   for (auto *Sym : DefinitionsToRemove)
447     G.makeExternal(*Sym);
448 
449   return Error::success();
450 }
451 
452 static void dumpSectionContents(raw_ostream &OS, LinkGraph &G) {
453   constexpr orc::ExecutorAddrDiff DumpWidth = 16;
454   static_assert(isPowerOf2_64(DumpWidth), "DumpWidth must be a power of two");
455 
456   // Put sections in address order.
457   std::vector<Section *> Sections;
458   for (auto &S : G.sections())
459     Sections.push_back(&S);
460 
461   llvm::sort(Sections, [](const Section *LHS, const Section *RHS) {
462     if (LHS->symbols().empty() && RHS->symbols().empty())
463       return false;
464     if (LHS->symbols().empty())
465       return false;
466     if (RHS->symbols().empty())
467       return true;
468     SectionRange LHSRange(*LHS);
469     SectionRange RHSRange(*RHS);
470     return LHSRange.getStart() < RHSRange.getStart();
471   });
472 
473   for (auto *S : Sections) {
474     OS << S->getName() << " content:";
475     if (S->symbols().empty()) {
476       OS << "\n  section empty\n";
477       continue;
478     }
479 
480     // Sort symbols into order, then render.
481     std::vector<Symbol *> Syms(S->symbols().begin(), S->symbols().end());
482     llvm::sort(Syms, [](const Symbol *LHS, const Symbol *RHS) {
483       return LHS->getAddress() < RHS->getAddress();
484     });
485 
486     orc::ExecutorAddr NextAddr(Syms.front()->getAddress().getValue() &
487                                ~(DumpWidth - 1));
488     for (auto *Sym : Syms) {
489       bool IsZeroFill = Sym->getBlock().isZeroFill();
490       auto SymStart = Sym->getAddress();
491       auto SymSize = Sym->getSize();
492       auto SymEnd = SymStart + SymSize;
493       const uint8_t *SymData = IsZeroFill ? nullptr
494                                           : reinterpret_cast<const uint8_t *>(
495                                                 Sym->getSymbolContent().data());
496 
497       // Pad any space before the symbol starts.
498       while (NextAddr != SymStart) {
499         if (NextAddr % DumpWidth == 0)
500           OS << formatv("\n{0:x16}:", NextAddr);
501         OS << "   ";
502         ++NextAddr;
503       }
504 
505       // Render the symbol content.
506       while (NextAddr != SymEnd) {
507         if (NextAddr % DumpWidth == 0)
508           OS << formatv("\n{0:x16}:", NextAddr);
509         if (IsZeroFill)
510           OS << " 00";
511         else
512           OS << formatv(" {0:x-2}", SymData[NextAddr - SymStart]);
513         ++NextAddr;
514       }
515     }
516     OS << "\n";
517   }
518 }
519 
520 // A memory mapper with a fake offset applied only used for -noexec testing
521 class InProcessDeltaMapper final : public InProcessMemoryMapper {
522 public:
523   InProcessDeltaMapper(size_t PageSize, uint64_t TargetAddr)
524       : InProcessMemoryMapper(PageSize), TargetMapAddr(TargetAddr),
525         DeltaAddr(0) {}
526 
527   static Expected<std::unique_ptr<InProcessDeltaMapper>> Create() {
528     size_t PageSize = SlabPageSize;
529     if (!PageSize) {
530       if (auto PageSizeOrErr = sys::Process::getPageSize())
531         PageSize = *PageSizeOrErr;
532       else
533         return PageSizeOrErr.takeError();
534     }
535 
536     if (PageSize == 0)
537       return make_error<StringError>("Page size is zero",
538                                      inconvertibleErrorCode());
539 
540     return std::make_unique<InProcessDeltaMapper>(PageSize, SlabAddress);
541   }
542 
543   void reserve(size_t NumBytes, OnReservedFunction OnReserved) override {
544     InProcessMemoryMapper::reserve(
545         NumBytes, [this, OnReserved = std::move(OnReserved)](
546                       Expected<ExecutorAddrRange> Result) mutable {
547           if (!Result)
548             return OnReserved(Result.takeError());
549 
550           assert(DeltaAddr == 0 && "Overwriting previous offset");
551           if (TargetMapAddr != ~0ULL)
552             DeltaAddr = TargetMapAddr - Result->Start.getValue();
553           auto OffsetRange = ExecutorAddrRange(Result->Start + DeltaAddr,
554                                                Result->End + DeltaAddr);
555 
556           OnReserved(OffsetRange);
557         });
558   }
559 
560   char *prepare(ExecutorAddr Addr, size_t ContentSize) override {
561     return InProcessMemoryMapper::prepare(Addr - DeltaAddr, ContentSize);
562   }
563 
564   void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override {
565     // Slide mapping based on delta, make all segments read-writable, and
566     // discard allocation actions.
567     auto FixedAI = std::move(AI);
568     FixedAI.MappingBase -= DeltaAddr;
569     for (auto &Seg : FixedAI.Segments)
570       Seg.AG = {MemProt::Read | MemProt::Write, Seg.AG.getMemLifetime()};
571     FixedAI.Actions.clear();
572     InProcessMemoryMapper::initialize(
573         FixedAI, [this, OnInitialized = std::move(OnInitialized)](
574                      Expected<ExecutorAddr> Result) mutable {
575           if (!Result)
576             return OnInitialized(Result.takeError());
577 
578           OnInitialized(ExecutorAddr(Result->getValue() + DeltaAddr));
579         });
580   }
581 
582   void deinitialize(ArrayRef<ExecutorAddr> Allocations,
583                     OnDeinitializedFunction OnDeInitialized) override {
584     std::vector<ExecutorAddr> Addrs(Allocations.size());
585     for (const auto Base : Allocations) {
586       Addrs.push_back(Base - DeltaAddr);
587     }
588 
589     InProcessMemoryMapper::deinitialize(Addrs, std::move(OnDeInitialized));
590   }
591 
592   void release(ArrayRef<ExecutorAddr> Reservations,
593                OnReleasedFunction OnRelease) override {
594     std::vector<ExecutorAddr> Addrs(Reservations.size());
595     for (const auto Base : Reservations) {
596       Addrs.push_back(Base - DeltaAddr);
597     }
598     InProcessMemoryMapper::release(Addrs, std::move(OnRelease));
599   }
600 
601 private:
602   uint64_t TargetMapAddr;
603   uint64_t DeltaAddr;
604 };
605 
606 Expected<uint64_t> getSlabAllocSize(StringRef SizeString) {
607   SizeString = SizeString.trim();
608 
609   uint64_t Units = 1024;
610 
611   if (SizeString.ends_with_insensitive("kb"))
612     SizeString = SizeString.drop_back(2).rtrim();
613   else if (SizeString.ends_with_insensitive("mb")) {
614     Units = 1024 * 1024;
615     SizeString = SizeString.drop_back(2).rtrim();
616   } else if (SizeString.ends_with_insensitive("gb")) {
617     Units = 1024 * 1024 * 1024;
618     SizeString = SizeString.drop_back(2).rtrim();
619   }
620 
621   uint64_t SlabSize = 0;
622   if (SizeString.getAsInteger(10, SlabSize))
623     return make_error<StringError>("Invalid numeric format for slab size",
624                                    inconvertibleErrorCode());
625 
626   return SlabSize * Units;
627 }
628 
629 static std::unique_ptr<JITLinkMemoryManager> createInProcessMemoryManager() {
630   uint64_t SlabSize;
631 #ifdef _WIN32
632   SlabSize = 1024 * 1024;
633 #else
634   SlabSize = 1024 * 1024 * 1024;
635 #endif
636 
637   if (!SlabAllocateSizeString.empty())
638     SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString));
639 
640   // If this is a -no-exec case and we're tweaking the slab address or size then
641   // use the delta mapper.
642   if (NoExec && (SlabAddress || SlabPageSize))
643     return ExitOnErr(
644         MapperJITLinkMemoryManager::CreateWithMapper<InProcessDeltaMapper>(
645             SlabSize));
646 
647   // Otherwise use the standard in-process mapper.
648   return ExitOnErr(
649       MapperJITLinkMemoryManager::CreateWithMapper<InProcessMemoryMapper>(
650           SlabSize));
651 }
652 
653 Expected<std::unique_ptr<jitlink::JITLinkMemoryManager>>
654 createSharedMemoryManager(SimpleRemoteEPC &SREPC) {
655   SharedMemoryMapper::SymbolAddrs SAs;
656   if (auto Err = SREPC.getBootstrapSymbols(
657           {{SAs.Instance, rt::ExecutorSharedMemoryMapperServiceInstanceName},
658            {SAs.Reserve,
659             rt::ExecutorSharedMemoryMapperServiceReserveWrapperName},
660            {SAs.Initialize,
661             rt::ExecutorSharedMemoryMapperServiceInitializeWrapperName},
662            {SAs.Deinitialize,
663             rt::ExecutorSharedMemoryMapperServiceDeinitializeWrapperName},
664            {SAs.Release,
665             rt::ExecutorSharedMemoryMapperServiceReleaseWrapperName}}))
666     return std::move(Err);
667 
668 #ifdef _WIN32
669   size_t SlabSize = 1024 * 1024;
670 #else
671   size_t SlabSize = 1024 * 1024 * 1024;
672 #endif
673 
674   if (!SlabAllocateSizeString.empty())
675     SlabSize = ExitOnErr(getSlabAllocSize(SlabAllocateSizeString));
676 
677   return MapperJITLinkMemoryManager::CreateWithMapper<SharedMemoryMapper>(
678       SlabSize, SREPC, SAs);
679 }
680 
681 
682 static Expected<MaterializationUnit::Interface>
683 getTestObjectFileInterface(Session &S, MemoryBufferRef O) {
684 
685   // Get the standard interface for this object, but ignore the symbols field.
686   // We'll handle that manually to include promotion.
687   auto I = getObjectFileInterface(S.ES, O);
688   if (!I)
689     return I.takeError();
690   I->SymbolFlags.clear();
691 
692   // If creating an object file was going to fail it would have happened above,
693   // so we can 'cantFail' this.
694   auto Obj = cantFail(object::ObjectFile::createObjectFile(O));
695 
696   // The init symbol must be included in the SymbolFlags map if present.
697   if (I->InitSymbol)
698     I->SymbolFlags[I->InitSymbol] =
699         JITSymbolFlags::MaterializationSideEffectsOnly;
700 
701   for (auto &Sym : Obj->symbols()) {
702     Expected<uint32_t> SymFlagsOrErr = Sym.getFlags();
703     if (!SymFlagsOrErr)
704       // TODO: Test this error.
705       return SymFlagsOrErr.takeError();
706 
707     // Skip symbols not defined in this object file.
708     if ((*SymFlagsOrErr & object::BasicSymbolRef::SF_Undefined))
709       continue;
710 
711     auto Name = Sym.getName();
712     if (!Name)
713       return Name.takeError();
714 
715     // Skip symbols that have type SF_File.
716     if (auto SymType = Sym.getType()) {
717       if (*SymType == object::SymbolRef::ST_File)
718         continue;
719     } else
720       return SymType.takeError();
721 
722     auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym);
723     if (!SymFlags)
724       return SymFlags.takeError();
725 
726     if (SymFlags->isWeak()) {
727       // If this is a weak symbol that's not defined in the harness then we
728       // need to either mark it as strong (if this is the first definition
729       // that we've seen) or discard it.
730       if (S.HarnessDefinitions.count(*Name) || S.CanonicalWeakDefs.count(*Name))
731         continue;
732       S.CanonicalWeakDefs[*Name] = O.getBufferIdentifier();
733       *SymFlags &= ~JITSymbolFlags::Weak;
734       if (!S.HarnessExternals.count(*Name))
735         *SymFlags &= ~JITSymbolFlags::Exported;
736     } else if (S.HarnessExternals.count(*Name)) {
737       *SymFlags |= JITSymbolFlags::Exported;
738     } else if (S.HarnessDefinitions.count(*Name) ||
739                !(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global))
740       continue;
741 
742     auto InternedName = S.ES.intern(*Name);
743     I->SymbolFlags[InternedName] = std::move(*SymFlags);
744   }
745 
746   return I;
747 }
748 
749 static Error loadProcessSymbols(Session &S) {
750   S.ProcessSymsJD = &S.ES.createBareJITDylib("Process");
751   auto FilterMainEntryPoint =
752       [EPName = S.ES.intern(EntryPointName)](SymbolStringPtr Name) {
753         return Name != EPName;
754       };
755   S.ProcessSymsJD->addGenerator(
756       ExitOnErr(orc::EPCDynamicLibrarySearchGenerator::GetForTargetProcess(
757           S.ES, std::move(FilterMainEntryPoint))));
758 
759   return Error::success();
760 }
761 
762 static Error loadDylibs(Session &S) {
763   LLVM_DEBUG(dbgs() << "Loading dylibs...\n");
764   for (const auto &Dylib : Dylibs) {
765     LLVM_DEBUG(dbgs() << "  " << Dylib << "\n");
766     auto DL = S.getOrLoadDynamicLibrary(Dylib);
767     if (!DL)
768       return DL.takeError();
769   }
770 
771   return Error::success();
772 }
773 
774 static Expected<std::unique_ptr<ExecutorProcessControl>> launchExecutor() {
775 #ifndef LLVM_ON_UNIX
776   // FIXME: Add support for Windows.
777   return make_error<StringError>("-" + OutOfProcessExecutor.ArgStr +
778                                      " not supported on non-unix platforms",
779                                  inconvertibleErrorCode());
780 #elif !LLVM_ENABLE_THREADS
781   // Out of process mode using SimpleRemoteEPC depends on threads.
782   return make_error<StringError>(
783       "-" + OutOfProcessExecutor.ArgStr +
784           " requires threads, but LLVM was built with "
785           "LLVM_ENABLE_THREADS=Off",
786       inconvertibleErrorCode());
787 #else
788 
789   constexpr int ReadEnd = 0;
790   constexpr int WriteEnd = 1;
791 
792   // Pipe FDs.
793   int ToExecutor[2];
794   int FromExecutor[2];
795 
796   pid_t ChildPID;
797 
798   // Create pipes to/from the executor..
799   if (pipe(ToExecutor) != 0 || pipe(FromExecutor) != 0)
800     return make_error<StringError>("Unable to create pipe for executor",
801                                    inconvertibleErrorCode());
802 
803   ChildPID = fork();
804 
805   if (ChildPID == 0) {
806     // In the child...
807 
808     // Close the parent ends of the pipes
809     close(ToExecutor[WriteEnd]);
810     close(FromExecutor[ReadEnd]);
811 
812     // Execute the child process.
813     std::unique_ptr<char[]> ExecutorPath, FDSpecifier;
814     {
815       ExecutorPath = std::make_unique<char[]>(OutOfProcessExecutor.size() + 1);
816       strcpy(ExecutorPath.get(), OutOfProcessExecutor.data());
817 
818       std::string FDSpecifierStr("filedescs=");
819       FDSpecifierStr += utostr(ToExecutor[ReadEnd]);
820       FDSpecifierStr += ',';
821       FDSpecifierStr += utostr(FromExecutor[WriteEnd]);
822       FDSpecifier = std::make_unique<char[]>(FDSpecifierStr.size() + 1);
823       strcpy(FDSpecifier.get(), FDSpecifierStr.c_str());
824     }
825 
826     char *const Args[] = {ExecutorPath.get(), FDSpecifier.get(), nullptr};
827     int RC = execvp(ExecutorPath.get(), Args);
828     if (RC != 0) {
829       errs() << "unable to launch out-of-process executor \""
830              << ExecutorPath.get() << "\"\n";
831       exit(1);
832     }
833   }
834   // else we're the parent...
835 
836   // Close the child ends of the pipes
837   close(ToExecutor[ReadEnd]);
838   close(FromExecutor[WriteEnd]);
839 
840   auto S = SimpleRemoteEPC::Setup();
841   if (UseSharedMemory)
842     S.CreateMemoryManager = createSharedMemoryManager;
843 
844   return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>(
845       std::make_unique<DynamicThreadPoolTaskDispatcher>(std::nullopt),
846       std::move(S), FromExecutor[ReadEnd], ToExecutor[WriteEnd]);
847 #endif
848 }
849 
850 #if LLVM_ON_UNIX && LLVM_ENABLE_THREADS
851 static Error createTCPSocketError(Twine Details) {
852   return make_error<StringError>(
853       formatv("Failed to connect TCP socket '{0}': {1}",
854               OutOfProcessExecutorConnect, Details),
855       inconvertibleErrorCode());
856 }
857 
858 static Expected<int> connectTCPSocket(std::string Host, std::string PortStr) {
859   addrinfo *AI;
860   addrinfo Hints{};
861   Hints.ai_family = AF_INET;
862   Hints.ai_socktype = SOCK_STREAM;
863   Hints.ai_flags = AI_NUMERICSERV;
864 
865   if (int EC = getaddrinfo(Host.c_str(), PortStr.c_str(), &Hints, &AI))
866     return createTCPSocketError("Address resolution failed (" +
867                                 StringRef(gai_strerror(EC)) + ")");
868 
869   // Cycle through the returned addrinfo structures and connect to the first
870   // reachable endpoint.
871   int SockFD;
872   addrinfo *Server;
873   for (Server = AI; Server != nullptr; Server = Server->ai_next) {
874     // socket might fail, e.g. if the address family is not supported. Skip to
875     // the next addrinfo structure in such a case.
876     if ((SockFD = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol)) < 0)
877       continue;
878 
879     // If connect returns null, we exit the loop with a working socket.
880     if (connect(SockFD, Server->ai_addr, Server->ai_addrlen) == 0)
881       break;
882 
883     close(SockFD);
884   }
885   freeaddrinfo(AI);
886 
887   // If we reached the end of the loop without connecting to a valid endpoint,
888   // dump the last error that was logged in socket() or connect().
889   if (Server == nullptr)
890     return createTCPSocketError(std::strerror(errno));
891 
892   return SockFD;
893 }
894 #endif
895 
896 static Expected<std::unique_ptr<ExecutorProcessControl>> connectToExecutor() {
897 #ifndef LLVM_ON_UNIX
898   // FIXME: Add TCP support for Windows.
899   return make_error<StringError>("-" + OutOfProcessExecutorConnect.ArgStr +
900                                      " not supported on non-unix platforms",
901                                  inconvertibleErrorCode());
902 #elif !LLVM_ENABLE_THREADS
903   // Out of process mode using SimpleRemoteEPC depends on threads.
904   return make_error<StringError>(
905       "-" + OutOfProcessExecutorConnect.ArgStr +
906           " requires threads, but LLVM was built with "
907           "LLVM_ENABLE_THREADS=Off",
908       inconvertibleErrorCode());
909 #else
910 
911   StringRef Host, PortStr;
912   std::tie(Host, PortStr) = StringRef(OutOfProcessExecutorConnect).split(':');
913   if (Host.empty())
914     return createTCPSocketError("Host name for -" +
915                                 OutOfProcessExecutorConnect.ArgStr +
916                                 " can not be empty");
917   if (PortStr.empty())
918     return createTCPSocketError("Port number in -" +
919                                 OutOfProcessExecutorConnect.ArgStr +
920                                 " can not be empty");
921   int Port = 0;
922   if (PortStr.getAsInteger(10, Port))
923     return createTCPSocketError("Port number '" + PortStr +
924                                 "' is not a valid integer");
925 
926   Expected<int> SockFD = connectTCPSocket(Host.str(), PortStr.str());
927   if (!SockFD)
928     return SockFD.takeError();
929 
930   auto S = SimpleRemoteEPC::Setup();
931   if (UseSharedMemory)
932     S.CreateMemoryManager = createSharedMemoryManager;
933 
934   return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>(
935       std::make_unique<DynamicThreadPoolTaskDispatcher>(std::nullopt),
936       std::move(S), *SockFD, *SockFD);
937 #endif
938 }
939 
940 class PhonyExternalsGenerator : public DefinitionGenerator {
941 public:
942   Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
943                       JITDylibLookupFlags JDLookupFlags,
944                       const SymbolLookupSet &LookupSet) override {
945     SymbolMap PhonySymbols;
946     for (auto &KV : LookupSet)
947       PhonySymbols[KV.first] = {ExecutorAddr(), JITSymbolFlags::Exported};
948     return JD.define(absoluteSymbols(std::move(PhonySymbols)));
949   }
950 };
951 
952 static void handleLazyCallFailure() {
953   dbgs() << "ERROR: failure to materialize lazy call-through target.\n";
954   exit(1);
955 }
956 
957 static void *reenter(void *Ctx, void *TrampolineAddr) {
958   std::promise<void *> LandingAddressP;
959   auto LandingAddressF = LandingAddressP.get_future();
960 
961   auto *EPCIU = static_cast<EPCIndirectionUtils *>(Ctx);
962   EPCIU->getLazyCallThroughManager().resolveTrampolineLandingAddress(
963       ExecutorAddr::fromPtr(TrampolineAddr), [&](ExecutorAddr LandingAddress) {
964         LandingAddressP.set_value(LandingAddress.toPtr<void *>());
965       });
966   return LandingAddressF.get();
967 }
968 
969 Expected<std::unique_ptr<Session::LazyLinkingSupport>>
970 createLazyLinkingSupport(ObjectLinkingLayer &OLL) {
971   auto EPCIU = EPCIndirectionUtils::Create(OLL.getExecutionSession());
972   if (!EPCIU)
973     return EPCIU.takeError();
974   if (auto Err = (*EPCIU)
975                      ->writeResolverBlock(ExecutorAddr::fromPtr(&reenter),
976                                           ExecutorAddr::fromPtr(EPCIU->get()))
977                      .takeError())
978     return Err;
979   (*EPCIU)->createLazyCallThroughManager(
980       OLL.getExecutionSession(), ExecutorAddr::fromPtr(handleLazyCallFailure));
981   auto RSMgr = JITLinkRedirectableSymbolManager::Create(OLL);
982   if (!RSMgr)
983     return RSMgr.takeError();
984 
985   return std::make_unique<Session::LazyLinkingSupport>(std::move(*EPCIU),
986                                                        std::move(*RSMgr), OLL);
987 }
988 
989 Expected<std::unique_ptr<Session>> Session::Create(Triple TT,
990                                                    SubtargetFeatures Features) {
991 
992   std::unique_ptr<ExecutorProcessControl> EPC;
993   if (OutOfProcessExecutor.getNumOccurrences()) {
994     /// If -oop-executor is passed then launch the executor.
995     if (auto REPC = launchExecutor())
996       EPC = std::move(*REPC);
997     else
998       return REPC.takeError();
999   } else if (OutOfProcessExecutorConnect.getNumOccurrences()) {
1000     /// If -oop-executor-connect is passed then connect to the executor.
1001     if (auto REPC = connectToExecutor())
1002       EPC = std::move(*REPC);
1003     else
1004       return REPC.takeError();
1005   } else {
1006     /// Otherwise use SelfExecutorProcessControl to target the current process.
1007     auto PageSize = sys::Process::getPageSize();
1008     if (!PageSize)
1009       return PageSize.takeError();
1010     EPC = std::make_unique<SelfExecutorProcessControl>(
1011         std::make_shared<SymbolStringPool>(),
1012         std::make_unique<InPlaceTaskDispatcher>(), std::move(TT), *PageSize,
1013         createInProcessMemoryManager());
1014   }
1015 
1016   Error Err = Error::success();
1017   std::unique_ptr<Session> S(new Session(std::move(EPC), Err));
1018   if (Err)
1019     return std::move(Err);
1020   S->Features = std::move(Features);
1021 
1022   if (lazyLinkingRequested()) {
1023     if (auto LazyLinking = createLazyLinkingSupport(S->ObjLayer))
1024       S->LazyLinking = std::move(*LazyLinking);
1025     else
1026       return LazyLinking.takeError();
1027   }
1028 
1029   return std::move(S);
1030 }
1031 
1032 Session::~Session() {
1033   if (auto Err = ES.endSession())
1034     ES.reportError(std::move(Err));
1035 }
1036 
1037 Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err)
1038     : ES(std::move(EPC)),
1039       ObjLayer(ES, ES.getExecutorProcessControl().getMemMgr()) {
1040 
1041   /// Local ObjectLinkingLayer::Plugin class to forward modifyPassConfig to the
1042   /// Session.
1043   class JITLinkSessionPlugin : public ObjectLinkingLayer::Plugin {
1044   public:
1045     JITLinkSessionPlugin(Session &S) : S(S) {}
1046     void modifyPassConfig(MaterializationResponsibility &MR, LinkGraph &G,
1047                           PassConfiguration &PassConfig) override {
1048       S.modifyPassConfig(G, PassConfig);
1049     }
1050 
1051     Error notifyFailed(MaterializationResponsibility &MR) override {
1052       return Error::success();
1053     }
1054     Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {
1055       return Error::success();
1056     }
1057     void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
1058                                      ResourceKey SrcKey) override {}
1059 
1060   private:
1061     Session &S;
1062   };
1063 
1064   ErrorAsOutParameter _(&Err);
1065 
1066   ES.setErrorReporter(reportLLVMJITLinkError);
1067 
1068   if (!NoProcessSymbols)
1069     ExitOnErr(loadProcessSymbols(*this));
1070 
1071   ExitOnErr(loadDylibs(*this));
1072 
1073   auto &TT = ES.getTargetTriple();
1074 
1075   if (DebuggerSupport && TT.isOSBinFormatMachO()) {
1076     if (!ProcessSymsJD) {
1077       Err = make_error<StringError>("MachO debugging requires process symbols",
1078                                     inconvertibleErrorCode());
1079       return;
1080     }
1081     ObjLayer.addPlugin(ExitOnErr(GDBJITDebugInfoRegistrationPlugin::Create(
1082         this->ES, *ProcessSymsJD, TT)));
1083   }
1084 
1085   if (PerfSupport && TT.isOSBinFormatELF()) {
1086     if (!ProcessSymsJD) {
1087       Err = make_error<StringError>("MachO debugging requires process symbols",
1088                                     inconvertibleErrorCode());
1089       return;
1090     }
1091     ObjLayer.addPlugin(ExitOnErr(DebugInfoPreservationPlugin::Create()));
1092     ObjLayer.addPlugin(ExitOnErr(PerfSupportPlugin::Create(
1093         this->ES.getExecutorProcessControl(), *ProcessSymsJD, true, true)));
1094   }
1095 
1096   if (VTuneSupport && TT.isOSBinFormatELF()) {
1097     ObjLayer.addPlugin(ExitOnErr(DebugInfoPreservationPlugin::Create()));
1098     ObjLayer.addPlugin(ExitOnErr(
1099         VTuneSupportPlugin::Create(this->ES.getExecutorProcessControl(),
1100                                    *ProcessSymsJD, /*EmitDebugInfo=*/true,
1101                                    /*TestMode=*/true)));
1102   }
1103 
1104   // Set up the platform.
1105   if (!OrcRuntime.empty()) {
1106     assert(ProcessSymsJD && "ProcessSymsJD should have been set");
1107     PlatformJD = &ES.createBareJITDylib("Platform");
1108     PlatformJD->addToLinkOrder(*ProcessSymsJD);
1109 
1110     if (TT.isOSBinFormatMachO()) {
1111       if (auto P =
1112               MachOPlatform::Create(ObjLayer, *PlatformJD, OrcRuntime.c_str()))
1113         ES.setPlatform(std::move(*P));
1114       else {
1115         Err = P.takeError();
1116         return;
1117       }
1118     } else if (TT.isOSBinFormatELF()) {
1119       if (auto P =
1120               ELFNixPlatform::Create(ObjLayer, *PlatformJD, OrcRuntime.c_str()))
1121         ES.setPlatform(std::move(*P));
1122       else {
1123         Err = P.takeError();
1124         return;
1125       }
1126     } else if (TT.isOSBinFormatCOFF()) {
1127       auto LoadDynLibrary = [&, this](JITDylib &JD,
1128                                       StringRef DLLName) -> Error {
1129         if (!DLLName.ends_with_insensitive(".dll"))
1130           return make_error<StringError>("DLLName not ending with .dll",
1131                                          inconvertibleErrorCode());
1132         return loadAndLinkDynamicLibrary(JD, DLLName);
1133       };
1134 
1135       if (auto P =
1136               COFFPlatform::Create(ObjLayer, *PlatformJD, OrcRuntime.c_str(),
1137                                    std::move(LoadDynLibrary)))
1138         ES.setPlatform(std::move(*P));
1139       else {
1140         Err = P.takeError();
1141         return;
1142       }
1143     } else {
1144       Err = make_error<StringError>(
1145           "-" + OrcRuntime.ArgStr + " specified, but format " +
1146               Triple::getObjectFormatTypeName(TT.getObjectFormat()) +
1147               " not supported",
1148           inconvertibleErrorCode());
1149       return;
1150     }
1151   } else if (TT.isOSBinFormatELF()) {
1152     if (!NoExec)
1153       ObjLayer.addPlugin(std::make_unique<EHFrameRegistrationPlugin>(
1154           ES, ExitOnErr(EPCEHFrameRegistrar::Create(this->ES))));
1155     if (DebuggerSupport)
1156       ObjLayer.addPlugin(std::make_unique<DebugObjectManagerPlugin>(
1157           ES, ExitOnErr(createJITLoaderGDBRegistrar(this->ES)), true, true));
1158   }
1159 
1160   if (auto MainJDOrErr = ES.createJITDylib("main"))
1161     MainJD = &*MainJDOrErr;
1162   else {
1163     Err = MainJDOrErr.takeError();
1164     return;
1165   }
1166 
1167   if (NoProcessSymbols) {
1168     // This symbol is used in testcases, but we're not reflecting process
1169     // symbols so we'll need to make it available some other way.
1170     auto &TestResultJD = ES.createBareJITDylib("<TestResultJD>");
1171     ExitOnErr(TestResultJD.define(absoluteSymbols(
1172         {{ES.intern("llvm_jitlink_setTestResultOverride"),
1173           {ExecutorAddr::fromPtr(llvm_jitlink_setTestResultOverride),
1174            JITSymbolFlags::Exported}}})));
1175     MainJD->addToLinkOrder(TestResultJD);
1176   }
1177 
1178   ObjLayer.addPlugin(std::make_unique<JITLinkSessionPlugin>(*this));
1179 
1180   // Process any harness files.
1181   for (auto &HarnessFile : TestHarnesses) {
1182     HarnessFiles.insert(HarnessFile);
1183 
1184     auto ObjBuffer =
1185         ExitOnErr(loadLinkableFile(HarnessFile, ES.getTargetTriple(),
1186                                    LoadArchives::Never))
1187             .first;
1188 
1189     auto ObjInterface =
1190         ExitOnErr(getObjectFileInterface(ES, ObjBuffer->getMemBufferRef()));
1191 
1192     for (auto &KV : ObjInterface.SymbolFlags)
1193       HarnessDefinitions.insert(*KV.first);
1194 
1195     auto Obj = ExitOnErr(
1196         object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef()));
1197 
1198     for (auto &Sym : Obj->symbols()) {
1199       uint32_t SymFlags = ExitOnErr(Sym.getFlags());
1200       auto Name = ExitOnErr(Sym.getName());
1201 
1202       if (Name.empty())
1203         continue;
1204 
1205       if (SymFlags & object::BasicSymbolRef::SF_Undefined)
1206         HarnessExternals.insert(Name);
1207     }
1208   }
1209 
1210   // If a name is defined by some harness file then it's a definition, not an
1211   // external.
1212   for (auto &DefName : HarnessDefinitions)
1213     HarnessExternals.erase(DefName.getKey());
1214 
1215   if (!ShowLinkGraphs.empty())
1216     ShowGraphsRegex = Regex(ShowLinkGraphs);
1217 }
1218 
1219 void Session::dumpSessionInfo(raw_ostream &OS) {
1220   OS << "Registered addresses:\n" << SymbolInfos << FileInfos;
1221 }
1222 
1223 void Session::modifyPassConfig(LinkGraph &G, PassConfiguration &PassConfig) {
1224 
1225   if (ShowLinkedFiles)
1226     outs() << "Linking " << G.getName() << "\n";
1227 
1228   if (!CheckFiles.empty())
1229     PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) {
1230       if (ES.getTargetTriple().getObjectFormat() == Triple::ELF)
1231         return registerELFGraphInfo(*this, G);
1232 
1233       if (ES.getTargetTriple().getObjectFormat() == Triple::MachO)
1234         return registerMachOGraphInfo(*this, G);
1235 
1236       if (ES.getTargetTriple().getObjectFormat() == Triple::COFF)
1237         return registerCOFFGraphInfo(*this, G);
1238 
1239       return make_error<StringError>("Unsupported object format for GOT/stub "
1240                                      "registration",
1241                                      inconvertibleErrorCode());
1242     });
1243 
1244   if (ShowGraphsRegex)
1245     PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error {
1246       // Print graph if ShowLinkGraphs is specified-but-empty, or if
1247       // it contains the given graph.
1248       if (ShowGraphsRegex->match(G.getName())) {
1249         outs() << "Link graph \"" << G.getName() << "\" post-fixup:\n";
1250         G.dump(outs());
1251       }
1252       return Error::success();
1253     });
1254 
1255   PassConfig.PrePrunePasses.push_back(
1256       [this](LinkGraph &G) { return applyHarnessPromotions(*this, G); });
1257 
1258   if (ShowRelocatedSectionContents)
1259     PassConfig.PostFixupPasses.push_back([](LinkGraph &G) -> Error {
1260       outs() << "Relocated section contents for " << G.getName() << ":\n";
1261       dumpSectionContents(outs(), G);
1262       return Error::success();
1263     });
1264 
1265   if (AddSelfRelocations)
1266     PassConfig.PostPrunePasses.push_back(addSelfRelocations);
1267 }
1268 
1269 Expected<JITDylib *> Session::getOrLoadDynamicLibrary(StringRef LibPath) {
1270   auto It = DynLibJDs.find(LibPath);
1271   if (It != DynLibJDs.end()) {
1272     return It->second;
1273   }
1274   auto G = EPCDynamicLibrarySearchGenerator::Load(ES, LibPath.data());
1275   if (!G)
1276     return G.takeError();
1277   auto JD = &ES.createBareJITDylib(LibPath.str());
1278 
1279   JD->addGenerator(std::move(*G));
1280   DynLibJDs.emplace(LibPath.str(), JD);
1281   LLVM_DEBUG({
1282     dbgs() << "Loaded dynamic library " << LibPath.data() << " for " << LibPath
1283            << "\n";
1284   });
1285   return JD;
1286 }
1287 
1288 Error Session::loadAndLinkDynamicLibrary(JITDylib &JD, StringRef LibPath) {
1289   auto DL = getOrLoadDynamicLibrary(LibPath);
1290   if (!DL)
1291     return DL.takeError();
1292   JD.addToLinkOrder(**DL);
1293   LLVM_DEBUG({
1294     dbgs() << "Linking dynamic library " << LibPath << " to " << JD.getName()
1295            << "\n";
1296   });
1297   return Error::success();
1298 }
1299 
1300 Error Session::FileInfo::registerGOTEntry(
1301     LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) {
1302   if (Sym.isSymbolZeroFill())
1303     return make_error<StringError>("Unexpected zero-fill symbol in section " +
1304                                        Sym.getBlock().getSection().getName(),
1305                                    inconvertibleErrorCode());
1306   auto TS = GetSymbolTarget(G, Sym.getBlock());
1307   if (!TS)
1308     return TS.takeError();
1309   GOTEntryInfos[*TS->getName()] = {Sym.getSymbolContent(),
1310                                    Sym.getAddress().getValue(),
1311                                    Sym.getTargetFlags()};
1312   return Error::success();
1313 }
1314 
1315 Error Session::FileInfo::registerStubEntry(
1316     LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) {
1317   if (Sym.isSymbolZeroFill())
1318     return make_error<StringError>("Unexpected zero-fill symbol in section " +
1319                                        Sym.getBlock().getSection().getName(),
1320                                    inconvertibleErrorCode());
1321   auto TS = GetSymbolTarget(G, Sym.getBlock());
1322   if (!TS)
1323     return TS.takeError();
1324 
1325   SmallVectorImpl<MemoryRegionInfo> &Entry = StubInfos[*TS->getName()];
1326   Entry.insert(Entry.begin(),
1327                {Sym.getSymbolContent(), Sym.getAddress().getValue(),
1328                 Sym.getTargetFlags()});
1329   return Error::success();
1330 }
1331 
1332 Error Session::FileInfo::registerMultiStubEntry(
1333     LinkGraph &G, Symbol &Sym, GetSymbolTargetFunction GetSymbolTarget) {
1334   if (Sym.isSymbolZeroFill())
1335     return make_error<StringError>("Unexpected zero-fill symbol in section " +
1336                                        Sym.getBlock().getSection().getName(),
1337                                    inconvertibleErrorCode());
1338 
1339   auto Target = GetSymbolTarget(G, Sym.getBlock());
1340   if (!Target)
1341     return Target.takeError();
1342 
1343   SmallVectorImpl<MemoryRegionInfo> &Entry = StubInfos[*Target->getName()];
1344   Entry.emplace_back(Sym.getSymbolContent(), Sym.getAddress().getValue(),
1345                      Sym.getTargetFlags());
1346 
1347   // Let's keep stubs ordered by ascending address.
1348   std::sort(Entry.begin(), Entry.end(),
1349             [](const MemoryRegionInfo &L, const MemoryRegionInfo &R) {
1350               return L.getTargetAddress() < R.getTargetAddress();
1351             });
1352 
1353   return Error::success();
1354 }
1355 
1356 Expected<Session::FileInfo &> Session::findFileInfo(StringRef FileName) {
1357   auto FileInfoItr = FileInfos.find(FileName);
1358   if (FileInfoItr == FileInfos.end())
1359     return make_error<StringError>("file \"" + FileName + "\" not recognized",
1360                                    inconvertibleErrorCode());
1361   return FileInfoItr->second;
1362 }
1363 
1364 Expected<Session::MemoryRegionInfo &>
1365 Session::findSectionInfo(StringRef FileName, StringRef SectionName) {
1366   auto FI = findFileInfo(FileName);
1367   if (!FI)
1368     return FI.takeError();
1369   auto SecInfoItr = FI->SectionInfos.find(SectionName);
1370   if (SecInfoItr == FI->SectionInfos.end())
1371     return make_error<StringError>("no section \"" + SectionName +
1372                                        "\" registered for file \"" + FileName +
1373                                        "\"",
1374                                    inconvertibleErrorCode());
1375   return SecInfoItr->second;
1376 }
1377 
1378 class MemoryMatcher {
1379 public:
1380   MemoryMatcher(ArrayRef<char> Content)
1381       : Pos(Content.data()), End(Pos + Content.size()) {}
1382 
1383   template <typename MaskType> bool matchMask(MaskType Mask) {
1384     if (Mask == (Mask & *reinterpret_cast<const MaskType *>(Pos))) {
1385       Pos += sizeof(MaskType);
1386       return true;
1387     }
1388     return false;
1389   }
1390 
1391   template <typename ValueType> bool matchEqual(ValueType Value) {
1392     if (Value == *reinterpret_cast<const ValueType *>(Pos)) {
1393       Pos += sizeof(ValueType);
1394       return true;
1395     }
1396     return false;
1397   }
1398 
1399   bool done() const { return Pos == End; }
1400 
1401 private:
1402   const char *Pos;
1403   const char *End;
1404 };
1405 
1406 static StringRef detectStubKind(const Session::MemoryRegionInfo &Stub) {
1407   using namespace support::endian;
1408   auto Armv7MovWTle = byte_swap<uint32_t, endianness::little>(0xe300c000);
1409   auto Armv7BxR12le = byte_swap<uint32_t, endianness::little>(0xe12fff1c);
1410   auto Thumbv7MovWTle = byte_swap<uint32_t, endianness::little>(0x0c00f240);
1411   auto Thumbv7BxR12le = byte_swap<uint16_t, endianness::little>(0x4760);
1412 
1413   MemoryMatcher M(Stub.getContent());
1414   if (M.matchMask(Thumbv7MovWTle)) {
1415     if (M.matchMask(Thumbv7MovWTle))
1416       if (M.matchEqual(Thumbv7BxR12le))
1417         if (M.done())
1418           return "thumbv7_abs_le";
1419   } else if (M.matchMask(Armv7MovWTle)) {
1420     if (M.matchMask(Armv7MovWTle))
1421       if (M.matchEqual(Armv7BxR12le))
1422         if (M.done())
1423           return "armv7_abs_le";
1424   }
1425   return "";
1426 }
1427 
1428 Expected<Session::MemoryRegionInfo &>
1429 Session::findStubInfo(StringRef FileName, StringRef TargetName,
1430                       StringRef KindNameFilter) {
1431   auto FI = findFileInfo(FileName);
1432   if (!FI)
1433     return FI.takeError();
1434   auto StubInfoItr = FI->StubInfos.find(TargetName);
1435   if (StubInfoItr == FI->StubInfos.end())
1436     return make_error<StringError>("no stub for \"" + TargetName +
1437                                        "\" registered for file \"" + FileName +
1438                                        "\"",
1439                                    inconvertibleErrorCode());
1440   auto &StubsForTarget = StubInfoItr->second;
1441   assert(!StubsForTarget.empty() && "At least 1 stub in each entry");
1442   if (KindNameFilter.empty() && StubsForTarget.size() == 1)
1443     return StubsForTarget[0]; // Regular single-stub match
1444 
1445   std::string KindsStr;
1446   SmallVector<MemoryRegionInfo *, 1> Matches;
1447   Regex KindNameMatcher(KindNameFilter.empty() ? ".*" : KindNameFilter);
1448   for (MemoryRegionInfo &Stub : StubsForTarget) {
1449     StringRef Kind = detectStubKind(Stub);
1450     if (KindNameMatcher.match(Kind))
1451       Matches.push_back(&Stub);
1452     KindsStr += "\"" + (Kind.empty() ? "<unknown>" : Kind.str()) + "\", ";
1453   }
1454   if (Matches.empty())
1455     return make_error<StringError>(
1456         "\"" + TargetName + "\" has " + Twine(StubsForTarget.size()) +
1457             " stubs in file \"" + FileName +
1458             "\", but none of them matches the stub-kind filter \"" +
1459             KindNameFilter + "\" (all encountered kinds are " +
1460             StringRef(KindsStr.data(), KindsStr.size() - 2) + ").",
1461         inconvertibleErrorCode());
1462   if (Matches.size() > 1)
1463     return make_error<StringError>(
1464         "\"" + TargetName + "\" has " + Twine(Matches.size()) +
1465             " candidate stubs in file \"" + FileName +
1466             "\". Please refine stub-kind filter \"" + KindNameFilter +
1467             "\" for disambiguation (encountered kinds are " +
1468             StringRef(KindsStr.data(), KindsStr.size() - 2) + ").",
1469         inconvertibleErrorCode());
1470 
1471   return *Matches[0];
1472 }
1473 
1474 Expected<Session::MemoryRegionInfo &>
1475 Session::findGOTEntryInfo(StringRef FileName, StringRef TargetName) {
1476   auto FI = findFileInfo(FileName);
1477   if (!FI)
1478     return FI.takeError();
1479   auto GOTInfoItr = FI->GOTEntryInfos.find(TargetName);
1480   if (GOTInfoItr == FI->GOTEntryInfos.end())
1481     return make_error<StringError>("no GOT entry for \"" + TargetName +
1482                                        "\" registered for file \"" + FileName +
1483                                        "\"",
1484                                    inconvertibleErrorCode());
1485   return GOTInfoItr->second;
1486 }
1487 
1488 bool Session::isSymbolRegistered(const orc::SymbolStringPtr &SymbolName) {
1489   return SymbolInfos.count(SymbolName);
1490 }
1491 
1492 Expected<Session::MemoryRegionInfo &>
1493 Session::findSymbolInfo(const orc::SymbolStringPtr &SymbolName,
1494                         Twine ErrorMsgStem) {
1495   auto SymInfoItr = SymbolInfos.find(SymbolName);
1496   if (SymInfoItr == SymbolInfos.end())
1497     return make_error<StringError>(ErrorMsgStem + ": symbol " + *SymbolName +
1498                                        " not found",
1499                                    inconvertibleErrorCode());
1500   return SymInfoItr->second;
1501 }
1502 
1503 } // end namespace llvm
1504 
1505 static std::pair<Triple, SubtargetFeatures> getFirstFileTripleAndFeatures() {
1506   static std::pair<Triple, SubtargetFeatures> FirstTTAndFeatures = []() {
1507     assert(!InputFiles.empty() && "InputFiles can not be empty");
1508 
1509     if (!OverrideTriple.empty()) {
1510       LLVM_DEBUG({
1511         dbgs() << "Triple from -triple override: " << OverrideTriple << "\n";
1512       });
1513       return std::make_pair(Triple(OverrideTriple), SubtargetFeatures());
1514     }
1515 
1516     for (auto InputFile : InputFiles) {
1517       auto ObjBuffer = ExitOnErr(getFile(InputFile));
1518       file_magic Magic = identify_magic(ObjBuffer->getBuffer());
1519       switch (Magic) {
1520       case file_magic::coff_object:
1521       case file_magic::elf_relocatable:
1522       case file_magic::macho_object: {
1523         auto Obj = ExitOnErr(
1524             object::ObjectFile::createObjectFile(ObjBuffer->getMemBufferRef()));
1525         Triple TT = Obj->makeTriple();
1526         if (Magic == file_magic::coff_object) {
1527           // TODO: Move this to makeTriple() if possible.
1528           TT.setObjectFormat(Triple::COFF);
1529           TT.setOS(Triple::OSType::Win32);
1530         }
1531         SubtargetFeatures Features;
1532         if (auto ObjFeatures = Obj->getFeatures())
1533           Features = std::move(*ObjFeatures);
1534 
1535         LLVM_DEBUG({
1536           dbgs() << "Triple from " << InputFile << ": " << TT.str() << "\n";
1537         });
1538         return std::make_pair(TT, Features);
1539       }
1540       default:
1541         break;
1542       }
1543     }
1544 
1545     // If no plain object file inputs exist to pin down the triple then detect
1546     // the host triple and default to that.
1547     auto JTMB = ExitOnErr(JITTargetMachineBuilder::detectHost());
1548     LLVM_DEBUG({
1549       dbgs() << "Triple from host-detection: " << JTMB.getTargetTriple().str()
1550              << "\n";
1551     });
1552     return std::make_pair(JTMB.getTargetTriple(), JTMB.getFeatures());
1553   }();
1554 
1555   return FirstTTAndFeatures;
1556 }
1557 
1558 static Error sanitizeArguments(const Triple &TT, const char *ArgV0) {
1559 
1560   // -noexec and --args should not be used together.
1561   if (NoExec && !InputArgv.empty())
1562     errs() << "Warning: --args passed to -noexec run will be ignored.\n";
1563 
1564   // Set the entry point name if not specified.
1565   if (EntryPointName.empty())
1566     EntryPointName = TT.getObjectFormat() == Triple::MachO ? "_main" : "main";
1567 
1568   // Disable debugger support by default in noexec tests.
1569   if (DebuggerSupport.getNumOccurrences() == 0 && NoExec)
1570     DebuggerSupport = false;
1571 
1572   if (!OrcRuntime.empty() && NoProcessSymbols)
1573     return make_error<StringError>("-orc-runtime requires process symbols",
1574                                    inconvertibleErrorCode());
1575 
1576   // If -slab-allocate is passed, check that we're not trying to use it in
1577   // -oop-executor or -oop-executor-connect mode.
1578   //
1579   // FIXME: Remove once we enable remote slab allocation.
1580   if (SlabAllocateSizeString != "") {
1581     if (OutOfProcessExecutor.getNumOccurrences() ||
1582         OutOfProcessExecutorConnect.getNumOccurrences())
1583       return make_error<StringError>(
1584           "-slab-allocate cannot be used with -oop-executor or "
1585           "-oop-executor-connect",
1586           inconvertibleErrorCode());
1587   }
1588 
1589   // If -slab-address is passed, require -slab-allocate and -noexec
1590   if (SlabAddress != ~0ULL) {
1591     if (SlabAllocateSizeString == "" || !NoExec)
1592       return make_error<StringError>(
1593           "-slab-address requires -slab-allocate and -noexec",
1594           inconvertibleErrorCode());
1595 
1596     if (SlabPageSize == 0)
1597       errs() << "Warning: -slab-address used without -slab-page-size.\n";
1598   }
1599 
1600   if (SlabPageSize != 0) {
1601     // -slab-page-size requires slab alloc.
1602     if (SlabAllocateSizeString == "")
1603       return make_error<StringError>("-slab-page-size requires -slab-allocate",
1604                                      inconvertibleErrorCode());
1605 
1606     // Check -slab-page-size / -noexec interactions.
1607     if (!NoExec) {
1608       if (auto RealPageSize = sys::Process::getPageSize()) {
1609         if (SlabPageSize % *RealPageSize)
1610           return make_error<StringError>(
1611               "-slab-page-size must be a multiple of real page size for exec "
1612               "tests (did you mean to use -noexec ?)\n",
1613               inconvertibleErrorCode());
1614       } else {
1615         errs() << "Could not retrieve process page size:\n";
1616         logAllUnhandledErrors(RealPageSize.takeError(), errs(), "");
1617         errs() << "Executing with slab page size = "
1618                << formatv("{0:x}", SlabPageSize) << ".\n"
1619                << "Tool may crash if " << formatv("{0:x}", SlabPageSize)
1620                << " is not a multiple of the real process page size.\n"
1621                << "(did you mean to use -noexec ?)";
1622       }
1623     }
1624   }
1625 
1626   // Only one of -oop-executor and -oop-executor-connect can be used.
1627   if (!!OutOfProcessExecutor.getNumOccurrences() &&
1628       !!OutOfProcessExecutorConnect.getNumOccurrences())
1629     return make_error<StringError>(
1630         "Only one of -" + OutOfProcessExecutor.ArgStr + " and -" +
1631             OutOfProcessExecutorConnect.ArgStr + " can be specified",
1632         inconvertibleErrorCode());
1633 
1634   // If -oop-executor was used but no value was specified then use a sensible
1635   // default.
1636   if (!!OutOfProcessExecutor.getNumOccurrences() &&
1637       OutOfProcessExecutor.empty()) {
1638     SmallString<256> OOPExecutorPath(sys::fs::getMainExecutable(
1639         ArgV0, reinterpret_cast<void *>(&sanitizeArguments)));
1640     sys::path::remove_filename(OOPExecutorPath);
1641     sys::path::append(OOPExecutorPath, "llvm-jitlink-executor");
1642     OutOfProcessExecutor = OOPExecutorPath.str().str();
1643   }
1644 
1645   if (lazyLinkingRequested() && !TestHarnesses.empty())
1646     return make_error<StringError>(
1647         "Lazy linking cannot be used with -harness mode",
1648         inconvertibleErrorCode());
1649 
1650   return Error::success();
1651 }
1652 
1653 static void addPhonyExternalsGenerator(Session &S) {
1654   S.MainJD->addGenerator(std::make_unique<PhonyExternalsGenerator>());
1655 }
1656 
1657 static Error createJITDylibs(Session &S,
1658                              std::map<unsigned, JITDylib *> &IdxToJD) {
1659   // First, set up JITDylibs.
1660   LLVM_DEBUG(dbgs() << "Creating JITDylibs...\n");
1661   {
1662     // Create a "main" JITLinkDylib.
1663     IdxToJD[0] = S.MainJD;
1664     S.JDSearchOrder.push_back({S.MainJD, JITDylibLookupFlags::MatchAllSymbols});
1665     LLVM_DEBUG(dbgs() << "  0: " << S.MainJD->getName() << "\n");
1666 
1667     // Add any extra JITDylibs from the command line.
1668     for (auto JDItr = JITDylibs.begin(), JDEnd = JITDylibs.end();
1669          JDItr != JDEnd; ++JDItr) {
1670       auto JD = S.ES.createJITDylib(*JDItr);
1671       if (!JD)
1672         return JD.takeError();
1673       unsigned JDIdx = JITDylibs.getPosition(JDItr - JITDylibs.begin());
1674       IdxToJD[JDIdx] = &*JD;
1675       S.JDSearchOrder.push_back({&*JD, JITDylibLookupFlags::MatchAllSymbols});
1676       LLVM_DEBUG(dbgs() << "  " << JDIdx << ": " << JD->getName() << "\n");
1677     }
1678   }
1679 
1680   if (S.PlatformJD)
1681     S.JDSearchOrder.push_back(
1682         {S.PlatformJD, JITDylibLookupFlags::MatchExportedSymbolsOnly});
1683   if (S.ProcessSymsJD)
1684     S.JDSearchOrder.push_back(
1685         {S.ProcessSymsJD, JITDylibLookupFlags::MatchExportedSymbolsOnly});
1686 
1687   LLVM_DEBUG({
1688     dbgs() << "Dylib search order is [ ";
1689     for (auto &KV : S.JDSearchOrder)
1690       dbgs() << KV.first->getName() << " ";
1691     dbgs() << "]\n";
1692   });
1693 
1694   return Error::success();
1695 }
1696 
1697 static Error addAbsoluteSymbols(Session &S,
1698                                 const std::map<unsigned, JITDylib *> &IdxToJD) {
1699   // Define absolute symbols.
1700   LLVM_DEBUG(dbgs() << "Defining absolute symbols...\n");
1701   for (auto AbsDefItr = AbsoluteDefs.begin(), AbsDefEnd = AbsoluteDefs.end();
1702        AbsDefItr != AbsDefEnd; ++AbsDefItr) {
1703     unsigned AbsDefArgIdx =
1704       AbsoluteDefs.getPosition(AbsDefItr - AbsoluteDefs.begin());
1705     auto &JD = *std::prev(IdxToJD.lower_bound(AbsDefArgIdx))->second;
1706 
1707     StringRef AbsDefStmt = *AbsDefItr;
1708     size_t EqIdx = AbsDefStmt.find_first_of('=');
1709     if (EqIdx == StringRef::npos)
1710       return make_error<StringError>("Invalid absolute define \"" + AbsDefStmt +
1711                                      "\". Syntax: <name>=<addr>",
1712                                      inconvertibleErrorCode());
1713     StringRef Name = AbsDefStmt.substr(0, EqIdx).trim();
1714     StringRef AddrStr = AbsDefStmt.substr(EqIdx + 1).trim();
1715 
1716     uint64_t Addr;
1717     if (AddrStr.getAsInteger(0, Addr))
1718       return make_error<StringError>("Invalid address expression \"" + AddrStr +
1719                                          "\" in absolute symbol definition \"" +
1720                                          AbsDefStmt + "\"",
1721                                      inconvertibleErrorCode());
1722     ExecutorSymbolDef AbsDef(ExecutorAddr(Addr), JITSymbolFlags::Exported);
1723     auto InternedName = S.ES.intern(Name);
1724     if (auto Err = JD.define(absoluteSymbols({{InternedName, AbsDef}})))
1725       return Err;
1726 
1727     // Register the absolute symbol with the session symbol infos.
1728     S.SymbolInfos[InternedName] = {ArrayRef<char>(), Addr,
1729                                    AbsDef.getFlags().getTargetFlags()};
1730   }
1731 
1732   return Error::success();
1733 }
1734 
1735 static Error addAliases(Session &S,
1736                         const std::map<unsigned, JITDylib *> &IdxToJD) {
1737   // Define absolute symbols.
1738   LLVM_DEBUG(dbgs() << "Defining aliases...\n");
1739 
1740   DenseMap<std::pair<JITDylib *, JITDylib *>, SymbolAliasMap> Reexports;
1741   for (auto AliasItr = Aliases.begin(), AliasEnd = Aliases.end();
1742        AliasItr != AliasEnd; ++AliasItr) {
1743 
1744     auto BadExpr = [&]() {
1745       return make_error<StringError>(
1746           "Invalid alias definition \"" + *AliasItr +
1747               "\". Syntax: [<dst-jd>:]<alias>=[<src-jd>:]<aliasee>",
1748           inconvertibleErrorCode());
1749     };
1750 
1751     auto GetJD = [&](StringRef JDName) -> Expected<JITDylib *> {
1752       if (JDName.empty()) {
1753         unsigned AliasArgIdx = Aliases.getPosition(AliasItr - Aliases.begin());
1754         return std::prev(IdxToJD.lower_bound(AliasArgIdx))->second;
1755       }
1756 
1757       auto *JD = S.ES.getJITDylibByName(JDName);
1758       if (!JD)
1759         return make_error<StringError>(StringRef("In alias definition \"") +
1760                                            *AliasItr + "\" no dylib named " +
1761                                            JDName,
1762                                        inconvertibleErrorCode());
1763 
1764       return JD;
1765     };
1766 
1767     {
1768       // First split on '=' to get alias and aliasee.
1769       StringRef AliasStmt = *AliasItr;
1770       auto [AliasExpr, AliaseeExpr] = AliasStmt.split('=');
1771       if (AliaseeExpr.empty())
1772         return BadExpr();
1773 
1774       auto [AliasJDName, Alias] = AliasExpr.split(':');
1775       if (Alias.empty())
1776         std::swap(AliasJDName, Alias);
1777 
1778       auto AliasJD = GetJD(AliasJDName);
1779       if (!AliasJD)
1780         return AliasJD.takeError();
1781 
1782       auto [AliaseeJDName, Aliasee] = AliaseeExpr.split(':');
1783       if (Aliasee.empty())
1784         std::swap(AliaseeJDName, Aliasee);
1785 
1786       if (AliaseeJDName.empty() && !AliasJDName.empty())
1787         AliaseeJDName = AliasJDName;
1788       auto AliaseeJD = GetJD(AliaseeJDName);
1789       if (!AliaseeJD)
1790         return AliaseeJD.takeError();
1791 
1792       Reexports[{*AliasJD, *AliaseeJD}][S.ES.intern(Alias)] = {
1793           S.ES.intern(Aliasee), JITSymbolFlags::Exported};
1794     }
1795   }
1796 
1797   for (auto &[JDs, AliasMap] : Reexports) {
1798     auto [DstJD, SrcJD] = JDs;
1799     if (auto Err = DstJD->define(reexports(*SrcJD, std::move(AliasMap))))
1800       return Err;
1801   }
1802 
1803   return Error::success();
1804 }
1805 
1806 static Error addSectCreates(Session &S,
1807                             const std::map<unsigned, JITDylib *> &IdxToJD) {
1808   for (auto SCItr = SectCreate.begin(), SCEnd = SectCreate.end();
1809        SCItr != SCEnd; ++SCItr) {
1810 
1811     unsigned SCArgIdx = SectCreate.getPosition(SCItr - SectCreate.begin());
1812     auto &JD = *std::prev(IdxToJD.lower_bound(SCArgIdx))->second;
1813 
1814     StringRef SCArg(*SCItr);
1815 
1816     auto [SectAndFileName, ExtraSymbolsString] = SCArg.rsplit('@');
1817     auto [SectName, FileName] = SectAndFileName.rsplit(',');
1818     if (SectName.empty())
1819       return make_error<StringError>("In -sectcreate=" + SCArg +
1820                                          ", filename component cannot be empty",
1821                                      inconvertibleErrorCode());
1822     if (FileName.empty())
1823       return make_error<StringError>("In -sectcreate=" + SCArg +
1824                                          ", filename component cannot be empty",
1825                                      inconvertibleErrorCode());
1826 
1827     auto Content = getFile(FileName);
1828     if (!Content)
1829       return Content.takeError();
1830 
1831     SectCreateMaterializationUnit::ExtraSymbolsMap ExtraSymbols;
1832     while (!ExtraSymbolsString.empty()) {
1833       StringRef NextSymPair;
1834       std::tie(NextSymPair, ExtraSymbolsString) = ExtraSymbolsString.split(',');
1835 
1836       auto [Sym, OffsetString] = NextSymPair.split('=');
1837       size_t Offset;
1838 
1839       if (OffsetString.getAsInteger(0, Offset))
1840         return make_error<StringError>("In -sectcreate=" + SCArg + ", " +
1841                                            OffsetString +
1842                                            " is not a valid integer",
1843                                        inconvertibleErrorCode());
1844 
1845       ExtraSymbols[S.ES.intern(Sym)] = {JITSymbolFlags::Exported, Offset};
1846     }
1847 
1848     if (auto Err = JD.define(std::make_unique<SectCreateMaterializationUnit>(
1849             S.ObjLayer, SectName.str(), MemProt::Read, 16, std::move(*Content),
1850             std::move(ExtraSymbols))))
1851       return Err;
1852   }
1853 
1854   return Error::success();
1855 }
1856 
1857 static Error addTestHarnesses(Session &S) {
1858   LLVM_DEBUG(dbgs() << "Adding test harness objects...\n");
1859   for (auto HarnessFile : TestHarnesses) {
1860     LLVM_DEBUG(dbgs() << "  " << HarnessFile << "\n");
1861     auto Linkable = loadLinkableFile(HarnessFile, S.ES.getTargetTriple(),
1862                                      LoadArchives::Never);
1863     if (!Linkable)
1864       return Linkable.takeError();
1865     if (auto Err = S.ObjLayer.add(*S.MainJD, std::move(Linkable->first)))
1866       return Err;
1867   }
1868   return Error::success();
1869 }
1870 
1871 static Error addObjects(Session &S,
1872                         const std::map<unsigned, JITDylib *> &IdxToJD,
1873                         const DenseSet<unsigned> &LazyLinkIdxs) {
1874 
1875   // Load each object into the corresponding JITDylib..
1876   LLVM_DEBUG(dbgs() << "Adding objects...\n");
1877   for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end();
1878        InputFileItr != InputFileEnd; ++InputFileItr) {
1879     unsigned InputFileArgIdx =
1880         InputFiles.getPosition(InputFileItr - InputFiles.begin());
1881     const std::string &InputFile = *InputFileItr;
1882     if (StringRef(InputFile).ends_with(".a") ||
1883         StringRef(InputFile).ends_with(".lib"))
1884       continue;
1885     auto &JD = *std::prev(IdxToJD.lower_bound(InputFileArgIdx))->second;
1886     bool AddLazy = LazyLinkIdxs.count(InputFileArgIdx);
1887     LLVM_DEBUG(dbgs() << "  " << InputFileArgIdx << ": \"" << InputFile << "\" "
1888                       << (AddLazy ? " (lazy-linked)" : "") << " to "
1889                       << JD.getName() << "\n";);
1890     auto ObjBuffer = loadLinkableFile(InputFile, S.ES.getTargetTriple(),
1891                                       LoadArchives::Never);
1892     if (!ObjBuffer)
1893       return ObjBuffer.takeError();
1894 
1895     if (S.HarnessFiles.empty()) {
1896       if (auto Err =
1897               S.getLinkLayer(AddLazy).add(JD, std::move(ObjBuffer->first)))
1898         return Err;
1899     } else {
1900       // We're in -harness mode. Use a custom interface for this
1901       // test object.
1902       auto ObjInterface =
1903           getTestObjectFileInterface(S, ObjBuffer->first->getMemBufferRef());
1904       if (!ObjInterface)
1905         return ObjInterface.takeError();
1906 
1907       if (auto Err = S.ObjLayer.add(JD, std::move(ObjBuffer->first),
1908                                     std::move(*ObjInterface)))
1909         return Err;
1910     }
1911   }
1912 
1913   return Error::success();
1914 }
1915 
1916 static Expected<MaterializationUnit::Interface>
1917 getObjectFileInterfaceHidden(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
1918   auto I = getObjectFileInterface(ES, ObjBuffer);
1919   if (I) {
1920     for (auto &KV : I->SymbolFlags)
1921       KV.second &= ~JITSymbolFlags::Exported;
1922   }
1923   return I;
1924 }
1925 
1926 static SmallVector<StringRef, 5> getSearchPathsFromEnvVar(Session &S) {
1927   // FIXME: Handle EPC environment.
1928   SmallVector<StringRef, 5> PathVec;
1929   auto TT = S.ES.getTargetTriple();
1930   if (TT.isOSBinFormatCOFF())
1931     StringRef(getenv("PATH")).split(PathVec, ";");
1932   else if (TT.isOSBinFormatELF())
1933     StringRef(getenv("LD_LIBRARY_PATH")).split(PathVec, ":");
1934 
1935   return PathVec;
1936 }
1937 
1938 static Error addLibraries(Session &S,
1939                           const std::map<unsigned, JITDylib *> &IdxToJD,
1940                           const DenseSet<unsigned> &LazyLinkIdxs) {
1941 
1942   // 1. Collect search paths for each JITDylib.
1943   DenseMap<const JITDylib *, SmallVector<StringRef, 2>> JDSearchPaths;
1944 
1945   for (auto LSPItr = LibrarySearchPaths.begin(),
1946             LSPEnd = LibrarySearchPaths.end();
1947        LSPItr != LSPEnd; ++LSPItr) {
1948     unsigned LibrarySearchPathIdx =
1949         LibrarySearchPaths.getPosition(LSPItr - LibrarySearchPaths.begin());
1950     auto &JD = *std::prev(IdxToJD.lower_bound(LibrarySearchPathIdx))->second;
1951 
1952     StringRef LibrarySearchPath = *LSPItr;
1953     if (sys::fs::get_file_type(LibrarySearchPath) !=
1954         sys::fs::file_type::directory_file)
1955       return make_error<StringError>("While linking " + JD.getName() + ", -L" +
1956                                          LibrarySearchPath +
1957                                          " does not point to a directory",
1958                                      inconvertibleErrorCode());
1959 
1960     JDSearchPaths[&JD].push_back(*LSPItr);
1961   }
1962 
1963   LLVM_DEBUG({
1964     if (!JDSearchPaths.empty())
1965       dbgs() << "Search paths:\n";
1966     for (auto &KV : JDSearchPaths) {
1967       dbgs() << "  " << KV.first->getName() << ": [";
1968       for (auto &LibSearchPath : KV.second)
1969         dbgs() << " \"" << LibSearchPath << "\"";
1970       dbgs() << " ]\n";
1971     }
1972   });
1973 
1974   // 2. Collect library loads
1975   struct LibraryLoad {
1976     std::string LibName;
1977     bool IsPath = false;
1978     unsigned Position;
1979     StringRef *CandidateExtensions;
1980     enum { Standard, Hidden } Modifier;
1981   };
1982 
1983   // Queue to load library as in the order as it appears in the argument list.
1984   std::deque<LibraryLoad> LibraryLoadQueue;
1985   // Add archive files from the inputs to LibraryLoads.
1986   for (auto InputFileItr = InputFiles.begin(), InputFileEnd = InputFiles.end();
1987        InputFileItr != InputFileEnd; ++InputFileItr) {
1988     StringRef InputFile = *InputFileItr;
1989     if (!InputFile.ends_with(".a") && !InputFile.ends_with(".lib"))
1990       continue;
1991     LibraryLoad LL;
1992     LL.LibName = InputFile.str();
1993     LL.IsPath = true;
1994     LL.Position = InputFiles.getPosition(InputFileItr - InputFiles.begin());
1995     LL.CandidateExtensions = nullptr;
1996     LL.Modifier = LibraryLoad::Standard;
1997     LibraryLoadQueue.push_back(std::move(LL));
1998   }
1999 
2000   // Add -load_hidden arguments to LibraryLoads.
2001   for (auto LibItr = LoadHidden.begin(), LibEnd = LoadHidden.end();
2002        LibItr != LibEnd; ++LibItr) {
2003     LibraryLoad LL;
2004     LL.LibName = *LibItr;
2005     LL.IsPath = true;
2006     LL.Position = LoadHidden.getPosition(LibItr - LoadHidden.begin());
2007     LL.CandidateExtensions = nullptr;
2008     LL.Modifier = LibraryLoad::Hidden;
2009     LibraryLoadQueue.push_back(std::move(LL));
2010   }
2011   StringRef StandardExtensions[] = {".so", ".dylib", ".dll", ".a", ".lib"};
2012   StringRef DynLibExtensionsOnly[] = {".so", ".dylib", ".dll"};
2013   StringRef ArchiveExtensionsOnly[] = {".a", ".lib"};
2014 
2015   // Add -lx arguments to LibraryLoads.
2016   for (auto LibItr = Libraries.begin(), LibEnd = Libraries.end();
2017        LibItr != LibEnd; ++LibItr) {
2018     LibraryLoad LL;
2019     LL.LibName = *LibItr;
2020     LL.Position = Libraries.getPosition(LibItr - Libraries.begin());
2021     LL.CandidateExtensions = StandardExtensions;
2022     LL.Modifier = LibraryLoad::Standard;
2023     LibraryLoadQueue.push_back(std::move(LL));
2024   }
2025 
2026   // Add -hidden-lx arguments to LibraryLoads.
2027   for (auto LibHiddenItr = LibrariesHidden.begin(),
2028             LibHiddenEnd = LibrariesHidden.end();
2029        LibHiddenItr != LibHiddenEnd; ++LibHiddenItr) {
2030     LibraryLoad LL;
2031     LL.LibName = *LibHiddenItr;
2032     LL.Position =
2033         LibrariesHidden.getPosition(LibHiddenItr - LibrariesHidden.begin());
2034     LL.CandidateExtensions = ArchiveExtensionsOnly;
2035     LL.Modifier = LibraryLoad::Hidden;
2036     LibraryLoadQueue.push_back(std::move(LL));
2037   }
2038 
2039   // If there are any load-<modified> options then turn on flag overrides
2040   // to avoid flag mismatch errors.
2041   if (!LibrariesHidden.empty() || !LoadHidden.empty())
2042     S.ObjLayer.setOverrideObjectFlagsWithResponsibilityFlags(true);
2043 
2044   // Sort library loads by position in the argument list.
2045   llvm::sort(LibraryLoadQueue,
2046              [](const LibraryLoad &LHS, const LibraryLoad &RHS) {
2047                return LHS.Position < RHS.Position;
2048              });
2049 
2050   // 3. Process library loads.
2051   auto AddArchive = [&](JITDylib &JD, const char *Path, const LibraryLoad &LL)
2052       -> Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> {
2053     StaticLibraryDefinitionGenerator::GetObjectFileInterface
2054         GetObjFileInterface;
2055     switch (LL.Modifier) {
2056     case LibraryLoad::Standard:
2057       GetObjFileInterface = getObjectFileInterface;
2058       break;
2059     case LibraryLoad::Hidden:
2060       GetObjFileInterface = getObjectFileInterfaceHidden;
2061       break;
2062     }
2063 
2064     auto &LinkLayer = S.getLinkLayer(LazyLinkIdxs.count(LL.Position));
2065 
2066     StaticLibraryDefinitionGenerator::VisitMembersFunction VisitMembers;
2067     if (AllLoad)
2068       VisitMembers = StaticLibraryDefinitionGenerator::loadAllObjectFileMembers(
2069           LinkLayer, JD);
2070     else if (S.ES.getTargetTriple().isOSBinFormatMachO() && ForceLoadObjC)
2071       VisitMembers = ForceLoadMachOArchiveMembers(LinkLayer, JD, true);
2072 
2073     auto G = StaticLibraryDefinitionGenerator::Load(
2074         LinkLayer, Path, std::move(VisitMembers),
2075         std::move(GetObjFileInterface));
2076     if (!G)
2077       return G.takeError();
2078 
2079     // Push additional dynamic libraries to search.
2080     // Note that this mechanism only happens in COFF.
2081     for (auto FileName : (*G)->getImportedDynamicLibraries()) {
2082       LibraryLoad NewLL;
2083       auto FileNameRef = StringRef(FileName);
2084       if (!FileNameRef.ends_with_insensitive(".dll"))
2085         return make_error<StringError>(
2086             "COFF Imported library not ending with dll extension?",
2087             inconvertibleErrorCode());
2088       NewLL.LibName = FileNameRef.drop_back(strlen(".dll")).str();
2089       NewLL.Position = LL.Position;
2090       NewLL.CandidateExtensions = DynLibExtensionsOnly;
2091       NewLL.Modifier = LibraryLoad::Standard;
2092       LibraryLoadQueue.push_front(std::move(NewLL));
2093     }
2094     return G;
2095   };
2096 
2097   SmallVector<StringRef, 5> SystemSearchPaths;
2098   if (SearchSystemLibrary.getValue())
2099     SystemSearchPaths = getSearchPathsFromEnvVar(S);
2100   while (!LibraryLoadQueue.empty()) {
2101     bool LibFound = false;
2102     auto LL = LibraryLoadQueue.front();
2103     LibraryLoadQueue.pop_front();
2104     auto &JD = *std::prev(IdxToJD.lower_bound(LL.Position))->second;
2105 
2106     // If this is the name of a JITDylib then link against that.
2107     if (auto *LJD = S.ES.getJITDylibByName(LL.LibName)) {
2108       JD.addToLinkOrder(*LJD);
2109       continue;
2110     }
2111 
2112     if (LL.IsPath) {
2113       auto G = AddArchive(JD, LL.LibName.c_str(), LL);
2114       if (!G)
2115         return createFileError(LL.LibName, G.takeError());
2116       JD.addGenerator(std::move(*G));
2117       LLVM_DEBUG({
2118         dbgs() << "Adding generator for static library " << LL.LibName << " to "
2119                << JD.getName() << "\n";
2120       });
2121       continue;
2122     }
2123 
2124     // Otherwise look through the search paths.
2125     auto CurJDSearchPaths = JDSearchPaths[&JD];
2126     for (StringRef SearchPath :
2127          concat<StringRef>(CurJDSearchPaths, SystemSearchPaths)) {
2128       for (const char *LibExt : {".dylib", ".so", ".dll", ".a", ".lib"}) {
2129         SmallVector<char, 256> LibPath;
2130         LibPath.reserve(SearchPath.size() + strlen("lib") + LL.LibName.size() +
2131                         strlen(LibExt) + 2); // +2 for pathsep, null term.
2132         llvm::copy(SearchPath, std::back_inserter(LibPath));
2133         if (StringRef(LibExt) != ".lib" && StringRef(LibExt) != ".dll")
2134           sys::path::append(LibPath, "lib" + LL.LibName + LibExt);
2135         else
2136           sys::path::append(LibPath, LL.LibName + LibExt);
2137         LibPath.push_back('\0');
2138 
2139         // Skip missing or non-regular paths.
2140         if (sys::fs::get_file_type(LibPath.data()) !=
2141             sys::fs::file_type::regular_file) {
2142           continue;
2143         }
2144 
2145         file_magic Magic;
2146         if (auto EC = identify_magic(LibPath, Magic)) {
2147           // If there was an error loading the file then skip it.
2148           LLVM_DEBUG({
2149             dbgs() << "Library search found \"" << LibPath
2150                    << "\", but could not identify file type (" << EC.message()
2151                    << "). Skipping.\n";
2152           });
2153           continue;
2154         }
2155 
2156         // We identified the magic. Assume that we can load it -- we'll reset
2157         // in the default case.
2158         LibFound = true;
2159         switch (Magic) {
2160         case file_magic::pecoff_executable:
2161         case file_magic::elf_shared_object:
2162         case file_magic::macho_dynamically_linked_shared_lib: {
2163           if (auto Err = S.loadAndLinkDynamicLibrary(JD, LibPath.data()))
2164             return Err;
2165           break;
2166         }
2167         case file_magic::archive:
2168         case file_magic::macho_universal_binary: {
2169           auto G = AddArchive(JD, LibPath.data(), LL);
2170           if (!G)
2171             return G.takeError();
2172           JD.addGenerator(std::move(*G));
2173           LLVM_DEBUG({
2174             dbgs() << "Adding generator for static library " << LibPath.data()
2175                    << " to " << JD.getName() << "\n";
2176           });
2177           break;
2178         }
2179         default:
2180           // This file isn't a recognized library kind.
2181           LLVM_DEBUG({
2182             dbgs() << "Library search found \"" << LibPath
2183                    << "\", but file type is not supported. Skipping.\n";
2184           });
2185           LibFound = false;
2186           break;
2187         }
2188         if (LibFound)
2189           break;
2190       }
2191       if (LibFound)
2192         break;
2193     }
2194 
2195     if (!LibFound)
2196       return make_error<StringError>("While linking " + JD.getName() +
2197                                          ", could not find library for -l" +
2198                                          LL.LibName,
2199                                      inconvertibleErrorCode());
2200   }
2201 
2202   // Add platform and process symbols if available.
2203   for (auto &[Idx, JD] : IdxToJD) {
2204     if (S.PlatformJD)
2205       JD->addToLinkOrder(*S.PlatformJD);
2206     if (S.ProcessSymsJD)
2207       JD->addToLinkOrder(*S.ProcessSymsJD);
2208   }
2209 
2210   return Error::success();
2211 }
2212 
2213 static Error addSessionInputs(Session &S) {
2214   std::map<unsigned, JITDylib *> IdxToJD;
2215   DenseSet<unsigned> LazyLinkIdxs;
2216 
2217   for (auto LLItr = LazyLink.begin(), LLEnd = LazyLink.end(); LLItr != LLEnd;
2218        ++LLItr) {
2219     if (*LLItr)
2220       LazyLinkIdxs.insert(LazyLink.getPosition(LLItr - LazyLink.begin()) + 1);
2221   }
2222 
2223   if (auto Err = createJITDylibs(S, IdxToJD))
2224     return Err;
2225 
2226   if (auto Err = addAbsoluteSymbols(S, IdxToJD))
2227     return Err;
2228 
2229   if (auto Err = addAliases(S, IdxToJD))
2230     return Err;
2231 
2232   if (auto Err = addSectCreates(S, IdxToJD))
2233     return Err;
2234 
2235   if (!TestHarnesses.empty())
2236     if (auto Err = addTestHarnesses(S))
2237       return Err;
2238 
2239   if (auto Err = addObjects(S, IdxToJD, LazyLinkIdxs))
2240     return Err;
2241 
2242   if (auto Err = addLibraries(S, IdxToJD, LazyLinkIdxs))
2243     return Err;
2244 
2245   return Error::success();
2246 }
2247 
2248 namespace {
2249 struct TargetInfo {
2250   const Target *TheTarget;
2251   std::unique_ptr<MCSubtargetInfo> STI;
2252   std::unique_ptr<MCRegisterInfo> MRI;
2253   std::unique_ptr<MCAsmInfo> MAI;
2254   std::unique_ptr<MCContext> Ctx;
2255   std::unique_ptr<MCDisassembler> Disassembler;
2256   std::unique_ptr<MCInstrInfo> MII;
2257   std::unique_ptr<MCInstrAnalysis> MIA;
2258   std::unique_ptr<MCInstPrinter> InstPrinter;
2259 };
2260 } // anonymous namespace
2261 
2262 static TargetInfo
2263 getTargetInfo(const Triple &TT,
2264               const SubtargetFeatures &TF = SubtargetFeatures()) {
2265   auto TripleName = TT.str();
2266   std::string ErrorStr;
2267   const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, ErrorStr);
2268   if (!TheTarget)
2269     ExitOnErr(make_error<StringError>("Error accessing target '" + TripleName +
2270                                           "': " + ErrorStr,
2271                                       inconvertibleErrorCode()));
2272 
2273   std::unique_ptr<MCSubtargetInfo> STI(
2274       TheTarget->createMCSubtargetInfo(TripleName, "", TF.getString()));
2275   if (!STI)
2276     ExitOnErr(
2277         make_error<StringError>("Unable to create subtarget for " + TripleName,
2278                                 inconvertibleErrorCode()));
2279 
2280   std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName));
2281   if (!MRI)
2282     ExitOnErr(make_error<StringError>("Unable to create target register info "
2283                                       "for " +
2284                                           TripleName,
2285                                       inconvertibleErrorCode()));
2286 
2287   MCTargetOptions MCOptions;
2288   std::unique_ptr<MCAsmInfo> MAI(
2289       TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions));
2290   if (!MAI)
2291     ExitOnErr(make_error<StringError>("Unable to create target asm info " +
2292                                           TripleName,
2293                                       inconvertibleErrorCode()));
2294 
2295   auto Ctx = std::make_unique<MCContext>(Triple(TripleName), MAI.get(),
2296                                          MRI.get(), STI.get());
2297 
2298   std::unique_ptr<MCDisassembler> Disassembler(
2299       TheTarget->createMCDisassembler(*STI, *Ctx));
2300   if (!Disassembler)
2301     ExitOnErr(make_error<StringError>("Unable to create disassembler for " +
2302                                           TripleName,
2303                                       inconvertibleErrorCode()));
2304 
2305   std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo());
2306   if (!MII)
2307     ExitOnErr(make_error<StringError>("Unable to create instruction info for" +
2308                                           TripleName,
2309                                       inconvertibleErrorCode()));
2310 
2311   std::unique_ptr<MCInstrAnalysis> MIA(
2312       TheTarget->createMCInstrAnalysis(MII.get()));
2313   if (!MIA)
2314     ExitOnErr(make_error<StringError>(
2315         "Unable to create instruction analysis for" + TripleName,
2316         inconvertibleErrorCode()));
2317 
2318   std::unique_ptr<MCInstPrinter> InstPrinter(
2319       TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI));
2320   if (!InstPrinter)
2321     ExitOnErr(make_error<StringError>(
2322         "Unable to create instruction printer for" + TripleName,
2323         inconvertibleErrorCode()));
2324   return {TheTarget,      std::move(STI), std::move(MRI),
2325           std::move(MAI), std::move(Ctx), std::move(Disassembler),
2326           std::move(MII), std::move(MIA), std::move(InstPrinter)};
2327 }
2328 static Error runChecks(Session &S, Triple TT, SubtargetFeatures Features) {
2329   if (CheckFiles.empty())
2330     return Error::success();
2331 
2332   LLVM_DEBUG(dbgs() << "Running checks...\n");
2333 
2334   auto IsSymbolValid = [&S](StringRef Symbol) {
2335     auto InternedSymbol = S.ES.getSymbolStringPool()->intern(Symbol);
2336     return S.isSymbolRegistered(InternedSymbol);
2337   };
2338 
2339   auto GetSymbolInfo = [&S](StringRef Symbol) {
2340     auto InternedSymbol = S.ES.getSymbolStringPool()->intern(Symbol);
2341     return S.findSymbolInfo(InternedSymbol, "Can not get symbol info");
2342   };
2343 
2344   auto GetSectionInfo = [&S](StringRef FileName, StringRef SectionName) {
2345     return S.findSectionInfo(FileName, SectionName);
2346   };
2347 
2348   auto GetStubInfo = [&S](StringRef FileName, StringRef SectionName,
2349                           StringRef KindNameFilter) {
2350     return S.findStubInfo(FileName, SectionName, KindNameFilter);
2351   };
2352 
2353   auto GetGOTInfo = [&S](StringRef FileName, StringRef SectionName) {
2354     return S.findGOTEntryInfo(FileName, SectionName);
2355   };
2356 
2357   RuntimeDyldChecker Checker(
2358       IsSymbolValid, GetSymbolInfo, GetSectionInfo, GetStubInfo, GetGOTInfo,
2359       S.ES.getTargetTriple().isLittleEndian() ? llvm::endianness::little
2360                                               : llvm::endianness::big,
2361       TT, StringRef(), Features, dbgs());
2362 
2363   std::string CheckLineStart = "# " + CheckName + ":";
2364   for (auto &CheckFile : CheckFiles) {
2365     auto CheckerFileBuf = ExitOnErr(getFile(CheckFile));
2366     if (!Checker.checkAllRulesInBuffer(CheckLineStart, &*CheckerFileBuf))
2367       ExitOnErr(make_error<StringError>(
2368           "Some checks in " + CheckFile + " failed", inconvertibleErrorCode()));
2369   }
2370 
2371   return Error::success();
2372 }
2373 
2374 static Error addSelfRelocations(LinkGraph &G) {
2375   auto TI = getTargetInfo(G.getTargetTriple());
2376   for (auto *Sym : G.defined_symbols())
2377     if (Sym->isCallable())
2378       if (auto Err = addFunctionPointerRelocationsToCurrentSymbol(
2379               *Sym, G, *TI.Disassembler, *TI.MIA))
2380         return Err;
2381   return Error::success();
2382 }
2383 
2384 static Expected<ExecutorSymbolDef> getMainEntryPoint(Session &S) {
2385   return S.ES.lookup(S.JDSearchOrder, S.ES.intern(EntryPointName));
2386 }
2387 
2388 static Expected<ExecutorSymbolDef> getOrcRuntimeEntryPoint(Session &S) {
2389   std::string RuntimeEntryPoint = "__orc_rt_run_program_wrapper";
2390   if (S.ES.getTargetTriple().getObjectFormat() == Triple::MachO)
2391     RuntimeEntryPoint = '_' + RuntimeEntryPoint;
2392   return S.ES.lookup(S.JDSearchOrder, S.ES.intern(RuntimeEntryPoint));
2393 }
2394 
2395 static Expected<ExecutorSymbolDef> getEntryPoint(Session &S) {
2396   ExecutorSymbolDef EntryPoint;
2397 
2398   // Find the entry-point function unconditionally, since we want to force
2399   // it to be materialized to collect stats.
2400   if (auto EP = getMainEntryPoint(S))
2401     EntryPoint = *EP;
2402   else
2403     return EP.takeError();
2404   LLVM_DEBUG({
2405     dbgs() << "Using entry point \"" << EntryPointName
2406            << "\": " << formatv("{0:x16}", EntryPoint.getAddress()) << "\n";
2407   });
2408 
2409   // If we're running with the ORC runtime then replace the entry-point
2410   // with the __orc_rt_run_program symbol.
2411   if (!OrcRuntime.empty()) {
2412     if (auto EP = getOrcRuntimeEntryPoint(S))
2413       EntryPoint = *EP;
2414     else
2415       return EP.takeError();
2416     LLVM_DEBUG({
2417       dbgs() << "(called via __orc_rt_run_program_wrapper at "
2418              << formatv("{0:x16}", EntryPoint.getAddress()) << ")\n";
2419     });
2420   }
2421 
2422   return EntryPoint;
2423 }
2424 
2425 static Expected<int> runWithRuntime(Session &S, ExecutorAddr EntryPointAddr) {
2426   StringRef DemangledEntryPoint = EntryPointName;
2427   if (S.ES.getTargetTriple().getObjectFormat() == Triple::MachO &&
2428       DemangledEntryPoint.front() == '_')
2429     DemangledEntryPoint = DemangledEntryPoint.drop_front();
2430   using llvm::orc::shared::SPSString;
2431   using SPSRunProgramSig =
2432       int64_t(SPSString, SPSString, shared::SPSSequence<SPSString>);
2433   int64_t Result;
2434   if (auto Err = S.ES.callSPSWrapper<SPSRunProgramSig>(
2435           EntryPointAddr, Result, S.MainJD->getName(), DemangledEntryPoint,
2436           static_cast<std::vector<std::string> &>(InputArgv)))
2437     return std::move(Err);
2438   return Result;
2439 }
2440 
2441 static Expected<int> runWithoutRuntime(Session &S,
2442                                        ExecutorAddr EntryPointAddr) {
2443   return S.ES.getExecutorProcessControl().runAsMain(EntryPointAddr, InputArgv);
2444 }
2445 
2446 namespace {
2447 struct JITLinkTimers {
2448   TimerGroup JITLinkTG{"llvm-jitlink timers", "timers for llvm-jitlink phases"};
2449   Timer LoadObjectsTimer{"load", "time to load/add object files", JITLinkTG};
2450   Timer LinkTimer{"link", "time to link object files", JITLinkTG};
2451   Timer RunTimer{"run", "time to execute jitlink'd code", JITLinkTG};
2452 };
2453 } // namespace
2454 
2455 int main(int argc, char *argv[]) {
2456   InitLLVM X(argc, argv);
2457 
2458   InitializeAllTargetInfos();
2459   InitializeAllTargetMCs();
2460   InitializeAllDisassemblers();
2461 
2462   cl::HideUnrelatedOptions({&JITLinkCategory, &getColorCategory()});
2463   cl::ParseCommandLineOptions(argc, argv, "llvm jitlink tool");
2464   ExitOnErr.setBanner(std::string(argv[0]) + ": ");
2465 
2466   /// If timers are enabled, create a JITLinkTimers instance.
2467   std::unique_ptr<JITLinkTimers> Timers =
2468       ShowTimes ? std::make_unique<JITLinkTimers>() : nullptr;
2469 
2470   auto [TT, Features] = getFirstFileTripleAndFeatures();
2471   ExitOnErr(sanitizeArguments(TT, argv[0]));
2472 
2473   auto S = ExitOnErr(Session::Create(TT, Features));
2474 
2475   enableStatistics(*S, !OrcRuntime.empty());
2476 
2477   {
2478     TimeRegion TR(Timers ? &Timers->LoadObjectsTimer : nullptr);
2479     ExitOnErr(addSessionInputs(*S));
2480   }
2481 
2482   if (PhonyExternals)
2483     addPhonyExternalsGenerator(*S);
2484 
2485   if (ShowInitialExecutionSessionState)
2486     S->ES.dump(outs());
2487 
2488   Expected<ExecutorSymbolDef> EntryPoint((ExecutorSymbolDef()));
2489   {
2490     ExpectedAsOutParameter<ExecutorSymbolDef> _(&EntryPoint);
2491     TimeRegion TR(Timers ? &Timers->LinkTimer : nullptr);
2492     EntryPoint = getEntryPoint(*S);
2493   }
2494 
2495   // Print any reports regardless of whether we succeeded or failed.
2496   if (ShowEntryExecutionSessionState)
2497     S->ES.dump(outs());
2498 
2499   if (ShowAddrs)
2500     S->dumpSessionInfo(outs());
2501 
2502   if (!EntryPoint) {
2503     if (Timers)
2504       Timers->JITLinkTG.printAll(errs());
2505     reportLLVMJITLinkError(EntryPoint.takeError());
2506     exit(1);
2507   }
2508 
2509   ExitOnErr(runChecks(*S, std::move(TT), std::move(Features)));
2510 
2511   int Result = 0;
2512   if (!NoExec) {
2513     LLVM_DEBUG(dbgs() << "Running \"" << EntryPointName << "\"...\n");
2514     TimeRegion TR(Timers ? &Timers->RunTimer : nullptr);
2515     if (!OrcRuntime.empty())
2516       Result =
2517           ExitOnErr(runWithRuntime(*S, ExecutorAddr(EntryPoint->getAddress())));
2518     else
2519       Result = ExitOnErr(
2520           runWithoutRuntime(*S, ExecutorAddr(EntryPoint->getAddress())));
2521   }
2522 
2523   // Destroy the session.
2524   ExitOnErr(S->ES.endSession());
2525   S.reset();
2526 
2527   if (Timers)
2528     Timers->JITLinkTG.printAll(errs());
2529 
2530   // If the executing code set a test result override then use that.
2531   if (UseTestResultOverride)
2532     Result = TestResultOverride;
2533 
2534   return Result;
2535 }
2536