1 //===- llvm-jitlink.cpp -- Command line interface/tester for llvm-jitlink -===//
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
7 //===----------------------------------------------------------------------===//
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.
13 //===----------------------------------------------------------------------===//
15 #include "llvm-jitlink.h"
17 #include "llvm/BinaryFormat/Magic.h"
18 #include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h"
19 #include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h"
20 #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h"
21 #include "llvm/ExecutionEngine/Orc/EPCDebugObjectRegistrar.h"
22 #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h"
23 #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
24 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
25 #include "llvm/ExecutionEngine/Orc/IndirectionUtils.h"
26 #include "llvm/ExecutionEngine/Orc/MachOPlatform.h"
27 #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h"
28 #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"
29 #include "llvm/ExecutionEngine/Orc/TargetProcess/RegisterEHFrames.h"
30 #include "llvm/MC/MCAsmInfo.h"
31 #include "llvm/MC/MCContext.h"
32 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
33 #include "llvm/MC/MCInstPrinter.h"
34 #include "llvm/MC/MCInstrAnalysis.h"
35 #include "llvm/MC/MCInstrInfo.h"
36 #include "llvm/MC/MCRegisterInfo.h"
37 #include "llvm/MC/MCSubtargetInfo.h"
38 #include "llvm/MC/MCTargetOptions.h"
39 #include "llvm/MC/TargetRegistry.h"
40 #include "llvm/Object/COFF.h"
41 #include "llvm/Object/MachO.h"
42 #include "llvm/Object/ObjectFile.h"
43 #include "llvm/Support/CommandLine.h"
44 #include "llvm/Support/Debug.h"
45 #include "llvm/Support/InitLLVM.h"
46 #include "llvm/Support/MemoryBuffer.h"
47 #include "llvm/Support/Path.h"
48 #include "llvm/Support/Process.h"
49 #include "llvm/Support/TargetSelect.h"
50 #include "llvm/Support/Timer.h"
58 #include <netinet/in.h>
59 #include <sys/socket.h>
61 #endif // LLVM_ON_UNIX
63 #define DEBUG_TYPE "llvm_jitlink"
66 using namespace llvm::jitlink
;
67 using namespace llvm::orc
;
69 static cl::OptionCategory
JITLinkCategory("JITLink Options");
71 static cl::list
<std::string
> InputFiles(cl::Positional
, cl::OneOrMore
,
72 cl::desc("input files"),
73 cl::cat(JITLinkCategory
));
75 static cl::list
<std::string
>
76 LibrarySearchPaths("L",
77 cl::desc("Add dir to the list of library search paths"),
78 cl::Prefix
, cl::cat(JITLinkCategory
));
80 static cl::list
<std::string
>
82 cl::desc("Link against library X in the library search paths"),
83 cl::Prefix
, cl::cat(JITLinkCategory
));
85 static cl::list
<std::string
>
86 LibrariesHidden("hidden-l",
87 cl::desc("Link against library X in the library search "
88 "paths with hidden visibility"),
89 cl::Prefix
, cl::cat(JITLinkCategory
));
91 static cl::list
<std::string
>
92 LoadHidden("load_hidden",
93 cl::desc("Link against library X with hidden visibility"),
94 cl::cat(JITLinkCategory
));
96 static cl::opt
<bool> NoExec("noexec", cl::desc("Do not execute loaded code"),
97 cl::init(false), cl::cat(JITLinkCategory
));
99 static cl::list
<std::string
>
100 CheckFiles("check", cl::desc("File containing verifier checks"),
101 cl::ZeroOrMore
, cl::cat(JITLinkCategory
));
103 static cl::opt
<std::string
>
104 CheckName("check-name", cl::desc("Name of checks to match against"),
105 cl::init("jitlink-check"), cl::cat(JITLinkCategory
));
107 static cl::opt
<std::string
>
108 EntryPointName("entry", cl::desc("Symbol to call as main entry point"),
109 cl::init(""), cl::cat(JITLinkCategory
));
111 static cl::list
<std::string
> JITDylibs(
113 cl::desc("Specifies the JITDylib to be used for any subsequent "
114 "input file, -L<seacrh-path>, and -l<library> arguments"),
115 cl::cat(JITLinkCategory
));
117 static cl::list
<std::string
>
119 cl::desc("Pre-load dynamic libraries (e.g. language runtimes "
120 "required by the ORC runtime)"),
121 cl::ZeroOrMore
, cl::cat(JITLinkCategory
));
123 static cl::list
<std::string
> InputArgv("args", cl::Positional
,
124 cl::desc("<program arguments>..."),
125 cl::ZeroOrMore
, cl::PositionalEatsArgs
,
126 cl::cat(JITLinkCategory
));
129 DebuggerSupport("debugger-support",
130 cl::desc("Enable debugger suppport (default = !-noexec)"),
131 cl::init(true), cl::Hidden
, cl::cat(JITLinkCategory
));
134 NoProcessSymbols("no-process-syms",
135 cl::desc("Do not resolve to llvm-jitlink process symbols"),
136 cl::init(false), cl::cat(JITLinkCategory
));
138 static cl::list
<std::string
> AbsoluteDefs(
140 cl::desc("Inject absolute symbol definitions (syntax: <name>=<addr>)"),
141 cl::ZeroOrMore
, cl::cat(JITLinkCategory
));
143 static cl::list
<std::string
>
144 Aliases("alias", cl::desc("Inject symbol aliases (syntax: <name>=<addr>)"),
145 cl::ZeroOrMore
, cl::cat(JITLinkCategory
));
147 static cl::list
<std::string
> TestHarnesses("harness", cl::Positional
,
148 cl::desc("Test harness files"),
150 cl::PositionalEatsArgs
,
151 cl::cat(JITLinkCategory
));
153 static cl::opt
<bool> ShowInitialExecutionSessionState(
155 cl::desc("Print ExecutionSession state before resolving entry point"),
156 cl::init(false), cl::cat(JITLinkCategory
));
158 static cl::opt
<bool> ShowEntryExecutionSessionState(
160 cl::desc("Print ExecutionSession state after resolving entry point"),
161 cl::init(false), cl::cat(JITLinkCategory
));
163 static cl::opt
<bool> ShowAddrs(
165 cl::desc("Print registered symbol, section, got and stub addresses"),
166 cl::init(false), cl::cat(JITLinkCategory
));
168 static cl::opt
<bool> ShowLinkGraph(
170 cl::desc("Print the link graph after fixups have been applied"),
171 cl::init(false), cl::cat(JITLinkCategory
));
173 static cl::opt
<bool> ShowSizes(
175 cl::desc("Show sizes pre- and post-dead stripping, and allocations"),
176 cl::init(false), cl::cat(JITLinkCategory
));
178 static cl::opt
<bool> ShowTimes("show-times",
179 cl::desc("Show times for llvm-jitlink phases"),
180 cl::init(false), cl::cat(JITLinkCategory
));
182 static cl::opt
<std::string
> SlabAllocateSizeString(
184 cl::desc("Allocate from a slab of the given size "
185 "(allowable suffixes: Kb, Mb, Gb. default = "
187 cl::init(""), cl::cat(JITLinkCategory
));
189 static cl::opt
<uint64_t> SlabAddress(
191 cl::desc("Set slab target address (requires -slab-allocate and -noexec)"),
192 cl::init(~0ULL), cl::cat(JITLinkCategory
));
194 static cl::opt
<uint64_t> SlabPageSize(
196 cl::desc("Set page size for slab (requires -slab-allocate and -noexec)"),
197 cl::init(0), cl::cat(JITLinkCategory
));
199 static cl::opt
<bool> ShowRelocatedSectionContents(
200 "show-relocated-section-contents",
201 cl::desc("show section contents after fixups have been applied"),
202 cl::init(false), cl::cat(JITLinkCategory
));
204 static cl::opt
<bool> PhonyExternals(
206 cl::desc("resolve all otherwise unresolved externals to null"),
207 cl::init(false), cl::cat(JITLinkCategory
));
209 static cl::opt
<std::string
> OutOfProcessExecutor(
210 "oop-executor", cl::desc("Launch an out-of-process executor to run code"),
211 cl::ValueOptional
, cl::cat(JITLinkCategory
));
213 static cl::opt
<std::string
> OutOfProcessExecutorConnect(
214 "oop-executor-connect",
215 cl::desc("Connect to an out-of-process executor via TCP"),
216 cl::cat(JITLinkCategory
));
218 static cl::opt
<std::string
>
219 OrcRuntime("orc-runtime", cl::desc("Use ORC runtime from given path"),
220 cl::init(""), cl::cat(JITLinkCategory
));
222 static cl::opt
<bool> AddSelfRelocations(
223 "add-self-relocations",
224 cl::desc("Add relocations to function pointers to the current function"),
225 cl::init(false), cl::cat(JITLinkCategory
));
227 ExitOnError ExitOnErr
;
229 LLVM_ATTRIBUTE_USED
void linkComponents() {
230 errs() << (void *)&llvm_orc_registerEHFrameSectionWrapper
231 << (void *)&llvm_orc_deregisterEHFrameSectionWrapper
232 << (void *)&llvm_orc_registerJITLoaderGDBWrapper
;
235 static bool UseTestResultOverride
= false;
236 static int64_t TestResultOverride
= 0;
238 extern "C" LLVM_ATTRIBUTE_USED
void
239 llvm_jitlink_setTestResultOverride(int64_t Value
) {
240 TestResultOverride
= Value
;
241 UseTestResultOverride
= true;
244 static Error
addSelfRelocations(LinkGraph
&G
);
249 operator<<(raw_ostream
&OS
, const Session::MemoryRegionInfo
&MRI
) {
250 return OS
<< "target addr = "
251 << format("0x%016" PRIx64
, MRI
.getTargetAddress())
252 << ", content: " << (const void *)MRI
.getContent().data() << " -- "
253 << (const void *)(MRI
.getContent().data() + MRI
.getContent().size())
254 << " (" << MRI
.getContent().size() << " bytes)";
258 operator<<(raw_ostream
&OS
, const Session::SymbolInfoMap
&SIM
) {
260 for (auto &SKV
: SIM
)
261 OS
<< " \"" << SKV
.first() << "\" " << SKV
.second
<< "\n";
266 operator<<(raw_ostream
&OS
, const Session::FileInfo
&FI
) {
267 for (auto &SIKV
: FI
.SectionInfos
)
268 OS
<< " Section \"" << SIKV
.first() << "\": " << SIKV
.second
<< "\n";
269 for (auto &GOTKV
: FI
.GOTEntryInfos
)
270 OS
<< " GOT \"" << GOTKV
.first() << "\": " << GOTKV
.second
<< "\n";
271 for (auto &StubKV
: FI
.StubInfos
)
272 OS
<< " Stub \"" << StubKV
.first() << "\": " << StubKV
.second
<< "\n";
277 operator<<(raw_ostream
&OS
, const Session::FileInfoMap
&FIM
) {
278 for (auto &FIKV
: FIM
)
279 OS
<< "File \"" << FIKV
.first() << "\":\n" << FIKV
.second
;
283 static Error
applyHarnessPromotions(Session
&S
, LinkGraph
&G
) {
285 // If this graph is part of the test harness there's nothing to do.
286 if (S
.HarnessFiles
.empty() || S
.HarnessFiles
.count(G
.getName()))
287 return Error::success();
289 LLVM_DEBUG(dbgs() << "Applying promotions to graph " << G
.getName() << "\n");
291 // If this graph is part of the test then promote any symbols referenced by
292 // the harness to default scope, remove all symbols that clash with harness
294 std::vector
<Symbol
*> DefinitionsToRemove
;
295 for (auto *Sym
: G
.defined_symbols()) {
300 if (Sym
->getLinkage() == Linkage::Weak
) {
301 if (!S
.CanonicalWeakDefs
.count(Sym
->getName()) ||
302 S
.CanonicalWeakDefs
[Sym
->getName()] != G
.getName()) {
304 dbgs() << " Externalizing weak symbol " << Sym
->getName() << "\n";
306 DefinitionsToRemove
.push_back(Sym
);
309 dbgs() << " Making weak symbol " << Sym
->getName() << " strong\n";
311 if (S
.HarnessExternals
.count(Sym
->getName()))
312 Sym
->setScope(Scope::Default
);
314 Sym
->setScope(Scope::Hidden
);
315 Sym
->setLinkage(Linkage::Strong
);
317 } else if (S
.HarnessExternals
.count(Sym
->getName())) {
318 LLVM_DEBUG(dbgs() << " Promoting " << Sym
->getName() << "\n");
319 Sym
->setScope(Scope::Default
);
322 } else if (S
.HarnessDefinitions
.count(Sym
->getName())) {
323 LLVM_DEBUG(dbgs() << " Externalizing " << Sym
->getName() << "\n");
324 DefinitionsToRemove
.push_back(Sym
);
328 for (auto *Sym
: DefinitionsToRemove
)
329 G
.makeExternal(*Sym
);
331 return Error::success();
334 static uint64_t computeTotalBlockSizes(LinkGraph
&G
) {
335 uint64_t TotalSize
= 0;
336 for (auto *B
: G
.blocks())
337 TotalSize
+= B
->getSize();
341 static void dumpSectionContents(raw_ostream
&OS
, LinkGraph
&G
) {
342 constexpr orc::ExecutorAddrDiff DumpWidth
= 16;
343 static_assert(isPowerOf2_64(DumpWidth
), "DumpWidth must be a power of two");
345 // Put sections in address order.
346 std::vector
<Section
*> Sections
;
347 for (auto &S
: G
.sections())
348 Sections
.push_back(&S
);
350 llvm::sort(Sections
, [](const Section
*LHS
, const Section
*RHS
) {
351 if (llvm::empty(LHS
->symbols()) && llvm::empty(RHS
->symbols()))
353 if (llvm::empty(LHS
->symbols()))
355 if (llvm::empty(RHS
->symbols()))
357 SectionRange
LHSRange(*LHS
);
358 SectionRange
RHSRange(*RHS
);
359 return LHSRange
.getStart() < RHSRange
.getStart();
362 for (auto *S
: Sections
) {
363 OS
<< S
->getName() << " content:";
364 if (llvm::empty(S
->symbols())) {
365 OS
<< "\n section empty\n";
369 // Sort symbols into order, then render.
370 std::vector
<Symbol
*> Syms(S
->symbols().begin(), S
->symbols().end());
371 llvm::sort(Syms
, [](const Symbol
*LHS
, const Symbol
*RHS
) {
372 return LHS
->getAddress() < RHS
->getAddress();
375 orc::ExecutorAddr
NextAddr(Syms
.front()->getAddress().getValue() &
377 for (auto *Sym
: Syms
) {
378 bool IsZeroFill
= Sym
->getBlock().isZeroFill();
379 auto SymStart
= Sym
->getAddress();
380 auto SymSize
= Sym
->getSize();
381 auto SymEnd
= SymStart
+ SymSize
;
382 const uint8_t *SymData
= IsZeroFill
? nullptr
383 : reinterpret_cast<const uint8_t *>(
384 Sym
->getSymbolContent().data());
386 // Pad any space before the symbol starts.
387 while (NextAddr
!= SymStart
) {
388 if (NextAddr
% DumpWidth
== 0)
389 OS
<< formatv("\n{0:x16}:", NextAddr
);
394 // Render the symbol content.
395 while (NextAddr
!= SymEnd
) {
396 if (NextAddr
% DumpWidth
== 0)
397 OS
<< formatv("\n{0:x16}:", NextAddr
);
401 OS
<< formatv(" {0:x-2}", SymData
[NextAddr
- SymStart
]);
409 class JITLinkSlabAllocator final
: public JITLinkMemoryManager
{
411 struct FinalizedAllocInfo
{
412 FinalizedAllocInfo(sys::MemoryBlock Mem
,
413 std::vector
<shared::WrapperFunctionCall
> DeallocActions
)
414 : Mem(Mem
), DeallocActions(std::move(DeallocActions
)) {}
415 sys::MemoryBlock Mem
;
416 std::vector
<shared::WrapperFunctionCall
> DeallocActions
;
420 static Expected
<std::unique_ptr
<JITLinkSlabAllocator
>>
421 Create(uint64_t SlabSize
) {
422 Error Err
= Error::success();
423 std::unique_ptr
<JITLinkSlabAllocator
> Allocator(
424 new JITLinkSlabAllocator(SlabSize
, Err
));
426 return std::move(Err
);
427 return std::move(Allocator
);
430 void allocate(const JITLinkDylib
*JD
, LinkGraph
&G
,
431 OnAllocatedFunction OnAllocated
) override
{
433 // Local class for allocation.
434 class IPMMAlloc
: public InFlightAlloc
{
436 IPMMAlloc(JITLinkSlabAllocator
&Parent
, BasicLayout BL
,
437 sys::MemoryBlock StandardSegs
, sys::MemoryBlock FinalizeSegs
)
438 : Parent(Parent
), BL(std::move(BL
)),
439 StandardSegs(std::move(StandardSegs
)),
440 FinalizeSegs(std::move(FinalizeSegs
)) {}
442 void finalize(OnFinalizedFunction OnFinalized
) override
{
443 if (auto Err
= applyProtections()) {
444 OnFinalized(std::move(Err
));
448 auto DeallocActions
= runFinalizeActions(BL
.graphAllocActions());
449 if (!DeallocActions
) {
450 OnFinalized(DeallocActions
.takeError());
454 if (auto Err
= Parent
.freeBlock(FinalizeSegs
)) {
456 joinErrors(std::move(Err
), runDeallocActions(*DeallocActions
)));
460 OnFinalized(FinalizedAlloc(ExecutorAddr::fromPtr(
461 new FinalizedAllocInfo(StandardSegs
, std::move(*DeallocActions
)))));
464 void abandon(OnAbandonedFunction OnAbandoned
) override
{
465 OnAbandoned(joinErrors(Parent
.freeBlock(StandardSegs
),
466 Parent
.freeBlock(FinalizeSegs
)));
470 Error
applyProtections() {
471 for (auto &KV
: BL
.segments()) {
472 const auto &Group
= KV
.first
;
473 auto &Seg
= KV
.second
;
475 auto Prot
= toSysMemoryProtectionFlags(Group
.getMemProt());
478 alignTo(Seg
.ContentSize
+ Seg
.ZeroFillSize
, Parent
.PageSize
);
479 sys::MemoryBlock
MB(Seg
.WorkingMem
, SegSize
);
480 if (auto EC
= sys::Memory::protectMappedMemory(MB
, Prot
))
481 return errorCodeToError(EC
);
482 if (Prot
& sys::Memory::MF_EXEC
)
483 sys::Memory::InvalidateInstructionCache(MB
.base(),
486 return Error::success();
489 JITLinkSlabAllocator
&Parent
;
491 sys::MemoryBlock StandardSegs
;
492 sys::MemoryBlock FinalizeSegs
;
496 auto SegsSizes
= BL
.getContiguousPageBasedLayoutSizes(PageSize
);
499 OnAllocated(SegsSizes
.takeError());
503 char *AllocBase
= nullptr;
505 std::lock_guard
<std::mutex
> Lock(SlabMutex
);
507 if (SegsSizes
->total() > SlabRemaining
.allocatedSize()) {
508 OnAllocated(make_error
<StringError
>(
509 "Slab allocator out of memory: request for " +
510 formatv("{0:x}", SegsSizes
->total()) +
511 " bytes exceeds remaining capacity of " +
512 formatv("{0:x}", SlabRemaining
.allocatedSize()) + " bytes",
513 inconvertibleErrorCode()));
517 AllocBase
= reinterpret_cast<char *>(SlabRemaining
.base());
519 sys::MemoryBlock(AllocBase
+ SegsSizes
->total(),
520 SlabRemaining
.allocatedSize() - SegsSizes
->total());
523 sys::MemoryBlock
StandardSegs(AllocBase
, SegsSizes
->StandardSegs
);
524 sys::MemoryBlock
FinalizeSegs(AllocBase
+ SegsSizes
->StandardSegs
,
525 SegsSizes
->FinalizeSegs
);
527 auto NextStandardSegAddr
= ExecutorAddr::fromPtr(StandardSegs
.base());
528 auto NextFinalizeSegAddr
= ExecutorAddr::fromPtr(FinalizeSegs
.base());
531 dbgs() << "JITLinkSlabAllocator allocated:\n";
532 if (SegsSizes
->StandardSegs
)
533 dbgs() << formatv(" [ {0:x16} -- {1:x16} ]", NextStandardSegAddr
,
534 NextStandardSegAddr
+ StandardSegs
.allocatedSize())
535 << " to stardard segs\n";
537 dbgs() << " no standard segs\n";
538 if (SegsSizes
->FinalizeSegs
)
539 dbgs() << formatv(" [ {0:x16} -- {1:x16} ]", NextFinalizeSegAddr
,
540 NextFinalizeSegAddr
+ FinalizeSegs
.allocatedSize())
541 << " to finalize segs\n";
543 dbgs() << " no finalize segs\n";
546 for (auto &KV
: BL
.segments()) {
547 auto &Group
= KV
.first
;
548 auto &Seg
= KV
.second
;
551 (Group
.getMemDeallocPolicy() == MemDeallocPolicy::Standard
)
552 ? NextStandardSegAddr
553 : NextFinalizeSegAddr
;
556 dbgs() << " " << Group
<< " -> " << formatv("{0:x16}", SegAddr
)
559 Seg
.WorkingMem
= SegAddr
.toPtr
<char *>();
560 Seg
.Addr
= SegAddr
+ SlabDelta
;
562 SegAddr
+= alignTo(Seg
.ContentSize
+ Seg
.ZeroFillSize
, PageSize
);
564 // Zero out the zero-fill memory.
565 if (Seg
.ZeroFillSize
!= 0)
566 memset(Seg
.WorkingMem
+ Seg
.ContentSize
, 0, Seg
.ZeroFillSize
);
569 if (auto Err
= BL
.apply()) {
570 OnAllocated(std::move(Err
));
574 OnAllocated(std::unique_ptr
<InProcessMemoryManager::InFlightAlloc
>(
575 new IPMMAlloc(*this, std::move(BL
), std::move(StandardSegs
),
576 std::move(FinalizeSegs
))));
579 void deallocate(std::vector
<FinalizedAlloc
> FinalizedAllocs
,
580 OnDeallocatedFunction OnDeallocated
) override
{
581 Error Err
= Error::success();
582 for (auto &FA
: FinalizedAllocs
) {
583 std::unique_ptr
<FinalizedAllocInfo
> FAI(
584 FA
.release().toPtr
<FinalizedAllocInfo
*>());
586 // FIXME: Run dealloc actions.
588 Err
= joinErrors(std::move(Err
), freeBlock(FAI
->Mem
));
590 OnDeallocated(std::move(Err
));
594 JITLinkSlabAllocator(uint64_t SlabSize
, Error
&Err
) {
595 ErrorAsOutParameter
_(&Err
);
598 if (auto PageSizeOrErr
= sys::Process::getPageSize())
599 PageSize
= *PageSizeOrErr
;
601 Err
= PageSizeOrErr
.takeError();
606 Err
= make_error
<StringError
>("Page size is zero",
607 inconvertibleErrorCode());
611 PageSize
= SlabPageSize
;
613 if (!isPowerOf2_64(PageSize
)) {
614 Err
= make_error
<StringError
>("Page size is not a power of 2",
615 inconvertibleErrorCode());
619 // Round slab request up to page size.
620 SlabSize
= (SlabSize
+ PageSize
- 1) & ~(PageSize
- 1);
622 const sys::Memory::ProtectionFlags ReadWrite
=
623 static_cast<sys::Memory::ProtectionFlags
>(sys::Memory::MF_READ
|
624 sys::Memory::MF_WRITE
);
628 sys::Memory::allocateMappedMemory(SlabSize
, nullptr, ReadWrite
, EC
);
631 Err
= errorCodeToError(EC
);
635 // Calculate the target address delta to link as-if slab were at
637 if (SlabAddress
!= ~0ULL)
638 SlabDelta
= ExecutorAddr(SlabAddress
) -
639 ExecutorAddr::fromPtr(SlabRemaining
.base());
642 Error
freeBlock(sys::MemoryBlock MB
) {
643 // FIXME: Return memory to slab.
644 return Error::success();
647 std::mutex SlabMutex
;
648 sys::MemoryBlock SlabRemaining
;
649 uint64_t PageSize
= 0;
650 int64_t SlabDelta
= 0;
653 Expected
<uint64_t> getSlabAllocSize(StringRef SizeString
) {
654 SizeString
= SizeString
.trim();
656 uint64_t Units
= 1024;
658 if (SizeString
.endswith_insensitive("kb"))
659 SizeString
= SizeString
.drop_back(2).rtrim();
660 else if (SizeString
.endswith_insensitive("mb")) {
662 SizeString
= SizeString
.drop_back(2).rtrim();
663 } else if (SizeString
.endswith_insensitive("gb")) {
664 Units
= 1024 * 1024 * 1024;
665 SizeString
= SizeString
.drop_back(2).rtrim();
668 uint64_t SlabSize
= 0;
669 if (SizeString
.getAsInteger(10, SlabSize
))
670 return make_error
<StringError
>("Invalid numeric format for slab size",
671 inconvertibleErrorCode());
673 return SlabSize
* Units
;
676 static std::unique_ptr
<JITLinkMemoryManager
> createMemoryManager() {
677 if (!SlabAllocateSizeString
.empty()) {
678 auto SlabSize
= ExitOnErr(getSlabAllocSize(SlabAllocateSizeString
));
679 return ExitOnErr(JITLinkSlabAllocator::Create(SlabSize
));
681 return ExitOnErr(InProcessMemoryManager::Create());
684 static Expected
<MaterializationUnit::Interface
>
685 getTestObjectFileInterface(Session
&S
, MemoryBufferRef O
) {
687 // Get the standard interface for this object, but ignore the symbols field.
688 // We'll handle that manually to include promotion.
689 auto I
= getObjectFileInterface(S
.ES
, O
);
691 return I
.takeError();
692 I
->SymbolFlags
.clear();
694 // If creating an object file was going to fail it would have happened above,
695 // so we can 'cantFail' this.
696 auto Obj
= cantFail(object::ObjectFile::createObjectFile(O
));
698 // The init symbol must be included in the SymbolFlags map if present.
700 I
->SymbolFlags
[I
->InitSymbol
] =
701 JITSymbolFlags::MaterializationSideEffectsOnly
;
703 for (auto &Sym
: Obj
->symbols()) {
704 Expected
<uint32_t> SymFlagsOrErr
= Sym
.getFlags();
706 // TODO: Test this error.
707 return SymFlagsOrErr
.takeError();
709 // Skip symbols not defined in this object file.
710 if ((*SymFlagsOrErr
& object::BasicSymbolRef::SF_Undefined
))
713 auto Name
= Sym
.getName();
715 return Name
.takeError();
717 // Skip symbols that have type SF_File.
718 if (auto SymType
= Sym
.getType()) {
719 if (*SymType
== object::SymbolRef::ST_File
)
722 return SymType
.takeError();
724 auto SymFlags
= JITSymbolFlags::fromObjectSymbol(Sym
);
726 return SymFlags
.takeError();
728 if (SymFlags
->isWeak()) {
729 // If this is a weak symbol that's not defined in the harness then we
730 // need to either mark it as strong (if this is the first definition
731 // that we've seen) or discard it.
732 if (S
.HarnessDefinitions
.count(*Name
) || S
.CanonicalWeakDefs
.count(*Name
))
734 S
.CanonicalWeakDefs
[*Name
] = O
.getBufferIdentifier();
735 *SymFlags
&= ~JITSymbolFlags::Weak
;
736 if (!S
.HarnessExternals
.count(*Name
))
737 *SymFlags
&= ~JITSymbolFlags::Exported
;
738 } else if (S
.HarnessExternals
.count(*Name
)) {
739 *SymFlags
|= JITSymbolFlags::Exported
;
740 } else if (S
.HarnessDefinitions
.count(*Name
) ||
741 !(*SymFlagsOrErr
& object::BasicSymbolRef::SF_Global
))
744 auto InternedName
= S
.ES
.intern(*Name
);
745 I
->SymbolFlags
[InternedName
] = std::move(*SymFlags
);
751 static Error
loadProcessSymbols(Session
&S
) {
752 auto FilterMainEntryPoint
=
753 [EPName
= S
.ES
.intern(EntryPointName
)](SymbolStringPtr Name
) {
754 return Name
!= EPName
;
756 S
.MainJD
->addGenerator(
757 ExitOnErr(orc::EPCDynamicLibrarySearchGenerator::GetForTargetProcess(
758 S
.ES
, std::move(FilterMainEntryPoint
))));
760 return Error::success();
763 static Error
loadDylibs(Session
&S
) {
764 LLVM_DEBUG(dbgs() << "Loading dylibs...\n");
765 for (const auto &Dylib
: Dylibs
) {
766 LLVM_DEBUG(dbgs() << " " << Dylib
<< "\n");
767 auto G
= orc::EPCDynamicLibrarySearchGenerator::Load(S
.ES
, Dylib
.c_str());
769 return G
.takeError();
770 S
.MainJD
->addGenerator(std::move(*G
));
773 return Error::success();
776 static Expected
<std::unique_ptr
<ExecutorProcessControl
>> launchExecutor() {
778 // FIXME: Add support for Windows.
779 return make_error
<StringError
>("-" + OutOfProcessExecutor
.ArgStr
+
780 " not supported on non-unix platforms",
781 inconvertibleErrorCode());
782 #elif !LLVM_ENABLE_THREADS
783 // Out of process mode using SimpleRemoteEPC depends on threads.
784 return make_error
<StringError
>(
785 "-" + OutOfProcessExecutor
.ArgStr
+
786 " requires threads, but LLVM was built with "
787 "LLVM_ENABLE_THREADS=Off",
788 inconvertibleErrorCode());
791 constexpr int ReadEnd
= 0;
792 constexpr int WriteEnd
= 1;
800 // Create pipes to/from the executor..
801 if (pipe(ToExecutor
) != 0 || pipe(FromExecutor
) != 0)
802 return make_error
<StringError
>("Unable to create pipe for executor",
803 inconvertibleErrorCode());
810 // Close the parent ends of the pipes
811 close(ToExecutor
[WriteEnd
]);
812 close(FromExecutor
[ReadEnd
]);
814 // Execute the child process.
815 std::unique_ptr
<char[]> ExecutorPath
, FDSpecifier
;
817 ExecutorPath
= std::make_unique
<char[]>(OutOfProcessExecutor
.size() + 1);
818 strcpy(ExecutorPath
.get(), OutOfProcessExecutor
.data());
820 std::string
FDSpecifierStr("filedescs=");
821 FDSpecifierStr
+= utostr(ToExecutor
[ReadEnd
]);
822 FDSpecifierStr
+= ',';
823 FDSpecifierStr
+= utostr(FromExecutor
[WriteEnd
]);
824 FDSpecifier
= std::make_unique
<char[]>(FDSpecifierStr
.size() + 1);
825 strcpy(FDSpecifier
.get(), FDSpecifierStr
.c_str());
828 char *const Args
[] = {ExecutorPath
.get(), FDSpecifier
.get(), nullptr};
829 int RC
= execvp(ExecutorPath
.get(), Args
);
831 errs() << "unable to launch out-of-process executor \""
832 << ExecutorPath
.get() << "\"\n";
836 // else we're the parent...
838 // Close the child ends of the pipes
839 close(ToExecutor
[ReadEnd
]);
840 close(FromExecutor
[WriteEnd
]);
842 return SimpleRemoteEPC::Create
<FDSimpleRemoteEPCTransport
>(
843 std::make_unique
<DynamicThreadPoolTaskDispatcher
>(),
844 SimpleRemoteEPC::Setup(), FromExecutor
[ReadEnd
], ToExecutor
[WriteEnd
]);
848 #if LLVM_ON_UNIX && LLVM_ENABLE_THREADS
849 static Error
createTCPSocketError(Twine Details
) {
850 return make_error
<StringError
>(
851 formatv("Failed to connect TCP socket '{0}': {1}",
852 OutOfProcessExecutorConnect
, Details
),
853 inconvertibleErrorCode());
856 static Expected
<int> connectTCPSocket(std::string Host
, std::string PortStr
) {
859 Hints
.ai_family
= AF_INET
;
860 Hints
.ai_socktype
= SOCK_STREAM
;
861 Hints
.ai_flags
= AI_NUMERICSERV
;
863 if (int EC
= getaddrinfo(Host
.c_str(), PortStr
.c_str(), &Hints
, &AI
))
864 return createTCPSocketError("Address resolution failed (" +
865 StringRef(gai_strerror(EC
)) + ")");
867 // Cycle through the returned addrinfo structures and connect to the first
868 // reachable endpoint.
871 for (Server
= AI
; Server
!= nullptr; Server
= Server
->ai_next
) {
872 // socket might fail, e.g. if the address family is not supported. Skip to
873 // the next addrinfo structure in such a case.
874 if ((SockFD
= socket(AI
->ai_family
, AI
->ai_socktype
, AI
->ai_protocol
)) < 0)
877 // If connect returns null, we exit the loop with a working socket.
878 if (connect(SockFD
, Server
->ai_addr
, Server
->ai_addrlen
) == 0)
885 // If we reached the end of the loop without connecting to a valid endpoint,
886 // dump the last error that was logged in socket() or connect().
887 if (Server
== nullptr)
888 return createTCPSocketError(std::strerror(errno
));
894 static Expected
<std::unique_ptr
<ExecutorProcessControl
>> connectToExecutor() {
896 // FIXME: Add TCP support for Windows.
897 return make_error
<StringError
>("-" + OutOfProcessExecutorConnect
.ArgStr
+
898 " not supported on non-unix platforms",
899 inconvertibleErrorCode());
900 #elif !LLVM_ENABLE_THREADS
901 // Out of process mode using SimpleRemoteEPC depends on threads.
902 return make_error
<StringError
>(
903 "-" + OutOfProcessExecutorConnect
.ArgStr
+
904 " requires threads, but LLVM was built with "
905 "LLVM_ENABLE_THREADS=Off",
906 inconvertibleErrorCode());
909 StringRef Host
, PortStr
;
910 std::tie(Host
, PortStr
) = StringRef(OutOfProcessExecutorConnect
).split(':');
912 return createTCPSocketError("Host name for -" +
913 OutOfProcessExecutorConnect
.ArgStr
+
914 " can not be empty");
916 return createTCPSocketError("Port number in -" +
917 OutOfProcessExecutorConnect
.ArgStr
+
918 " can not be empty");
920 if (PortStr
.getAsInteger(10, Port
))
921 return createTCPSocketError("Port number '" + PortStr
+
922 "' is not a valid integer");
924 Expected
<int> SockFD
= connectTCPSocket(Host
.str(), PortStr
.str());
926 return SockFD
.takeError();
928 return SimpleRemoteEPC::Create
<FDSimpleRemoteEPCTransport
>(
929 std::make_unique
<DynamicThreadPoolTaskDispatcher
>(),
930 SimpleRemoteEPC::Setup(), *SockFD
, *SockFD
);
934 class PhonyExternalsGenerator
: public DefinitionGenerator
{
936 Error
tryToGenerate(LookupState
&LS
, LookupKind K
, JITDylib
&JD
,
937 JITDylibLookupFlags JDLookupFlags
,
938 const SymbolLookupSet
&LookupSet
) override
{
939 SymbolMap PhonySymbols
;
940 for (auto &KV
: LookupSet
)
941 PhonySymbols
[KV
.first
] = JITEvaluatedSymbol(0, JITSymbolFlags::Exported
);
942 return JD
.define(absoluteSymbols(std::move(PhonySymbols
)));
946 Expected
<std::unique_ptr
<Session
>> Session::Create(Triple TT
) {
948 std::unique_ptr
<ExecutorProcessControl
> EPC
;
949 if (OutOfProcessExecutor
.getNumOccurrences()) {
950 /// If -oop-executor is passed then launch the executor.
951 if (auto REPC
= launchExecutor())
952 EPC
= std::move(*REPC
);
954 return REPC
.takeError();
955 } else if (OutOfProcessExecutorConnect
.getNumOccurrences()) {
956 /// If -oop-executor-connect is passed then connect to the executor.
957 if (auto REPC
= connectToExecutor())
958 EPC
= std::move(*REPC
);
960 return REPC
.takeError();
962 /// Otherwise use SelfExecutorProcessControl to target the current process.
963 auto PageSize
= sys::Process::getPageSize();
965 return PageSize
.takeError();
966 EPC
= std::make_unique
<SelfExecutorProcessControl
>(
967 std::make_shared
<SymbolStringPool
>(),
968 std::make_unique
<InPlaceTaskDispatcher
>(), std::move(TT
), *PageSize
,
969 createMemoryManager());
972 Error Err
= Error::success();
973 std::unique_ptr
<Session
> S(new Session(std::move(EPC
), Err
));
975 return std::move(Err
);
979 Session::~Session() {
980 if (auto Err
= ES
.endSession())
981 ES
.reportError(std::move(Err
));
984 Session::Session(std::unique_ptr
<ExecutorProcessControl
> EPC
, Error
&Err
)
985 : ES(std::move(EPC
)),
986 ObjLayer(ES
, ES
.getExecutorProcessControl().getMemMgr()) {
988 /// Local ObjectLinkingLayer::Plugin class to forward modifyPassConfig to the
990 class JITLinkSessionPlugin
: public ObjectLinkingLayer::Plugin
{
992 JITLinkSessionPlugin(Session
&S
) : S(S
) {}
993 void modifyPassConfig(MaterializationResponsibility
&MR
, LinkGraph
&G
,
994 PassConfiguration
&PassConfig
) override
{
995 S
.modifyPassConfig(G
.getTargetTriple(), PassConfig
);
998 Error
notifyFailed(MaterializationResponsibility
&MR
) override
{
999 return Error::success();
1001 Error
notifyRemovingResources(ResourceKey K
) override
{
1002 return Error::success();
1004 void notifyTransferringResources(ResourceKey DstKey
,
1005 ResourceKey SrcKey
) override
{}
1011 ErrorAsOutParameter
_(&Err
);
1013 if (auto MainJDOrErr
= ES
.createJITDylib("main"))
1014 MainJD
= &*MainJDOrErr
;
1016 Err
= MainJDOrErr
.takeError();
1020 if (!NoProcessSymbols
)
1021 ExitOnErr(loadProcessSymbols(*this));
1022 ExitOnErr(loadDylibs(*this));
1024 auto &TT
= ES
.getExecutorProcessControl().getTargetTriple();
1026 if (DebuggerSupport
&& TT
.isOSBinFormatMachO())
1027 ObjLayer
.addPlugin(ExitOnErr(
1028 GDBJITDebugInfoRegistrationPlugin::Create(this->ES
, *MainJD
, TT
)));
1030 // Set up the platform.
1031 if (TT
.isOSBinFormatMachO() && !OrcRuntime
.empty()) {
1033 MachOPlatform::Create(ES
, ObjLayer
, *MainJD
, OrcRuntime
.c_str()))
1034 ES
.setPlatform(std::move(*P
));
1036 Err
= P
.takeError();
1039 } else if (TT
.isOSBinFormatELF() && !OrcRuntime
.empty()) {
1041 ELFNixPlatform::Create(ES
, ObjLayer
, *MainJD
, OrcRuntime
.c_str()))
1042 ES
.setPlatform(std::move(*P
));
1044 Err
= P
.takeError();
1047 } else if (!TT
.isOSWindows() && !TT
.isOSBinFormatMachO()) {
1049 ObjLayer
.addPlugin(std::make_unique
<EHFrameRegistrationPlugin
>(
1050 ES
, ExitOnErr(EPCEHFrameRegistrar::Create(this->ES
))));
1051 if (DebuggerSupport
)
1052 ObjLayer
.addPlugin(std::make_unique
<DebugObjectManagerPlugin
>(
1053 ES
, ExitOnErr(createJITLoaderGDBRegistrar(this->ES
))));
1056 ObjLayer
.addPlugin(std::make_unique
<JITLinkSessionPlugin
>(*this));
1058 // Process any harness files.
1059 for (auto &HarnessFile
: TestHarnesses
) {
1060 HarnessFiles
.insert(HarnessFile
);
1063 ExitOnErr(errorOrToExpected(MemoryBuffer::getFile(HarnessFile
)));
1066 ExitOnErr(getObjectFileInterface(ES
, ObjBuffer
->getMemBufferRef()));
1068 for (auto &KV
: ObjInterface
.SymbolFlags
)
1069 HarnessDefinitions
.insert(*KV
.first
);
1071 auto Obj
= ExitOnErr(
1072 object::ObjectFile::createObjectFile(ObjBuffer
->getMemBufferRef()));
1074 for (auto &Sym
: Obj
->symbols()) {
1075 uint32_t SymFlags
= ExitOnErr(Sym
.getFlags());
1076 auto Name
= ExitOnErr(Sym
.getName());
1081 if (SymFlags
& object::BasicSymbolRef::SF_Undefined
)
1082 HarnessExternals
.insert(Name
);
1086 // If a name is defined by some harness file then it's a definition, not an
1088 for (auto &DefName
: HarnessDefinitions
)
1089 HarnessExternals
.erase(DefName
.getKey());
1092 void Session::dumpSessionInfo(raw_ostream
&OS
) {
1093 OS
<< "Registered addresses:\n" << SymbolInfos
<< FileInfos
;
1096 void Session::modifyPassConfig(const Triple
&TT
,
1097 PassConfiguration
&PassConfig
) {
1098 if (!CheckFiles
.empty())
1099 PassConfig
.PostFixupPasses
.push_back([this](LinkGraph
&G
) {
1100 auto &EPC
= ES
.getExecutorProcessControl();
1101 if (EPC
.getTargetTriple().getObjectFormat() == Triple::ELF
)
1102 return registerELFGraphInfo(*this, G
);
1104 if (EPC
.getTargetTriple().getObjectFormat() == Triple::MachO
)
1105 return registerMachOGraphInfo(*this, G
);
1107 return make_error
<StringError
>("Unsupported object format for GOT/stub "
1109 inconvertibleErrorCode());
1113 PassConfig
.PostFixupPasses
.push_back([](LinkGraph
&G
) -> Error
{
1114 outs() << "Link graph \"" << G
.getName() << "\" post-fixup:\n";
1116 return Error::success();
1119 PassConfig
.PrePrunePasses
.push_back(
1120 [this](LinkGraph
&G
) { return applyHarnessPromotions(*this, G
); });
1123 PassConfig
.PrePrunePasses
.push_back([this](LinkGraph
&G
) -> Error
{
1124 SizeBeforePruning
+= computeTotalBlockSizes(G
);
1125 return Error::success();
1127 PassConfig
.PostFixupPasses
.push_back([this](LinkGraph
&G
) -> Error
{
1128 SizeAfterFixups
+= computeTotalBlockSizes(G
);
1129 return Error::success();
1133 if (ShowRelocatedSectionContents
)
1134 PassConfig
.PostFixupPasses
.push_back([](LinkGraph
&G
) -> Error
{
1135 outs() << "Relocated section contents for " << G
.getName() << ":\n";
1136 dumpSectionContents(outs(), G
);
1137 return Error::success();
1140 if (AddSelfRelocations
)
1141 PassConfig
.PostPrunePasses
.push_back(addSelfRelocations
);
1144 Expected
<Session::FileInfo
&> Session::findFileInfo(StringRef FileName
) {
1145 auto FileInfoItr
= FileInfos
.find(FileName
);
1146 if (FileInfoItr
== FileInfos
.end())
1147 return make_error
<StringError
>("file \"" + FileName
+ "\" not recognized",
1148 inconvertibleErrorCode());
1149 return FileInfoItr
->second
;
1152 Expected
<Session::MemoryRegionInfo
&>
1153 Session::findSectionInfo(StringRef FileName
, StringRef SectionName
) {
1154 auto FI
= findFileInfo(FileName
);
1156 return FI
.takeError();
1157 auto SecInfoItr
= FI
->SectionInfos
.find(SectionName
);
1158 if (SecInfoItr
== FI
->SectionInfos
.end())
1159 return make_error
<StringError
>("no section \"" + SectionName
+
1160 "\" registered for file \"" + FileName
+
1162 inconvertibleErrorCode());
1163 return SecInfoItr
->second
;
1166 Expected
<Session::MemoryRegionInfo
&>
1167 Session::findStubInfo(StringRef FileName
, StringRef TargetName
) {
1168 auto FI
= findFileInfo(FileName
);
1170 return FI
.takeError();
1171 auto StubInfoItr
= FI
->StubInfos
.find(TargetName
);
1172 if (StubInfoItr
== FI
->StubInfos
.end())
1173 return make_error
<StringError
>("no stub for \"" + TargetName
+
1174 "\" registered for file \"" + FileName
+
1176 inconvertibleErrorCode());
1177 return StubInfoItr
->second
;
1180 Expected
<Session::MemoryRegionInfo
&>
1181 Session::findGOTEntryInfo(StringRef FileName
, StringRef TargetName
) {
1182 auto FI
= findFileInfo(FileName
);
1184 return FI
.takeError();
1185 auto GOTInfoItr
= FI
->GOTEntryInfos
.find(TargetName
);
1186 if (GOTInfoItr
== FI
->GOTEntryInfos
.end())
1187 return make_error
<StringError
>("no GOT entry for \"" + TargetName
+
1188 "\" registered for file \"" + FileName
+
1190 inconvertibleErrorCode());
1191 return GOTInfoItr
->second
;
1194 bool Session::isSymbolRegistered(StringRef SymbolName
) {
1195 return SymbolInfos
.count(SymbolName
);
1198 Expected
<Session::MemoryRegionInfo
&>
1199 Session::findSymbolInfo(StringRef SymbolName
, Twine ErrorMsgStem
) {
1200 auto SymInfoItr
= SymbolInfos
.find(SymbolName
);
1201 if (SymInfoItr
== SymbolInfos
.end())
1202 return make_error
<StringError
>(ErrorMsgStem
+ ": symbol " + SymbolName
+
1204 inconvertibleErrorCode());
1205 return SymInfoItr
->second
;
1208 } // end namespace llvm
1210 static Triple
getFirstFileTriple() {
1211 static Triple FirstTT
= []() {
1212 assert(!InputFiles
.empty() && "InputFiles can not be empty");
1213 for (auto InputFile
: InputFiles
) {
1215 ExitOnErr(errorOrToExpected(MemoryBuffer::getFile(InputFile
)));
1216 switch (identify_magic(ObjBuffer
->getBuffer())) {
1217 case file_magic::elf_relocatable
:
1218 case file_magic::macho_object
:
1219 case file_magic::coff_object
: {
1220 auto Obj
= ExitOnErr(
1221 object::ObjectFile::createObjectFile(ObjBuffer
->getMemBufferRef()));
1222 return Obj
->makeTriple();
1234 static Error
sanitizeArguments(const Triple
&TT
, const char *ArgV0
) {
1236 // -noexec and --args should not be used together.
1237 if (NoExec
&& !InputArgv
.empty())
1238 errs() << "Warning: --args passed to -noexec run will be ignored.\n";
1240 // Set the entry point name if not specified.
1241 if (EntryPointName
.empty())
1242 EntryPointName
= TT
.getObjectFormat() == Triple::MachO
? "_main" : "main";
1244 // Disable debugger support by default in noexec tests.
1245 if (DebuggerSupport
.getNumOccurrences() == 0 && NoExec
)
1246 DebuggerSupport
= false;
1248 // If -slab-allocate is passed, check that we're not trying to use it in
1249 // -oop-executor or -oop-executor-connect mode.
1251 // FIXME: Remove once we enable remote slab allocation.
1252 if (SlabAllocateSizeString
!= "") {
1253 if (OutOfProcessExecutor
.getNumOccurrences() ||
1254 OutOfProcessExecutorConnect
.getNumOccurrences())
1255 return make_error
<StringError
>(
1256 "-slab-allocate cannot be used with -oop-executor or "
1257 "-oop-executor-connect",
1258 inconvertibleErrorCode());
1261 // If -slab-address is passed, require -slab-allocate and -noexec
1262 if (SlabAddress
!= ~0ULL) {
1263 if (SlabAllocateSizeString
== "" || !NoExec
)
1264 return make_error
<StringError
>(
1265 "-slab-address requires -slab-allocate and -noexec",
1266 inconvertibleErrorCode());
1268 if (SlabPageSize
== 0)
1269 errs() << "Warning: -slab-address used without -slab-page-size.\n";
1272 if (SlabPageSize
!= 0) {
1273 // -slab-page-size requires slab alloc.
1274 if (SlabAllocateSizeString
== "")
1275 return make_error
<StringError
>("-slab-page-size requires -slab-allocate",
1276 inconvertibleErrorCode());
1278 // Check -slab-page-size / -noexec interactions.
1280 if (auto RealPageSize
= sys::Process::getPageSize()) {
1281 if (SlabPageSize
% *RealPageSize
)
1282 return make_error
<StringError
>(
1283 "-slab-page-size must be a multiple of real page size for exec "
1284 "tests (did you mean to use -noexec ?)\n",
1285 inconvertibleErrorCode());
1287 errs() << "Could not retrieve process page size:\n";
1288 logAllUnhandledErrors(RealPageSize
.takeError(), errs(), "");
1289 errs() << "Executing with slab page size = "
1290 << formatv("{0:x}", SlabPageSize
) << ".\n"
1291 << "Tool may crash if " << formatv("{0:x}", SlabPageSize
)
1292 << " is not a multiple of the real process page size.\n"
1293 << "(did you mean to use -noexec ?)";
1298 // Only one of -oop-executor and -oop-executor-connect can be used.
1299 if (!!OutOfProcessExecutor
.getNumOccurrences() &&
1300 !!OutOfProcessExecutorConnect
.getNumOccurrences())
1301 return make_error
<StringError
>(
1302 "Only one of -" + OutOfProcessExecutor
.ArgStr
+ " and -" +
1303 OutOfProcessExecutorConnect
.ArgStr
+ " can be specified",
1304 inconvertibleErrorCode());
1306 // If -oop-executor was used but no value was specified then use a sensible
1308 if (!!OutOfProcessExecutor
.getNumOccurrences() &&
1309 OutOfProcessExecutor
.empty()) {
1310 SmallString
<256> OOPExecutorPath(sys::fs::getMainExecutable(
1311 ArgV0
, reinterpret_cast<void *>(&sanitizeArguments
)));
1312 sys::path::remove_filename(OOPExecutorPath
);
1313 sys::path::append(OOPExecutorPath
, "llvm-jitlink-executor");
1314 OutOfProcessExecutor
= OOPExecutorPath
.str().str();
1317 return Error::success();
1320 static void addPhonyExternalsGenerator(Session
&S
) {
1321 S
.MainJD
->addGenerator(std::make_unique
<PhonyExternalsGenerator
>());
1324 static Error
createJITDylibs(Session
&S
,
1325 std::map
<unsigned, JITDylib
*> &IdxToJD
) {
1326 // First, set up JITDylibs.
1327 LLVM_DEBUG(dbgs() << "Creating JITDylibs...\n");
1329 // Create a "main" JITLinkDylib.
1330 IdxToJD
[0] = S
.MainJD
;
1331 S
.JDSearchOrder
.push_back({S
.MainJD
, JITDylibLookupFlags::MatchAllSymbols
});
1332 LLVM_DEBUG(dbgs() << " 0: " << S
.MainJD
->getName() << "\n");
1334 // Add any extra JITDylibs from the command line.
1335 for (auto JDItr
= JITDylibs
.begin(), JDEnd
= JITDylibs
.end();
1336 JDItr
!= JDEnd
; ++JDItr
) {
1337 auto JD
= S
.ES
.createJITDylib(*JDItr
);
1339 return JD
.takeError();
1340 unsigned JDIdx
= JITDylibs
.getPosition(JDItr
- JITDylibs
.begin());
1341 IdxToJD
[JDIdx
] = &*JD
;
1342 S
.JDSearchOrder
.push_back({&*JD
, JITDylibLookupFlags::MatchAllSymbols
});
1343 LLVM_DEBUG(dbgs() << " " << JDIdx
<< ": " << JD
->getName() << "\n");
1348 dbgs() << "Dylib search order is [ ";
1349 for (auto &KV
: S
.JDSearchOrder
)
1350 dbgs() << KV
.first
->getName() << " ";
1354 return Error::success();
1357 static Error
addAbsoluteSymbols(Session
&S
,
1358 const std::map
<unsigned, JITDylib
*> &IdxToJD
) {
1359 // Define absolute symbols.
1360 LLVM_DEBUG(dbgs() << "Defining absolute symbols...\n");
1361 for (auto AbsDefItr
= AbsoluteDefs
.begin(), AbsDefEnd
= AbsoluteDefs
.end();
1362 AbsDefItr
!= AbsDefEnd
; ++AbsDefItr
) {
1363 unsigned AbsDefArgIdx
=
1364 AbsoluteDefs
.getPosition(AbsDefItr
- AbsoluteDefs
.begin());
1365 auto &JD
= *std::prev(IdxToJD
.lower_bound(AbsDefArgIdx
))->second
;
1367 StringRef AbsDefStmt
= *AbsDefItr
;
1368 size_t EqIdx
= AbsDefStmt
.find_first_of('=');
1369 if (EqIdx
== StringRef::npos
)
1370 return make_error
<StringError
>("Invalid absolute define \"" + AbsDefStmt
+
1371 "\". Syntax: <name>=<addr>",
1372 inconvertibleErrorCode());
1373 StringRef Name
= AbsDefStmt
.substr(0, EqIdx
).trim();
1374 StringRef AddrStr
= AbsDefStmt
.substr(EqIdx
+ 1).trim();
1377 if (AddrStr
.getAsInteger(0, Addr
))
1378 return make_error
<StringError
>("Invalid address expression \"" + AddrStr
+
1379 "\" in absolute symbol definition \"" +
1381 inconvertibleErrorCode());
1382 JITEvaluatedSymbol
AbsDef(Addr
, JITSymbolFlags::Exported
);
1383 if (auto Err
= JD
.define(absoluteSymbols({{S
.ES
.intern(Name
), AbsDef
}})))
1386 // Register the absolute symbol with the session symbol infos.
1387 S
.SymbolInfos
[Name
] = {ArrayRef
<char>(), Addr
};
1390 return Error::success();
1393 static Error
addAliases(Session
&S
,
1394 const std::map
<unsigned, JITDylib
*> &IdxToJD
) {
1395 // Define absolute symbols.
1396 LLVM_DEBUG(dbgs() << "Defining aliases...\n");
1397 for (auto AliasItr
= Aliases
.begin(), AliasEnd
= Aliases
.end();
1398 AliasItr
!= AliasEnd
; ++AliasItr
) {
1399 unsigned AliasArgIdx
= Aliases
.getPosition(AliasItr
- Aliases
.begin());
1400 auto &JD
= *std::prev(IdxToJD
.lower_bound(AliasArgIdx
))->second
;
1402 StringRef AliasStmt
= *AliasItr
;
1403 size_t EqIdx
= AliasStmt
.find_first_of('=');
1404 if (EqIdx
== StringRef::npos
)
1405 return make_error
<StringError
>("Invalid alias definition \"" + AliasStmt
+
1406 "\". Syntax: <name>=<addr>",
1407 inconvertibleErrorCode());
1408 StringRef Alias
= AliasStmt
.substr(0, EqIdx
).trim();
1409 StringRef Aliasee
= AliasStmt
.substr(EqIdx
+ 1).trim();
1412 SAM
[S
.ES
.intern(Alias
)] = {S
.ES
.intern(Aliasee
), JITSymbolFlags::Exported
};
1413 if (auto Err
= JD
.define(symbolAliases(std::move(SAM
))))
1417 return Error::success();
1420 static Error
addTestHarnesses(Session
&S
) {
1421 LLVM_DEBUG(dbgs() << "Adding test harness objects...\n");
1422 for (auto HarnessFile
: TestHarnesses
) {
1423 LLVM_DEBUG(dbgs() << " " << HarnessFile
<< "\n");
1424 auto ObjBuffer
= errorOrToExpected(MemoryBuffer::getFile(HarnessFile
));
1426 return ObjBuffer
.takeError();
1427 if (auto Err
= S
.ObjLayer
.add(*S
.MainJD
, std::move(*ObjBuffer
)))
1430 return Error::success();
1433 static Error
addObjects(Session
&S
,
1434 const std::map
<unsigned, JITDylib
*> &IdxToJD
) {
1436 // Load each object into the corresponding JITDylib..
1437 LLVM_DEBUG(dbgs() << "Adding objects...\n");
1438 for (auto InputFileItr
= InputFiles
.begin(), InputFileEnd
= InputFiles
.end();
1439 InputFileItr
!= InputFileEnd
; ++InputFileItr
) {
1440 unsigned InputFileArgIdx
=
1441 InputFiles
.getPosition(InputFileItr
- InputFiles
.begin());
1442 const std::string
&InputFile
= *InputFileItr
;
1443 if (StringRef(InputFile
).endswith(".a"))
1445 auto &JD
= *std::prev(IdxToJD
.lower_bound(InputFileArgIdx
))->second
;
1446 LLVM_DEBUG(dbgs() << " " << InputFileArgIdx
<< ": \"" << InputFile
1447 << "\" to " << JD
.getName() << "\n";);
1448 auto ObjBuffer
= errorOrToExpected(MemoryBuffer::getFile(InputFile
));
1450 return ObjBuffer
.takeError();
1452 if (S
.HarnessFiles
.empty()) {
1453 if (auto Err
= S
.ObjLayer
.add(JD
, std::move(*ObjBuffer
)))
1456 // We're in -harness mode. Use a custom interface for this
1459 getTestObjectFileInterface(S
, (*ObjBuffer
)->getMemBufferRef());
1461 return ObjInterface
.takeError();
1462 if (auto Err
= S
.ObjLayer
.add(JD
, std::move(*ObjBuffer
),
1463 std::move(*ObjInterface
)))
1468 return Error::success();
1471 static Expected
<MaterializationUnit::Interface
>
1472 getObjectFileInterfaceHidden(ExecutionSession
&ES
, MemoryBufferRef ObjBuffer
) {
1473 auto I
= getObjectFileInterface(ES
, ObjBuffer
);
1475 for (auto &KV
: I
->SymbolFlags
)
1476 KV
.second
&= ~JITSymbolFlags::Exported
;
1481 static Error
addLibraries(Session
&S
,
1482 const std::map
<unsigned, JITDylib
*> &IdxToJD
) {
1484 // 1. Collect search paths for each JITDylib.
1485 DenseMap
<const JITDylib
*, SmallVector
<StringRef
, 2>> JDSearchPaths
;
1487 for (auto LSPItr
= LibrarySearchPaths
.begin(),
1488 LSPEnd
= LibrarySearchPaths
.end();
1489 LSPItr
!= LSPEnd
; ++LSPItr
) {
1490 unsigned LibrarySearchPathIdx
=
1491 LibrarySearchPaths
.getPosition(LSPItr
- LibrarySearchPaths
.begin());
1492 auto &JD
= *std::prev(IdxToJD
.lower_bound(LibrarySearchPathIdx
))->second
;
1494 StringRef LibrarySearchPath
= *LSPItr
;
1495 if (sys::fs::get_file_type(LibrarySearchPath
) !=
1496 sys::fs::file_type::directory_file
)
1497 return make_error
<StringError
>("While linking " + JD
.getName() + ", -L" +
1499 " does not point to a directory",
1500 inconvertibleErrorCode());
1502 JDSearchPaths
[&JD
].push_back(*LSPItr
);
1506 if (!JDSearchPaths
.empty())
1507 dbgs() << "Search paths:\n";
1508 for (auto &KV
: JDSearchPaths
) {
1509 dbgs() << " " << KV
.first
->getName() << ": [";
1510 for (auto &LibSearchPath
: KV
.second
)
1511 dbgs() << " \"" << LibSearchPath
<< "\"";
1516 // 2. Collect library loads
1517 struct LibraryLoad
{
1519 bool IsPath
= false;
1521 StringRef
*CandidateExtensions
;
1522 enum { Standard
, Hidden
} Modifier
;
1524 std::vector
<LibraryLoad
> LibraryLoads
;
1525 // Add archive files from the inputs to LibraryLoads.
1526 for (auto InputFileItr
= InputFiles
.begin(), InputFileEnd
= InputFiles
.end();
1527 InputFileItr
!= InputFileEnd
; ++InputFileItr
) {
1528 StringRef InputFile
= *InputFileItr
;
1529 if (!InputFile
.endswith(".a"))
1532 LL
.LibName
= InputFile
;
1534 LL
.Position
= InputFiles
.getPosition(InputFileItr
- InputFiles
.begin());
1535 LL
.CandidateExtensions
= nullptr;
1536 LL
.Modifier
= LibraryLoad::Standard
;
1537 LibraryLoads
.push_back(std::move(LL
));
1540 // Add -load_hidden arguments to LibraryLoads.
1541 for (auto LibItr
= LoadHidden
.begin(), LibEnd
= LoadHidden
.end();
1542 LibItr
!= LibEnd
; ++LibItr
) {
1544 LL
.LibName
= *LibItr
;
1546 LL
.Position
= LoadHidden
.getPosition(LibItr
- LoadHidden
.begin());
1547 LL
.CandidateExtensions
= nullptr;
1548 LL
.Modifier
= LibraryLoad::Hidden
;
1549 LibraryLoads
.push_back(std::move(LL
));
1551 StringRef StandardExtensions
[] = {".so", ".dylib", ".a"};
1552 StringRef ArchiveExtensionsOnly
[] = {".a"};
1554 // Add -lx arguments to LibraryLoads.
1555 for (auto LibItr
= Libraries
.begin(), LibEnd
= Libraries
.end();
1556 LibItr
!= LibEnd
; ++LibItr
) {
1558 LL
.LibName
= *LibItr
;
1559 LL
.Position
= Libraries
.getPosition(LibItr
- Libraries
.begin());
1560 LL
.CandidateExtensions
= StandardExtensions
;
1561 LL
.Modifier
= LibraryLoad::Standard
;
1562 LibraryLoads
.push_back(std::move(LL
));
1565 // Add -hidden-lx arguments to LibraryLoads.
1566 for (auto LibHiddenItr
= LibrariesHidden
.begin(),
1567 LibHiddenEnd
= LibrariesHidden
.end();
1568 LibHiddenItr
!= LibHiddenEnd
; ++LibHiddenItr
) {
1570 LL
.LibName
= *LibHiddenItr
;
1572 LibrariesHidden
.getPosition(LibHiddenItr
- LibrariesHidden
.begin());
1573 LL
.CandidateExtensions
= ArchiveExtensionsOnly
;
1574 LL
.Modifier
= LibraryLoad::Hidden
;
1575 LibraryLoads
.push_back(std::move(LL
));
1578 // If there are any load-<modified> options then turn on flag overrides
1579 // to avoid flag mismatch errors.
1580 if (!LibrariesHidden
.empty() || !LoadHidden
.empty())
1581 S
.ObjLayer
.setOverrideObjectFlagsWithResponsibilityFlags(true);
1583 // Sort library loads by position in the argument list.
1584 llvm::sort(LibraryLoads
, [](const LibraryLoad
&LHS
, const LibraryLoad
&RHS
) {
1585 return LHS
.Position
< RHS
.Position
;
1588 // 3. Process library loads.
1589 auto AddArchive
= [&](const char *Path
, const LibraryLoad
&LL
)
1590 -> Expected
<std::unique_ptr
<StaticLibraryDefinitionGenerator
>> {
1591 unique_function
<Expected
<MaterializationUnit::Interface
>(
1592 ExecutionSession
& ES
, MemoryBufferRef ObjBuffer
)>
1593 GetObjFileInterface
;
1594 switch (LL
.Modifier
) {
1595 case LibraryLoad::Standard
:
1596 GetObjFileInterface
= getObjectFileInterface
;
1598 case LibraryLoad::Hidden
:
1599 GetObjFileInterface
= getObjectFileInterfaceHidden
;
1602 return StaticLibraryDefinitionGenerator::Load(
1603 S
.ObjLayer
, Path
, S
.ES
.getExecutorProcessControl().getTargetTriple(),
1604 std::move(GetObjFileInterface
));
1607 for (auto &LL
: LibraryLoads
) {
1608 bool LibFound
= false;
1609 auto &JD
= *std::prev(IdxToJD
.lower_bound(LL
.Position
))->second
;
1611 // If this is the name of a JITDylib then link against that.
1612 if (auto *LJD
= S
.ES
.getJITDylibByName(LL
.LibName
)) {
1613 JD
.addToLinkOrder(*LJD
);
1618 auto G
= AddArchive(LL
.LibName
.str().c_str(), LL
);
1620 return createFileError(LL
.LibName
, G
.takeError());
1621 JD
.addGenerator(std::move(*G
));
1623 dbgs() << "Adding generator for static library " << LL
.LibName
<< " to "
1624 << JD
.getName() << "\n";
1629 // Otherwise look through the search paths.
1630 auto JDSearchPathsItr
= JDSearchPaths
.find(&JD
);
1631 if (JDSearchPathsItr
!= JDSearchPaths
.end()) {
1632 for (StringRef SearchPath
: JDSearchPathsItr
->second
) {
1633 for (const char *LibExt
: {".dylib", ".so", ".a"}) {
1634 SmallVector
<char, 256> LibPath
;
1635 LibPath
.reserve(SearchPath
.size() + strlen("lib") +
1636 LL
.LibName
.size() + strlen(LibExt
) +
1637 2); // +2 for pathsep, null term.
1638 llvm::copy(SearchPath
, std::back_inserter(LibPath
));
1639 sys::path::append(LibPath
, "lib" + LL
.LibName
+ LibExt
);
1640 LibPath
.push_back('\0');
1642 // Skip missing or non-regular paths.
1643 if (sys::fs::get_file_type(LibPath
.data()) !=
1644 sys::fs::file_type::regular_file
) {
1649 if (auto EC
= identify_magic(LibPath
, Magic
)) {
1650 // If there was an error loading the file then skip it.
1652 dbgs() << "Library search found \"" << LibPath
1653 << "\", but could not identify file type (" << EC
.message()
1654 << "). Skipping.\n";
1659 // We identified the magic. Assume that we can load it -- we'll reset
1660 // in the default case.
1663 case file_magic::elf_shared_object
:
1664 case file_magic::macho_dynamically_linked_shared_lib
: {
1665 // TODO: On first reference to LibPath this should create a JITDylib
1666 // with a generator and add it to JD's links-against list. Subsquent
1667 // references should use the JITDylib created on the first
1670 EPCDynamicLibrarySearchGenerator::Load(S
.ES
, LibPath
.data());
1672 return G
.takeError();
1674 dbgs() << "Adding generator for dynamic library "
1675 << LibPath
.data() << " to " << JD
.getName() << "\n";
1677 JD
.addGenerator(std::move(*G
));
1680 case file_magic::archive
:
1681 case file_magic::macho_universal_binary
: {
1682 auto G
= AddArchive(LibPath
.data(), LL
);
1684 return G
.takeError();
1685 JD
.addGenerator(std::move(*G
));
1687 dbgs() << "Adding generator for static library " << LibPath
.data()
1688 << " to " << JD
.getName() << "\n";
1693 // This file isn't a recognized library kind.
1695 dbgs() << "Library search found \"" << LibPath
1696 << "\", but file type is not supported. Skipping.\n";
1710 return make_error
<StringError
>("While linking " + JD
.getName() +
1711 ", could not find library for -l" +
1713 inconvertibleErrorCode());
1716 return Error::success();
1719 static Error
addSessionInputs(Session
&S
) {
1720 std::map
<unsigned, JITDylib
*> IdxToJD
;
1722 if (auto Err
= createJITDylibs(S
, IdxToJD
))
1725 if (auto Err
= addAbsoluteSymbols(S
, IdxToJD
))
1728 if (auto Err
= addAliases(S
, IdxToJD
))
1731 if (!TestHarnesses
.empty())
1732 if (auto Err
= addTestHarnesses(S
))
1735 if (auto Err
= addObjects(S
, IdxToJD
))
1738 if (auto Err
= addLibraries(S
, IdxToJD
))
1741 return Error::success();
1746 const Target
*TheTarget
;
1747 std::unique_ptr
<MCSubtargetInfo
> STI
;
1748 std::unique_ptr
<MCRegisterInfo
> MRI
;
1749 std::unique_ptr
<MCAsmInfo
> MAI
;
1750 std::unique_ptr
<MCContext
> Ctx
;
1751 std::unique_ptr
<MCDisassembler
> Disassembler
;
1752 std::unique_ptr
<MCInstrInfo
> MII
;
1753 std::unique_ptr
<MCInstrAnalysis
> MIA
;
1754 std::unique_ptr
<MCInstPrinter
> InstPrinter
;
1756 } // anonymous namespace
1758 static TargetInfo
getTargetInfo(const Triple
&TT
) {
1759 auto TripleName
= TT
.str();
1760 std::string ErrorStr
;
1761 const Target
*TheTarget
= TargetRegistry::lookupTarget(TripleName
, ErrorStr
);
1763 ExitOnErr(make_error
<StringError
>("Error accessing target '" + TripleName
+
1765 inconvertibleErrorCode()));
1767 std::unique_ptr
<MCSubtargetInfo
> STI(
1768 TheTarget
->createMCSubtargetInfo(TripleName
, "", ""));
1771 make_error
<StringError
>("Unable to create subtarget for " + TripleName
,
1772 inconvertibleErrorCode()));
1774 std::unique_ptr
<MCRegisterInfo
> MRI(TheTarget
->createMCRegInfo(TripleName
));
1776 ExitOnErr(make_error
<StringError
>("Unable to create target register info "
1779 inconvertibleErrorCode()));
1781 MCTargetOptions MCOptions
;
1782 std::unique_ptr
<MCAsmInfo
> MAI(
1783 TheTarget
->createMCAsmInfo(*MRI
, TripleName
, MCOptions
));
1785 ExitOnErr(make_error
<StringError
>("Unable to create target asm info " +
1787 inconvertibleErrorCode()));
1789 auto Ctx
= std::make_unique
<MCContext
>(Triple(TripleName
), MAI
.get(),
1790 MRI
.get(), STI
.get());
1792 std::unique_ptr
<MCDisassembler
> Disassembler(
1793 TheTarget
->createMCDisassembler(*STI
, *Ctx
));
1795 ExitOnErr(make_error
<StringError
>("Unable to create disassembler for " +
1797 inconvertibleErrorCode()));
1799 std::unique_ptr
<MCInstrInfo
> MII(TheTarget
->createMCInstrInfo());
1801 ExitOnErr(make_error
<StringError
>("Unable to create instruction info for" +
1803 inconvertibleErrorCode()));
1805 std::unique_ptr
<MCInstrAnalysis
> MIA(
1806 TheTarget
->createMCInstrAnalysis(MII
.get()));
1808 ExitOnErr(make_error
<StringError
>(
1809 "Unable to create instruction analysis for" + TripleName
,
1810 inconvertibleErrorCode()));
1812 std::unique_ptr
<MCInstPrinter
> InstPrinter(
1813 TheTarget
->createMCInstPrinter(Triple(TripleName
), 0, *MAI
, *MII
, *MRI
));
1815 ExitOnErr(make_error
<StringError
>(
1816 "Unable to create instruction printer for" + TripleName
,
1817 inconvertibleErrorCode()));
1818 return {TheTarget
, std::move(STI
), std::move(MRI
),
1819 std::move(MAI
), std::move(Ctx
), std::move(Disassembler
),
1820 std::move(MII
), std::move(MIA
), std::move(InstPrinter
)};
1823 static Error
runChecks(Session
&S
) {
1824 const auto &TT
= S
.ES
.getExecutorProcessControl().getTargetTriple();
1826 if (CheckFiles
.empty())
1827 return Error::success();
1829 LLVM_DEBUG(dbgs() << "Running checks...\n");
1831 auto TI
= getTargetInfo(TT
);
1833 auto IsSymbolValid
= [&S
](StringRef Symbol
) {
1834 return S
.isSymbolRegistered(Symbol
);
1837 auto GetSymbolInfo
= [&S
](StringRef Symbol
) {
1838 return S
.findSymbolInfo(Symbol
, "Can not get symbol info");
1841 auto GetSectionInfo
= [&S
](StringRef FileName
, StringRef SectionName
) {
1842 return S
.findSectionInfo(FileName
, SectionName
);
1845 auto GetStubInfo
= [&S
](StringRef FileName
, StringRef SectionName
) {
1846 return S
.findStubInfo(FileName
, SectionName
);
1849 auto GetGOTInfo
= [&S
](StringRef FileName
, StringRef SectionName
) {
1850 return S
.findGOTEntryInfo(FileName
, SectionName
);
1853 RuntimeDyldChecker
Checker(
1854 IsSymbolValid
, GetSymbolInfo
, GetSectionInfo
, GetStubInfo
, GetGOTInfo
,
1855 TT
.isLittleEndian() ? support::little
: support::big
,
1856 TI
.Disassembler
.get(), TI
.InstPrinter
.get(), dbgs());
1858 std::string CheckLineStart
= "# " + CheckName
+ ":";
1859 for (auto &CheckFile
: CheckFiles
) {
1860 auto CheckerFileBuf
=
1861 ExitOnErr(errorOrToExpected(MemoryBuffer::getFile(CheckFile
)));
1862 if (!Checker
.checkAllRulesInBuffer(CheckLineStart
, &*CheckerFileBuf
))
1863 ExitOnErr(make_error
<StringError
>(
1864 "Some checks in " + CheckFile
+ " failed", inconvertibleErrorCode()));
1867 return Error::success();
1870 static Error
addSelfRelocations(LinkGraph
&G
) {
1871 auto TI
= getTargetInfo(G
.getTargetTriple());
1872 for (auto *Sym
: G
.defined_symbols())
1873 if (Sym
->isCallable())
1874 if (auto Err
= addFunctionPointerRelocationsToCurrentSymbol(
1875 *Sym
, G
, *TI
.Disassembler
, *TI
.MIA
))
1877 return Error::success();
1880 static void dumpSessionStats(Session
&S
) {
1883 if (!OrcRuntime
.empty())
1884 outs() << "Note: Session stats include runtime and entry point lookup, but "
1885 "not JITDylib initialization/deinitialization.\n";
1887 outs() << " Total size of all blocks before pruning: "
1888 << S
.SizeBeforePruning
1889 << "\n Total size of all blocks after fixups: " << S
.SizeAfterFixups
1893 static Expected
<JITEvaluatedSymbol
> getMainEntryPoint(Session
&S
) {
1894 return S
.ES
.lookup(S
.JDSearchOrder
, S
.ES
.intern(EntryPointName
));
1897 static Expected
<JITEvaluatedSymbol
> getOrcRuntimeEntryPoint(Session
&S
) {
1898 std::string RuntimeEntryPoint
= "__orc_rt_run_program_wrapper";
1899 const auto &TT
= S
.ES
.getExecutorProcessControl().getTargetTriple();
1900 if (TT
.getObjectFormat() == Triple::MachO
)
1901 RuntimeEntryPoint
= '_' + RuntimeEntryPoint
;
1902 return S
.ES
.lookup(S
.JDSearchOrder
, S
.ES
.intern(RuntimeEntryPoint
));
1905 static Expected
<int> runWithRuntime(Session
&S
, ExecutorAddr EntryPointAddr
) {
1906 StringRef DemangledEntryPoint
= EntryPointName
;
1907 const auto &TT
= S
.ES
.getExecutorProcessControl().getTargetTriple();
1908 if (TT
.getObjectFormat() == Triple::MachO
&&
1909 DemangledEntryPoint
.front() == '_')
1910 DemangledEntryPoint
= DemangledEntryPoint
.drop_front();
1911 using llvm::orc::shared::SPSString
;
1912 using SPSRunProgramSig
=
1913 int64_t(SPSString
, SPSString
, shared::SPSSequence
<SPSString
>);
1915 if (auto Err
= S
.ES
.callSPSWrapper
<SPSRunProgramSig
>(
1916 EntryPointAddr
, Result
, S
.MainJD
->getName(), DemangledEntryPoint
,
1917 static_cast<std::vector
<std::string
> &>(InputArgv
)))
1918 return std::move(Err
);
1922 static Expected
<int> runWithoutRuntime(Session
&S
,
1923 ExecutorAddr EntryPointAddr
) {
1924 return S
.ES
.getExecutorProcessControl().runAsMain(EntryPointAddr
, InputArgv
);
1928 struct JITLinkTimers
{
1929 TimerGroup JITLinkTG
{"llvm-jitlink timers", "timers for llvm-jitlink phases"};
1930 Timer LoadObjectsTimer
{"load", "time to load/add object files", JITLinkTG
};
1931 Timer LinkTimer
{"link", "time to link object files", JITLinkTG
};
1932 Timer RunTimer
{"run", "time to execute jitlink'd code", JITLinkTG
};
1936 int main(int argc
, char *argv
[]) {
1937 InitLLVM
X(argc
, argv
);
1939 InitializeAllTargetInfos();
1940 InitializeAllTargetMCs();
1941 InitializeAllDisassemblers();
1943 cl::HideUnrelatedOptions({&JITLinkCategory
, &getColorCategory()});
1944 cl::ParseCommandLineOptions(argc
, argv
, "llvm jitlink tool");
1945 ExitOnErr
.setBanner(std::string(argv
[0]) + ": ");
1947 /// If timers are enabled, create a JITLinkTimers instance.
1948 std::unique_ptr
<JITLinkTimers
> Timers
=
1949 ShowTimes
? std::make_unique
<JITLinkTimers
>() : nullptr;
1951 ExitOnErr(sanitizeArguments(getFirstFileTriple(), argv
[0]));
1953 auto S
= ExitOnErr(Session::Create(getFirstFileTriple()));
1956 TimeRegion
TR(Timers
? &Timers
->LoadObjectsTimer
: nullptr);
1957 ExitOnErr(addSessionInputs(*S
));
1961 addPhonyExternalsGenerator(*S
);
1963 if (ShowInitialExecutionSessionState
)
1966 JITEvaluatedSymbol EntryPoint
= nullptr;
1968 TimeRegion
TR(Timers
? &Timers
->LinkTimer
: nullptr);
1969 // Find the entry-point function unconditionally, since we want to force
1970 // it to be materialized to collect stats.
1971 EntryPoint
= ExitOnErr(getMainEntryPoint(*S
));
1973 dbgs() << "Using entry point \"" << EntryPointName
1974 << "\": " << formatv("{0:x16}", EntryPoint
.getAddress()) << "\n";
1977 // If we're running with the ORC runtime then replace the entry-point
1978 // with the __orc_rt_run_program symbol.
1979 if (!OrcRuntime
.empty()) {
1980 EntryPoint
= ExitOnErr(getOrcRuntimeEntryPoint(*S
));
1982 dbgs() << "(called via __orc_rt_run_program_wrapper at "
1983 << formatv("{0:x16}", EntryPoint
.getAddress()) << ")\n";
1988 if (ShowEntryExecutionSessionState
)
1992 S
->dumpSessionInfo(outs());
1994 ExitOnErr(runChecks(*S
));
1996 dumpSessionStats(*S
);
2003 LLVM_DEBUG(dbgs() << "Running \"" << EntryPointName
<< "\"...\n");
2004 TimeRegion
TR(Timers
? &Timers
->RunTimer
: nullptr);
2005 if (!OrcRuntime
.empty())
2007 ExitOnErr(runWithRuntime(*S
, ExecutorAddr(EntryPoint
.getAddress())));
2010 runWithoutRuntime(*S
, ExecutorAddr(EntryPoint
.getAddress())));
2013 // Destroy the session.
2014 ExitOnErr(S
->ES
.endSession());
2017 // If the executing code set a test result override then use that.
2018 if (UseTestResultOverride
)
2019 Result
= TestResultOverride
;