25#define DEBUG_TYPE "orc"
39class SPSMachOExecutorSymbolFlags;
51 return SPSMachOJITDylibDepInfo::AsArgList::serialize(OB, DDI.
Sealed,
57 return SPSMachOJITDylibDepInfo::AsArgList::deserialize(IB, DDI.
Sealed,
66 using UT = std::underlying_type_t<MachOPlatform::MachOExecutorSymbolFlags>;
104using SPSRegisterSymbolsArgs =
107 SPSMachOExecutorSymbolFlags>>>;
109std::unique_ptr<jitlink::LinkGraph> createPlatformGraph(
MachOPlatform &MOP,
112 return std::make_unique<jitlink::LinkGraph>(
113 std::move(Name), ES.getSymbolStringPool(), ES.getTargetTriple(),
119class MachOPlatformCompleteBootstrapMaterializationUnit
122 using SymbolTableVector =
126 MachOPlatformCompleteBootstrapMaterializationUnit(
136 MOP(MOP), PlatformJDName(PlatformJDName),
137 CompleteBootstrapSymbol(std::move(CompleteBootstrapSymbol)),
138 SymTab(std::move(SymTab)), DeferredAAs(std::move(DeferredAAs)),
139 MachOHeaderAddr(MachOHeaderAddr), PlatformBootstrap(PlatformBootstrap),
140 PlatformShutdown(PlatformShutdown), RegisterJITDylib(RegisterJITDylib),
141 DeregisterJITDylib(DeregisterJITDylib),
142 RegisterObjectSymbolTable(RegisterObjectSymbolTable),
143 DeregisterObjectSymbolTable(DeregisterObjectSymbolTable) {}
145 StringRef
getName()
const override {
146 return "MachOPlatformCompleteBootstrap";
149 void materialize(std::unique_ptr<MaterializationResponsibility> R)
override {
150 using namespace jitlink;
151 auto G = createPlatformGraph(MOP,
"<OrcRTCompleteBootstrap>");
152 auto &PlaceholderSection =
153 G->createSection(
"__orc_rt_cplt_bs", MemProt::Read);
154 auto &PlaceholderBlock =
155 G->createZeroFillBlock(PlaceholderSection, 1, ExecutorAddr(), 1, 0);
156 G->addDefinedSymbol(PlaceholderBlock, 0, *CompleteBootstrapSymbol, 1,
157 Linkage::Strong, Scope::Hidden,
false,
true);
160 G->allocActions().reserve(DeferredAAs.size() + 3);
163 G->allocActions().push_back(
169 G->allocActions().push_back(
171 SPSArgList<SPSString, SPSExecutorAddr>>(
172 RegisterJITDylib, PlatformJDName, MachOHeaderAddr)),
174 DeregisterJITDylib, MachOHeaderAddr))});
177 G->allocActions().push_back(
179 RegisterObjectSymbolTable, MachOHeaderAddr, SymTab)),
181 DeregisterObjectSymbolTable, MachOHeaderAddr, SymTab))});
184 std::move(DeferredAAs.begin(), DeferredAAs.end(),
185 std::back_inserter(
G->allocActions()));
187 MOP.getObjectLinkingLayer().emit(std::move(R), std::move(
G));
190 void discard(
const JITDylib &JD,
const SymbolStringPtr &Sym)
override {}
194 StringRef PlatformJDName;
195 SymbolStringPtr CompleteBootstrapSymbol;
196 SymbolTableVector SymTab;
198 ExecutorAddr MachOHeaderAddr;
199 ExecutorAddr PlatformBootstrap;
200 ExecutorAddr PlatformShutdown;
201 ExecutorAddr RegisterJITDylib;
202 ExecutorAddr DeregisterJITDylib;
203 ExecutorAddr RegisterObjectSymbolTable;
204 ExecutorAddr DeregisterObjectSymbolTable;
207static StringRef ObjCRuntimeObjectSectionsData[] = {
215static StringRef ObjCRuntimeObjectSectionsText[] = {
222static StringRef ObjCRuntimeObjectSectionName =
223 "__llvm_jitlink_ObjCRuntimeRegistrationObject";
225static StringRef ObjCImageInfoSymbolName =
226 "__llvm_jitlink_macho_objc_imageinfo";
228struct ObjCImageInfoFlags {
229 uint16_t SwiftABIVersion;
230 uint16_t SwiftVersion;
231 bool HasCategoryClassProperties;
232 bool HasSignedObjCClassROs;
234 static constexpr uint32_t SIGNED_CLASS_RO = (1 << 4);
235 static constexpr uint32_t HAS_CATEGORY_CLASS_PROPERTIES = (1 << 6);
237 explicit ObjCImageInfoFlags(uint32_t RawFlags) {
238 HasSignedObjCClassROs = RawFlags & SIGNED_CLASS_RO;
239 HasCategoryClassProperties = RawFlags & HAS_CATEGORY_CLASS_PROPERTIES;
240 SwiftABIVersion = (RawFlags >> 8) & 0xFF;
241 SwiftVersion = (RawFlags >> 16) & 0xFFFF;
244 uint32_t rawFlags()
const {
246 if (HasCategoryClassProperties)
247 Result |= HAS_CATEGORY_CLASS_PROPERTIES;
248 if (HasSignedObjCClassROs)
249 Result |= SIGNED_CLASS_RO;
250 Result |= (SwiftABIVersion << 8);
251 Result |= (SwiftVersion << 16);
260std::optional<MachOPlatform::HeaderOptions::BuildVersionOpts>
266 switch (TT.getOS()) {
268 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
269 : MachO::PLATFORM_IOS;
275 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
276 : MachO::PLATFORM_TVOS;
279 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
280 : MachO::PLATFORM_WATCHOS;
283 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
284 : MachO::PLATFORM_XROS;
295 std::unique_ptr<DefinitionGenerator> OrcRuntime,
299 std::optional<SymbolAliasMap> RuntimeAliases) {
301 auto &ES = ObjLinkingLayer.getExecutionSession();
304 if (!supportedTarget(ES.getTargetTriple()))
306 ES.getTargetTriple().str(),
314 if (
auto Err = PlatformJD.define(
symbolAliases(std::move(*RuntimeAliases))))
315 return std::move(Err);
320 if (
auto Err = PlatformJD.define(
reexports(
321 ES.getBootstrapJITDylib(),
322 {{ES.intern(
"___orc_rt_jit_dispatch"),
323 {Mangle(rt::DispatchName),
324 JITSymbolFlags::Exported | JITSymbolFlags::Callable}},
325 {ES.intern(
"___orc_rt_jit_dispatch_ctx"),
326 {Mangle(rt::DispatchCtxName), JITSymbolFlags::Exported}}})))
332 auto P = std::unique_ptr<MachOPlatform>(
333 new MachOPlatform(ObjLinkingLayer, PlatformJD, std::move(OrcRuntime),
334 std::move(BuildHeaderOpts), std::move(PlatformJDOpts),
335 std::move(BuildMachOHeaderMU), Err));
337 return std::move(Err);
345 std::optional<SymbolAliasMap> RuntimeAliases) {
348 auto OrcRuntimeArchiveGenerator =
350 if (!OrcRuntimeArchiveGenerator)
351 return OrcRuntimeArchiveGenerator.takeError();
353 return Create(ObjLinkingLayer, PlatformJD,
354 std::move(*OrcRuntimeArchiveGenerator),
355 std::move(BuildHeaderOpts), std::move(PlatformJDOpts),
356 std::move(BuildMachOHeaderMU), std::move(RuntimeAliases));
364 if (
auto Err = JD.
define(BuildMachOHeaderMU(*
this, std::move(Opts))))
367 return ES.lookup({&JD}, MachOHeaderStartSymbol).takeError();
371 std::lock_guard<std::mutex> Lock(PlatformMutex);
372 auto I = JITDylibToHeaderAddr.find(&JD);
373 if (
I != JITDylibToHeaderAddr.end()) {
374 assert(HeaderAddrToJITDylib.count(
I->second) &&
375 "HeaderAddrToJITDylib missing entry");
376 HeaderAddrToJITDylib.erase(
I->second);
377 JITDylibToHeaderAddr.erase(
I);
379 JITDylibToPThreadKey.erase(&JD);
390 RegisteredInitSymbols[&JD].add(InitSym,
393 dbgs() <<
"MachOPlatform: Registered init symbol " << *InitSym <<
" for MU "
404 ArrayRef<std::pair<const char *, const char *>> AL) {
405 for (
auto &KV : AL) {
406 auto AliasName = ES.
intern(KV.first);
407 assert(!Aliases.
count(AliasName) &&
"Duplicate symbol name in alias map");
408 Aliases[std::move(AliasName)] = {ES.
intern(KV.second),
423 static const std::pair<const char *, const char *> RequiredCXXAliases[] = {
424 {
"___cxa_atexit",
"___orc_rt_macho_cxa_atexit"}};
431 static const std::pair<const char *, const char *>
432 StandardRuntimeUtilityAliases[] = {
433 {
"___orc_rt_run_program",
"___orc_rt_macho_run_program"},
434 {
"___orc_rt_jit_dlerror",
"___orc_rt_macho_jit_dlerror"},
435 {
"___orc_rt_jit_dlopen",
"___orc_rt_macho_jit_dlopen"},
436 {
"___orc_rt_jit_dlupdate",
"___orc_rt_macho_jit_dlupdate"},
437 {
"___orc_rt_jit_dlclose",
"___orc_rt_macho_jit_dlclose"},
438 {
"___orc_rt_jit_dlsym",
"___orc_rt_macho_jit_dlsym"},
439 {
"___orc_rt_log_error",
"___orc_rt_log_error_to_stderr"}};
442 StandardRuntimeUtilityAliases);
447 static const std::pair<const char *, const char *>
448 StandardLazyCompilationAliases[] = {
449 {
"__orc_rt_reenter",
"__orc_rt_sysv_reenter"}};
452 StandardLazyCompilationAliases);
459bool MachOPlatform::supportedTarget(
const Triple &TT) {
460 switch (TT.getArch()) {
470 switch (
G.getTargetTriple().getArch()) {
481MachOPlatform::flagsForSymbol(jitlink::Symbol &Sym) {
492MachOPlatform::MachOPlatform(
494 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
495 HeaderOptionsBuilder BuildHeaderOpts, HeaderOptions PlatformJDOpts,
496 MachOHeaderMUBuilder BuildMachOHeaderMU,
Error &Err)
497 : ES(ObjLinkingLayer.getExecutionSession()), PlatformJD(PlatformJD),
498 ObjLinkingLayer(ObjLinkingLayer),
499 BuildHeaderOpts(std::
move(BuildHeaderOpts)),
500 BuildMachOHeaderMU(std::
move(BuildMachOHeaderMU)) {
501 ErrorAsOutParameter
_(Err);
502 ObjLinkingLayer.addPlugin(std::make_unique<MachOPlatformPlugin>(*
this));
503 PlatformJD.addGenerator(std::move(OrcRuntimeGenerator));
507 std::optional<bool> ForceEHFrames;
508 if ((Err = ES.getBootstrapMapValue<
bool,
bool>(
"darwin-use-ehframes-only",
511 this->ForceEHFrames = ForceEHFrames.value_or(
false);
572 if ((Err = PlatformJD.define(
573 this->BuildMachOHeaderMU(*
this, std::move(PlatformJDOpts)))))
575 if ((Err = ES.lookup(&PlatformJD, MachOHeaderStartSymbol).takeError()))
582 {PlatformBootstrap.Name, PlatformShutdown.Name,
583 RegisterJITDylib.Name, DeregisterJITDylib.Name,
584 RegisterObjectSymbolTable.Name,
585 DeregisterObjectSymbolTable.Name,
586 RegisterObjectPlatformSections.Name,
587 DeregisterObjectPlatformSections.Name,
588 CreatePThreadKey.Name}))
594 std::unique_lock<std::mutex> Lock(PlatformMutex);
595 BI.CV.wait(Lock, [&]() {
return BI.ActiveGraphs == 0; });
600 auto BootstrapCompleteSymbol = ES.intern(
"__orc_rt_macho_complete_bootstrap");
601 if ((Err = PlatformJD.define(
602 std::make_unique<MachOPlatformCompleteBootstrapMaterializationUnit>(
603 *
this, PlatformJD.getName(), BootstrapCompleteSymbol,
604 std::move(BI.SymTab), std::move(BI.DeferredAAs),
605 BI.MachOHeaderAddr, PlatformBootstrap.Addr,
606 PlatformShutdown.Addr, RegisterJITDylib.Addr,
607 DeregisterJITDylib.Addr, RegisterObjectSymbolTable.Addr,
608 DeregisterObjectSymbolTable.Addr))))
612 std::move(BootstrapCompleteSymbol))
623 if ((Err = associateRuntimeSupportFunctions()))
627Error MachOPlatform::associateRuntimeSupportFunctions() {
628 using PushInitializersSPSSig =
629 SPSExpected<SPSMachOJITDylibDepInfoMap>(SPSExecutorAddr);
630 using PushSymbolsSPSSig =
631 SPSError(SPSExecutorAddr, SPSSequence<SPSTuple<SPSString, bool>>);
633 return ES.registerCallControllerHandlers(
637 &MachOPlatform::rt_pushInitializers),
640 &MachOPlatform::rt_pushSymbols));
643void MachOPlatform::pushInitializersLoop(
644 PushInitializersSendResultFn SendResult,
JITDylibSP JD) {
645 DenseMap<JITDylib *, SymbolLookupSet> NewInitSymbols;
646 DenseMap<JITDylib *, SmallVector<JITDylib *>> JDDepMap;
649 ES.runSessionLocked([&]() {
650 while (!Worklist.empty()) {
653 auto DepJD = Worklist.back();
662 auto &
DM = It->second;
665 if (KV.first == DepJD)
667 DM.push_back(KV.first);
668 Worklist.push_back(KV.first);
673 auto RISItr = RegisteredInitSymbols.find(DepJD);
674 if (RISItr != RegisteredInitSymbols.end()) {
675 NewInitSymbols[DepJD] = std::move(RISItr->second);
676 RegisteredInitSymbols.erase(RISItr);
683 if (NewInitSymbols.
empty()) {
689 DenseMap<JITDylib *, ExecutorAddr> HeaderAddrs;
692 std::lock_guard<std::mutex> Lock(PlatformMutex);
693 for (
auto &KV : JDDepMap) {
694 auto I = JITDylibToHeaderAddr.find(KV.first);
695 if (
I != JITDylibToHeaderAddr.end())
696 HeaderAddrs[KV.first] =
I->second;
702 DIM.reserve(JDDepMap.size());
703 for (
auto &KV : JDDepMap) {
704 auto HI = HeaderAddrs.
find(KV.first);
706 if (HI == HeaderAddrs.
end())
710 for (
auto &Dep : KV.second) {
711 auto HJ = HeaderAddrs.
find(Dep);
712 if (HJ != HeaderAddrs.
end())
713 DepInfo.DepHeaders.push_back(HJ->second);
715 DIM.push_back(std::make_pair(
H, std::move(DepInfo)));
723 [
this, SendResult = std::move(SendResult), JD](
Error Err)
mutable {
725 SendResult(std::move(Err));
727 pushInitializersLoop(std::move(SendResult), JD);
729 ES, std::move(NewInitSymbols));
732void MachOPlatform::rt_pushInitializers(PushInitializersSendResultFn SendResult,
736 std::lock_guard<std::mutex> Lock(PlatformMutex);
737 auto I = HeaderAddrToJITDylib.find(JDHeaderAddr);
738 if (
I != HeaderAddrToJITDylib.end())
743 dbgs() <<
"MachOPlatform::rt_pushInitializers(" << JDHeaderAddr <<
") ";
745 dbgs() <<
"pushing initializers for " << JD->
getName() <<
"\n";
747 dbgs() <<
"No JITDylib for header address.\n";
752 formatv(
"{0:x}", JDHeaderAddr),
757 pushInitializersLoop(std::move(SendResult), JD);
760void MachOPlatform::rt_pushSymbols(
761 PushSymbolsInSendResultFn SendResult,
ExecutorAddr Handle,
762 const std::vector<std::pair<StringRef, bool>> &SymbolNames) {
764 JITDylib *JD =
nullptr;
767 std::lock_guard<std::mutex> Lock(PlatformMutex);
768 auto I = HeaderAddrToJITDylib.find(Handle);
769 if (
I != HeaderAddrToJITDylib.end())
773 dbgs() <<
"MachOPlatform::rt_pushSymbols(";
777 dbgs() <<
"<invalid handle " << Handle <<
">, [ ";
778 for (
auto &Name : SymbolNames)
779 dbgs() <<
"\"" <<
Name.first <<
"\" ";
791 for (
auto &[Name,
Required] : SymbolNames)
799 [SendResult = std::move(SendResult)](Expected<SymbolMap>
Result)
mutable {
800 SendResult(
Result.takeError());
805Expected<uint64_t> MachOPlatform::createPThreadKey() {
806 if (!CreatePThreadKey.Addr)
808 "Attempting to create pthread key in target, but runtime support has "
809 "not been loaded yet",
812 using CreatePThreadKeyProxy = Proxy<Expected<uint64_t>()>;
813 CreatePThreadKeyProxy CreateKey(
814 sps::ProxySpec<CreatePThreadKeyProxy,
815 macho_sps_ci::CreatePThreadKey>::dispatch,
816 CreatePThreadKey.Addr);
817 return CreateKey(ES);
820void MachOPlatform::MachOPlatformPlugin::modifyPassConfig(
822 jitlink::PassConfiguration &Config) {
824 using namespace jitlink;
826 bool InBootstrapPhase =
false;
828 ExecutorAddr HeaderAddr;
830 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
833 InBootstrapPhase =
true;
834 ++MP.Bootstrap->ActiveGraphs;
840 if (
I != MP.JITDylibToHeaderAddr.end())
841 HeaderAddr =
I->second;
846 if (MP.ForceEHFrames)
855 Linkage::Strong, Scope::Local,
true);
860 return bootstrapPipelineRecordRuntimeFunctions(
G);
869 if (InitSymbol == MP.MachOHeaderStartSymbol && !InBootstrapPhase) {
871 return associateJITDylibHeaderSymbol(
G, MR);
880 if (
auto Err = preserveImportantSections(
G, MR))
882 return processObjCImageInfo(
G, MR);
885 [
this](LinkGraph &
G) {
return createObjCRuntimeObject(
G); });
887 [
this, &MR](LinkGraph &
G) {
return populateObjCRuntimeObject(
G, MR); });
895 return fixTLVSectionsAndEdges(G, JD);
901 auto JITSymTabInfo = std::make_shared<JITSymTabVector>();
903 return prepareSymbolTableRegistration(
G, *JITSymTabInfo);
906 InBootstrapPhase](LinkGraph &
G) {
907 return addSymbolTableRegistration(
G, MR, *JITSymTabInfo, InBootstrapPhase);
914 InBootstrapPhase](LinkGraph &
G) {
915 return registerObjectPlatformSections(G, JD, HeaderAddr, InBootstrapPhase);
920 if (InBootstrapPhase)
922 [
this](LinkGraph &
G) {
return bootstrapPipelineEnd(
G); });
925Error MachOPlatform::MachOPlatformPlugin::
926 bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G) {
928 std::pair<StringRef, ExecutorAddr *> RuntimeSymbols[] = {
929 {*MP.MachOHeaderStartSymbol, &MP.Bootstrap->MachOHeaderAddr},
930 {*MP.PlatformBootstrap.Name, &MP.PlatformBootstrap.Addr},
931 {*MP.PlatformShutdown.Name, &MP.PlatformShutdown.Addr},
932 {*MP.RegisterJITDylib.Name, &MP.RegisterJITDylib.Addr},
933 {*MP.DeregisterJITDylib.Name, &MP.DeregisterJITDylib.Addr},
934 {*MP.RegisterObjectSymbolTable.Name, &MP.RegisterObjectSymbolTable.Addr},
935 {*MP.DeregisterObjectSymbolTable.Name,
936 &MP.DeregisterObjectSymbolTable.Addr},
937 {*MP.RegisterObjectPlatformSections.Name,
938 &MP.RegisterObjectPlatformSections.Addr},
939 {*MP.DeregisterObjectPlatformSections.Name,
940 &MP.DeregisterObjectPlatformSections.Addr},
941 {*MP.CreatePThreadKey.Name, &MP.CreatePThreadKey.Addr},
942 {*MP.RegisterObjCRuntimeObject.Name, &MP.RegisterObjCRuntimeObject.Addr},
943 {*MP.DeregisterObjCRuntimeObject.Name,
944 &MP.DeregisterObjCRuntimeObject.Addr}};
946 bool RegisterMachOHeader =
false;
948 for (
auto *Sym :
G.defined_symbols()) {
949 for (
auto &RTSym : RuntimeSymbols) {
953 "Duplicate " + RTSym.first +
954 " detected during MachOPlatform bootstrap",
957 if (Sym->
getName() == MP.MachOHeaderStartSymbol)
958 RegisterMachOHeader =
true;
965 if (RegisterMachOHeader) {
968 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
969 MP.JITDylibToHeaderAddr[&MP.PlatformJD] = MP.Bootstrap->MachOHeaderAddr;
970 MP.HeaderAddrToJITDylib[MP.Bootstrap->MachOHeaderAddr] = &MP.PlatformJD;
976Error MachOPlatform::MachOPlatformPlugin::bootstrapPipelineEnd(
977 jitlink::LinkGraph &
G) {
978 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
980 --MP.Bootstrap->ActiveGraphs;
983 if (MP.Bootstrap->ActiveGraphs == 0)
984 MP.Bootstrap->CV.notify_all();
988Error MachOPlatform::MachOPlatformPlugin::associateJITDylibHeaderSymbol(
989 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
990 auto I =
llvm::find_if(
G.defined_symbols(), [
this](jitlink::Symbol *Sym) {
991 return Sym->getName() == MP.MachOHeaderStartSymbol;
993 assert(
I !=
G.defined_symbols().end() &&
"Missing MachO header start symbol");
996 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
997 auto HeaderAddr = (*I)->getAddress();
998 MP.JITDylibToHeaderAddr[&JD] = HeaderAddr;
999 MP.HeaderAddrToJITDylib[HeaderAddr] = &JD;
1002 G.allocActions().push_back(
1005 MP.RegisterJITDylib.Addr, JD.
getName(), HeaderAddr)),
1007 MP.DeregisterJITDylib.Addr, HeaderAddr))});
1011Error MachOPlatform::MachOPlatformPlugin::preserveImportantSections(
1012 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
1017 if (
auto *ObjCImageInfoSec =
1019 if (ObjCImageInfoSec->blocks_size() != 1)
1021 "In " +
G.getName() +
1022 "__DATA,__objc_imageinfo contains multiple blocks",
1024 G.addAnonymousSymbol(**ObjCImageInfoSec->blocks().begin(), 0, 0,
false,
1027 for (
auto *
B : ObjCImageInfoSec->blocks())
1028 if (!
B->edges_empty())
1031 " contains references to symbols",
1040 jitlink::Symbol *InitSym =
nullptr;
1048 auto *InitSection =
G.findSectionByName(InitSectionName);
1049 if (!InitSection || InitSection->empty())
1055 auto &
B = **InitSection->blocks().begin();
1056 InitSym = &
G.addDefinedSymbol(
1062 for (
auto *
B : InitSection->blocks()) {
1066 auto &S =
G.addAnonymousSymbol(*
B, 0,
B->getSize(),
false,
true);
1075Error MachOPlatform::MachOPlatformPlugin::processObjCImageInfo(
1076 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
1088 auto ObjCImageInfoBlocks = ObjCImageInfo->blocks();
1091 if (ObjCImageInfoBlocks.empty())
1093 " section in " +
G.getName(),
1097 if (std::next(ObjCImageInfoBlocks.begin()) != ObjCImageInfoBlocks.end())
1100 " section in " +
G.getName(),
1105 for (
auto &Sec :
G.sections()) {
1106 if (&Sec != ObjCImageInfo)
1107 for (
auto *
B : Sec.blocks())
1108 for (
auto &
E :
B->edges())
1109 if (
E.getTarget().isDefined() &&
1110 &
E.getTarget().getSection() == ObjCImageInfo)
1112 " is referenced within file " +
1117 auto &ObjCImageInfoBlock = **ObjCImageInfoBlocks.begin();
1118 auto *ObjCImageInfoData = ObjCImageInfoBlock.getContent().data();
1124 std::lock_guard<std::mutex> Lock(PluginMutex);
1127 if (ObjCImageInfoItr != ObjCImageInfos.end()) {
1130 if (ObjCImageInfoItr->second.Version !=
Version)
1132 "ObjC version in " +
G.getName() +
1133 " does not match first registered version",
1135 if (ObjCImageInfoItr->second.Flags != Flags)
1136 if (
Error E = mergeImageInfoFlags(
G, MR, ObjCImageInfoItr->second, Flags))
1140 while (ObjCImageInfo->symbols_size() != 0)
1141 G.removeDefinedSymbol(**ObjCImageInfo->symbols().begin());
1142 G.removeBlock(ObjCImageInfoBlock);
1145 dbgs() <<
"MachOPlatform: Registered __objc_imageinfo for "
1147 <<
"; flags = " <<
formatv(
"{0:x4}", Flags) <<
"\n";
1151 G.addDefinedSymbol(ObjCImageInfoBlock, 0, ObjCImageInfoSymbolName,
1155 {{MR.getExecutionSession().intern(ObjCImageInfoSymbolName),
1156 JITSymbolFlags()}}))
1164Error MachOPlatform::MachOPlatformPlugin::mergeImageInfoFlags(
1165 jitlink::LinkGraph &
G, MaterializationResponsibility &MR,
1166 ObjCImageInfo &Info, uint32_t NewFlags) {
1167 if (
Info.Flags == NewFlags)
1170 ObjCImageInfoFlags Old(
Info.Flags);
1171 ObjCImageInfoFlags
New(NewFlags);
1174 if (Old.SwiftABIVersion &&
New.SwiftABIVersion &&
1175 Old.SwiftABIVersion !=
New.SwiftABIVersion)
1177 " does not match first registered flags",
1183 if (
Info.Finalized && Old.HasCategoryClassProperties &&
1184 !
New.HasCategoryClassProperties)
1187 " does not match first registered flags",
1189 if (
Info.Finalized && Old.HasSignedObjCClassROs && !
New.HasSignedObjCClassROs)
1192 " does not match first registered flags",
1201 if (Old.SwiftVersion &&
New.SwiftVersion)
1202 New.SwiftVersion = std::min(Old.SwiftVersion,
New.SwiftVersion);
1203 else if (Old.SwiftVersion)
1204 New.SwiftVersion = Old.SwiftVersion;
1206 if (!
New.SwiftABIVersion)
1207 New.SwiftABIVersion = Old.SwiftABIVersion;
1209 if (Old.HasCategoryClassProperties !=
New.HasCategoryClassProperties)
1210 New.HasCategoryClassProperties =
false;
1212 if (Old.HasSignedObjCClassROs !=
New.HasSignedObjCClassROs)
1213 New.HasSignedObjCClassROs =
false;
1216 dbgs() <<
"MachOPlatform: Merging __objc_imageinfo flags for "
1218 <<
formatv(
"{0:x4}", Old.rawFlags()) <<
")"
1219 <<
" with " <<
G.getName() <<
" (" <<
formatv(
"{0:x4}", NewFlags)
1221 <<
" -> " <<
formatv(
"{0:x4}",
New.rawFlags()) <<
"\n";
1228Error MachOPlatform::MachOPlatformPlugin::fixTLVSectionsAndEdges(
1229 jitlink::LinkGraph &
G, JITDylib &JD) {
1230 auto TLVBootStrapSymbolName =
G.intern(
"__tlv_bootstrap");
1232 for (
auto *Sym :
G.external_symbols())
1233 if (Sym->
getName() == TLVBootStrapSymbolName) {
1235 MP.getExecutionSession().intern(
"___orc_rt_macho_tlv_get_addr");
1236 Sym->
setName(std::move(TLSGetADDR));
1242 std::optional<uint64_t>
Key;
1244 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1245 auto I = MP.JITDylibToPThreadKey.find(&JD);
1246 if (
I != MP.JITDylibToPThreadKey.end())
1251 if (
auto KeyOrErr = MP.createPThreadKey())
1254 return KeyOrErr.takeError();
1260 for (
auto *
B : ThreadDataSec->blocks()) {
1261 if (
B->getSize() != 3 *
G.getPointerSize())
1263 formatv(
"{0:x}",
B->getAddress()) +
1264 " has unexpected size",
1267 auto NewBlockContent =
G.allocateBuffer(
B->getSize());
1268 llvm::copy(
B->getContent(), NewBlockContent.data());
1269 memcpy(NewBlockContent.data() +
G.getPointerSize(), &PlatformKeyBits,
1270 G.getPointerSize());
1271 B->setContent(NewBlockContent);
1276 for (
auto *
B :
G.blocks())
1277 for (
auto &
E :
B->edges())
1280 E.setKind(jitlink::x86_64::
1281 RequestGOTAndTransformToPCRel32GOTLoadREXRelaxable);
1286std::optional<MachOPlatform::MachOPlatformPlugin::UnwindSections>
1287MachOPlatform::MachOPlatformPlugin::findUnwindSectionInfo(
1288 jitlink::LinkGraph &
G) {
1289 using namespace jitlink;
1296 auto ScanUnwindInfoSection = [&](
Section &Sec, ExecutorAddrRange &SecRange,
1297 auto AddCodeBlocks) {
1298 if (Sec.blocks().empty())
1300 SecRange = (*Sec.blocks().
begin())->getRange();
1301 for (
auto *
B : Sec.blocks()) {
1302 auto R =
B->getRange();
1303 SecRange.Start = std::min(SecRange.Start,
R.Start);
1304 SecRange.End = std::max(SecRange.End,
R.End);
1310 ScanUnwindInfoSection(*EHFrameSec, US.DwarfSection, [&](
Block &
B) {
1311 if (auto *Fn = jitlink::EHFrameCFIBlockInspector::FromEdgeScan(B)
1313 if (Fn->getTarget().isDefined())
1314 CodeBlocks.push_back(&Fn->getTarget().getBlock());
1319 ScanUnwindInfoSection(
1320 *CUInfoSec, US.CompactUnwindSection, [&](
Block &
B) {
1321 for (auto &E : B.edges()) {
1322 assert(E.getTarget().isDefined() &&
1323 "unwind-info record edge has external target");
1324 assert(E.getKind() == Edge::KeepAlive &&
1325 "unwind-info record has unexpected edge kind");
1326 CodeBlocks.push_back(&E.getTarget().getBlock());
1333 if (CodeBlocks.
empty())
1334 return std::nullopt;
1339 return LHS->getAddress() <
RHS->getAddress();
1341 for (
auto *
B : CodeBlocks) {
1342 if (US.CodeRanges.empty() || US.CodeRanges.back().End !=
B->getAddress())
1343 US.CodeRanges.push_back(
B->getRange());
1345 US.CodeRanges.back().End =
B->getRange().End;
1349 dbgs() <<
"MachOPlatform identified unwind info in " <<
G.getName() <<
":\n"
1351 if (US.DwarfSection.Start)
1352 dbgs() << US.DwarfSection <<
"\n";
1355 dbgs() <<
" Compact-unwind: ";
1356 if (US.CompactUnwindSection.Start)
1357 dbgs() << US.CompactUnwindSection <<
"\n";
1360 <<
"for code ranges:\n";
1361 for (
auto &CR : US.CodeRanges)
1362 dbgs() <<
" " << CR <<
"\n";
1363 if (US.CodeRanges.size() >=
G.sections_size())
1364 dbgs() <<
"WARNING: High number of discontiguous code ranges! "
1365 "Padding may be interfering with coalescing.\n";
1371Error MachOPlatform::MachOPlatformPlugin::registerObjectPlatformSections(
1372 jitlink::LinkGraph &
G, JITDylib &JD, ExecutorAddr HeaderAddr,
1373 bool InBootstrapPhase) {
1377 jitlink::Section *ThreadDataSection =
1385 if (ThreadDataSection)
1386 G.mergeSections(*ThreadDataSection, *ThreadBSSSection);
1388 ThreadDataSection = ThreadBSSSection;
1397 for (
auto &SecName : DataSections) {
1398 if (
auto *Sec =
G.findSectionByName(SecName)) {
1399 jitlink::SectionRange
R(*Sec);
1401 MachOPlatformSecs.
push_back({SecName,
R.getRange()});
1407 if (ThreadDataSection) {
1408 jitlink::SectionRange
R(*ThreadDataSection);
1416 ObjCRuntimeObjectSectionName};
1418 for (
auto &SecName : PlatformSections) {
1419 auto *Sec =
G.findSectionByName(SecName);
1422 jitlink::SectionRange
R(*Sec);
1426 MachOPlatformSecs.
push_back({SecName,
R.getRange()});
1429 std::optional<std::tuple<SmallVector<ExecutorAddrRange>, ExecutorAddrRange,
1432 if (
auto UI = findUnwindSectionInfo(
G))
1433 UnwindInfo = std::make_tuple(std::move(UI->CodeRanges), UI->DwarfSection,
1434 UI->CompactUnwindSection);
1436 if (!MachOPlatformSecs.
empty() || UnwindInfo) {
1439 dbgs() <<
"MachOPlatform: Scraped " <<
G.getName() <<
" init sections:\n";
1440 for (
auto &KV : MachOPlatformSecs)
1441 dbgs() <<
" " << KV.first <<
": " << KV.second <<
"\n";
1444 assert(HeaderAddr &&
"Null header registered for JD");
1445 using SPSRegisterObjectPlatformSectionsArgs = SPSArgList<
1447 SPSOptional<SPSTuple<SPSSequence<SPSExecutorAddrRange>,
1449 SPSSequence<SPSTuple<SPSString, SPSExecutorAddrRange>>>;
1454 MP.RegisterObjectPlatformSections.Addr, HeaderAddr, UnwindInfo,
1455 MachOPlatformSecs)),
1458 MP.DeregisterObjectPlatformSections.Addr, HeaderAddr,
1459 UnwindInfo, MachOPlatformSecs))};
1464 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1465 MP.Bootstrap->DeferredAAs.push_back(std::move(
AllocActions));
1472Error MachOPlatform::MachOPlatformPlugin::createObjCRuntimeObject(
1473 jitlink::LinkGraph &
G) {
1475 bool NeedTextSegment =
false;
1476 size_t NumRuntimeSections = 0;
1478 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsData)
1479 if (
G.findSectionByName(ObjCRuntimeSectionName))
1480 ++NumRuntimeSections;
1482 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsText) {
1483 if (
G.findSectionByName(ObjCRuntimeSectionName)) {
1484 ++NumRuntimeSections;
1485 NeedTextSegment =
true;
1490 if (NumRuntimeSections == 0)
1495 ++NumRuntimeSections;
1497 size_t MachOSize =
sizeof(MachO::mach_header_64) +
1498 (NeedTextSegment + 1) *
sizeof(MachO::segment_command_64) +
1499 NumRuntimeSections *
sizeof(MachO::section_64);
1501 auto &Sec =
G.createSection(ObjCRuntimeObjectSectionName,
1503 G.createMutableContentBlock(Sec, MachOSize, ExecutorAddr(), 16, 0,
true);
1508Error MachOPlatform::MachOPlatformPlugin::populateObjCRuntimeObject(
1509 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
1511 auto *ObjCRuntimeObjectSec =
1512 G.findSectionByName(ObjCRuntimeObjectSectionName);
1514 if (!ObjCRuntimeObjectSec)
1517 switch (
G.getTargetTriple().getArch()) {
1524 G.getTargetTriple().str(),
1528 auto &SecBlock = **ObjCRuntimeObjectSec->blocks().begin();
1531 MachO::section_64 Sec;
1532 unique_function<void(
size_t RecordOffset)> AddFixups;
1535 std::vector<SecDesc> TextSections, DataSections;
1536 auto AddSection = [&](SecDesc &SD, jitlink::Section &GraphSec) {
1537 jitlink::SectionRange SR(GraphSec);
1538 StringRef FQName = GraphSec.getName();
1539 memset(&SD.Sec, 0,
sizeof(MachO::section_64));
1541 memcpy(SD.Sec.segname, FQName.
data(), 6);
1542 SD.Sec.addr = SR.getStart() - SecBlock.getAddress();
1543 SD.Sec.size = SR.getSize();
1549 DataSections.push_back({});
1550 auto &SD = DataSections.back();
1551 memset(&SD.Sec, 0,
sizeof(SD.Sec));
1552 memcpy(SD.Sec.sectname,
"__objc_imageinfo", 16);
1553 strcpy(SD.Sec.segname,
"__DATA");
1555 jitlink::Symbol *ObjCImageInfoSym =
nullptr;
1556 SD.AddFixups = [&, ObjCImageInfoSym](
size_t RecordOffset)
mutable {
1557 auto PointerEdge = getPointerEdgeKind(
G);
1560 if (!ObjCImageInfoSym) {
1561 auto Name =
G.intern(ObjCImageInfoSymbolName);
1562 ObjCImageInfoSym =
G.findExternalSymbolByName(Name);
1563 if (!ObjCImageInfoSym)
1564 ObjCImageInfoSym =
G.findAbsoluteSymbolByName(Name);
1565 if (!ObjCImageInfoSym) {
1566 ObjCImageInfoSym =
G.findDefinedSymbolByName(Name);
1567 if (ObjCImageInfoSym) {
1568 std::optional<uint32_t>
Flags;
1570 std::lock_guard<std::mutex> Lock(PluginMutex);
1572 if (It != ObjCImageInfos.end()) {
1573 It->second.Finalized =
true;
1574 Flags = It->second.Flags;
1583 Content.size() == 8 &&
1584 "__objc_image_info size should have been verified already");
1589 if (!ObjCImageInfoSym)
1590 ObjCImageInfoSym = &
G.addExternalSymbol(std::move(Name), 8,
false);
1593 SecBlock.addEdge(PointerEdge,
1594 RecordOffset + ((
char *)&SD.Sec.addr - (
char *)&SD.Sec),
1595 *ObjCImageInfoSym, -SecBlock.getAddress().getValue());
1599 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsData) {
1600 if (
auto *GraphSec =
G.findSectionByName(ObjCRuntimeSectionName)) {
1601 DataSections.push_back({});
1602 AddSection(DataSections.back(), *GraphSec);
1606 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsText) {
1607 if (
auto *GraphSec =
G.findSectionByName(ObjCRuntimeSectionName)) {
1608 TextSections.push_back({});
1609 AddSection(TextSections.back(), *GraphSec);
1613 assert(ObjCRuntimeObjectSec->blocks_size() == 1 &&
1614 "Unexpected number of blocks in runtime sections object");
1618 MachO::mach_header_64 Hdr;
1620 switch (
G.getTargetTriple().getArch()) {
1634 Hdr.
ncmds = 1 + !TextSections.empty();
1636 Hdr.
ncmds *
sizeof(MachO::segment_command_64) +
1637 (TextSections.size() + DataSections.size()) *
sizeof(MachO::section_64);
1641 auto SecContent = SecBlock.getAlreadyMutableContent();
1642 char *
P = SecContent.data();
1643 auto WriteMachOStruct = [&](
auto S) {
1646 memcpy(
P, &S,
sizeof(S));
1650 auto WriteSegment = [&](StringRef
Name, std::vector<SecDesc> &Secs) {
1651 MachO::segment_command_64 SegLC;
1652 memset(&SegLC, 0,
sizeof(SegLC));
1654 SegLC.
cmd = MachO::LC_SEGMENT_64;
1655 SegLC.
cmdsize =
sizeof(MachO::segment_command_64) +
1656 Secs.size() *
sizeof(MachO::section_64);
1657 SegLC.
nsects = Secs.size();
1658 WriteMachOStruct(SegLC);
1659 for (
auto &SD : Secs) {
1661 SD.AddFixups(
P - SecContent.data());
1662 WriteMachOStruct(SD.Sec);
1666 WriteMachOStruct(Hdr);
1667 if (!TextSections.empty())
1668 WriteSegment(
"__TEXT", TextSections);
1669 if (!DataSections.empty())
1670 WriteSegment(
"__DATA", DataSections);
1672 assert(
P == SecContent.end() &&
"Underflow writing ObjC runtime object");
1676Error MachOPlatform::MachOPlatformPlugin::prepareSymbolTableRegistration(
1677 jitlink::LinkGraph &
G, JITSymTabVector &JITSymTabInfo) {
1685 DenseMap<StringRef, jitlink::Symbol *> ExistingStrings;
1686 for (
auto *Sym : CStringSec->symbols()) {
1692 std::make_pair(StringRef(Content.data(), Content.size()), Sym));
1698 SmallVector<jitlink::Symbol *> SymsToProcess;
1702 for (
auto *Sym : SymsToProcess) {
1707 if (
I == ExistingStrings.
end()) {
1708 auto &NameBlock =
G.createMutableContentBlock(
1709 *CStringSec,
G.allocateCString(*Sym->
getName()),
1710 orc::ExecutorAddr(), 1, 0);
1711 auto &SymbolNameSym =
G.addAnonymousSymbol(
1712 NameBlock, 0, NameBlock.getSize(),
false,
true);
1713 JITSymTabInfo.push_back({Sym, &SymbolNameSym});
1715 JITSymTabInfo.push_back({Sym,
I->second});
1722Error MachOPlatform::MachOPlatformPlugin::addSymbolTableRegistration(
1723 jitlink::LinkGraph &
G, MaterializationResponsibility &MR,
1724 JITSymTabVector &JITSymTabInfo,
bool InBootstrapPhase) {
1726 ExecutorAddr HeaderAddr;
1728 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1730 assert(
I != MP.JITDylibToHeaderAddr.end() &&
"No header registered for JD");
1731 assert(
I->second &&
"Null header registered for JD");
1732 HeaderAddr =
I->second;
1739 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1740 auto &SymTab = MP.Bootstrap->SymTab;
1741 for (
auto &[OriginalSymbol, NameSym] : JITSymTabInfo)
1742 SymTab.push_back({NameSym->getAddress(), OriginalSymbol->getAddress(),
1743 flagsForSymbol(*OriginalSymbol)});
1747 SymbolTableVector SymTab;
1748 for (
auto &[OriginalSymbol, NameSym] : JITSymTabInfo)
1749 SymTab.push_back({NameSym->getAddress(), OriginalSymbol->getAddress(),
1750 flagsForSymbol(*OriginalSymbol)});
1752 G.allocActions().push_back(
1754 MP.RegisterObjectSymbolTable.Addr, HeaderAddr, SymTab)),
1756 MP.DeregisterObjectSymbolTable.Addr, HeaderAddr, SymTab))});
1761template <
typename MachOTraits>
1771 B.Header.cputype = HdrInfo.CPUType;
1772 B.Header.cpusubtype = HdrInfo.CPUSubType;
1775 B.template addLoadCommand<MachO::LC_ID_DYLIB>(
1777 Opts.
IDDylib->CurrentVersion, Opts.
IDDylib->CompatibilityVersion);
1779 B.template addLoadCommand<MachO::LC_ID_DYLIB>(JD.
getName(), 0, 0, 0);
1782 B.template addLoadCommand<MachO::LC_UUID>(*Opts.
UUID);
1785 B.template addLoadCommand<MachO::LC_BUILD_VERSION>(
1786 BV.Platform, BV.MinOS, BV.SDK,
static_cast<uint32_t>(0));
1789 B.template addLoadCommand<MachO::LC_TARGET_TRIPLE>(*Opts.
TargetTriple);
1794 case LoadKind::Default:
1795 B.template addLoadCommand<MachO::LC_LOAD_DYLIB>(
1796 LD.D.Name, LD.D.Timestamp, LD.D.CurrentVersion,
1797 LD.D.CompatibilityVersion);
1799 case LoadKind::Weak:
1800 B.template addLoadCommand<MachO::LC_LOAD_WEAK_DYLIB>(
1801 LD.D.Name, LD.D.Timestamp, LD.D.CurrentVersion,
1802 LD.D.CompatibilityVersion);
1807 B.template addLoadCommand<MachO::LC_RPATH>(
P);
1809 auto HeaderContent =
G.allocateBuffer(
B.layout());
1810 B.write(HeaderContent);
1812 return G.createContentBlock(HeaderSection, HeaderContent,
ExecutorAddr(), 8,
1820 createHeaderInterface(
MOP,
std::
move(HeaderStartSymbol))),
1824 std::unique_ptr<MaterializationResponsibility> R) {
1825 auto G = createPlatformGraph(
MOP,
"<MachOHeaderMU>");
1826 addMachOHeader(R->getTargetJITDylib(), *
G, R->getInitializerSymbol());
1827 MOP.getObjectLinkingLayer().emit(std::move(R), std::move(
G));
1833void SimpleMachOHeaderMU::addMachOHeader(
1836 auto &HeaderSection =
G.createSection(
"__header",
MemProt::Read);
1840 G.addDefinedSymbol(HeaderBlock, 0, *InitializerSymbol, HeaderBlock.getSize(),
1843 for (
auto &HS : AdditionalHeaderSymbols)
1844 G.addDefinedSymbol(HeaderBlock, HS.Offset, HS.Name, HeaderBlock.getSize(),
1852 switch (
MOP.getExecutionSession().getTargetTriple().getArch()) {
1855 return ::createHeaderBlock<MachO64LE>(
MOP,
Opts, JD,
G, HeaderSection);
1866 for (
auto &HS : AdditionalHeaderSymbols)
1875 switch (TT.getArch()) {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_UNLIKELY(EXPR)
#define LLVM_LIKELY(EXPR)
static RegisterPass< DebugifyModulePass > DM("debugify", "Attach debug info to everything")
static StringRef getName(Value *V)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
Manages the enabling and disabling of subtarget specific features.
Triple - Helper class for working with autoconf configuration names.
An Addressable with content and edges.
ArrayRef< char > getContent() const
Get the content for this block. Block must not be a zero-fill block.
void addEdge(Edge::Kind K, Edge::OffsetT Offset, Symbol &Target, Edge::AddendT Addend)
Add an edge to this block.
MutableArrayRef< char > getMutableContent(LinkGraph &G)
Get mutable content for this block.
const std::string & getName() const
Get the name for this JITLinkDylib.
void removeSection(Section &Sec)
Remove a section.
Section * findSectionByName(StringRef Name)
Returns the section with the given name if it exists, otherwise returns null.
Symbol & addAbsoluteSymbol(orc::SymbolStringPtr Name, orc::ExecutorAddr Address, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive)
Add an absolute symbol.
Represents an object file section.
bool isCallable() const
Returns true is this symbol is callable.
const orc::SymbolStringPtr & getName() const
Returns the name of this symbol (empty if the symbol is anonymous).
Linkage getLinkage() const
Get the linkage for this Symbol.
orc::ExecutorAddr getAddress() const
Returns the address of this symbol.
Block & getBlock()
Return the Block for this Symbol (Symbol must be defined).
void setName(orc::SymbolStringPtr Name)
Rename this symbol.
bool hasName() const
Returns true if this symbol has a name.
An ExecutionSession represents a running JIT program.
const Triple & getTargetTriple() const
Return the triple for the executor.
SymbolStringPtr intern(StringRef SymName)
Add a symbol name to the SymbolStringPool and return a pointer to it.
Represents an address in the executor process.
Represents a JIT'd dynamic library.
Error define(std::unique_ptr< MaterializationUnitType > &&MU, ResourceTrackerSP RT=nullptr)
Define all symbols provided by the materialization unit to be part of this JITDylib.
Mangles symbol names then uniques them in the context of an ExecutionSession.
Tracks responsibility for materialization, and mediates interactions between MaterializationUnits and...
Error defineMaterializing(SymbolFlagsMap SymbolFlags)
Attempt to claim responsibility for new definitions.
const SymbolStringPtr & getInitializerSymbol() const
Returns the initialization pseudo-symbol, if any.
JITDylib & getTargetJITDylib() const
Returns the target JITDylib that these symbols are being materialized into.
A MaterializationUnit represents a set of symbol definitions that can be materialized as a group,...
MaterializationUnit(Interface I)
virtual StringRef getName() const =0
Return the name of this materialization unit.
const SymbolStringPtr & getInitializerSymbol() const
Returns the initialization symbol for this MaterializationUnit (if any).
An ObjectLayer implementation built on JITLink.
API to remove / transfer ownership of JIT resources.
JITDylib & getJITDylib() const
Return the JITDylib targeted by this tracker.
static Expected< std::unique_ptr< StaticLibraryDefinitionGenerator > > Load(ObjectLayer &L, const char *FileName, VisitMembersFunction VisitMembers=VisitMembersFunction(), GetObjectFileInterface GetObjFileInterface=GetObjectFileInterface())
Try to create a StaticLibraryDefinitionGenerator from the given path.
A symbol name together with the naming level (SymbolNameKind) it is expressed in, so that a Mangler /...
static constexpr SymbolNameSpec c(StringRef Name)
Pointer to a pooled string representing a symbol name.
A utility class for serializing to a blob from a variadic list.
SPS tag type for expecteds, which are either a T or a string representing an error.
Output char buffer with overflow check.
SPS tag type for sequences.
static size_t size(const MachOPlatform::MachOExecutorSymbolFlags &SF)
static bool deserialize(SPSInputBuffer &IB, MachOPlatform::MachOExecutorSymbolFlags &SF)
static bool serialize(SPSOutputBuffer &OB, const MachOPlatform::MachOExecutorSymbolFlags &SF)
static bool serialize(SPSOutputBuffer &OB, const MachOPlatform::MachOJITDylibDepInfo &DDI)
static size_t size(const MachOPlatform::MachOJITDylibDepInfo &DDI)
static bool deserialize(SPSInputBuffer &IB, MachOPlatform::MachOJITDylibDepInfo &DDI)
Specialize to describe how to serialize/deserialize to/from the given concrete type.
static Expected< WrapperFunctionCall > Create(ExecutorAddr FnAddr, const ArgTs &...Args)
Create a WrapperFunctionCall using the given SPS serializer to serialize the arguments.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ S_REGULAR
S_REGULAR - Regular section.
void swapStruct(fat_header &mh)
@ Pointer64
A plain 64-bit pointer value relocation.
@ RequestTLVPAndTransformToPCRel32TLVPLoadREXRelaxable
A TLVP entry getter/constructor, transformed to Delta32ToTLVPLoadREXRelaxable.
@ Pointer64
A plain 64-bit pointer value relocation.
LLVM_ABI const char * getGenericEdgeKindName(Edge::Kind K)
Returns the string name of the given generic edge kind, or "unknown" otherwise.
SPSTuple< bool, SPSSequence< SPSExecutorAddr > > SPSMachOJITDylibDepInfo
std::vector< AllocActionCallPair > AllocActions
A vector of allocation actions to be run for this allocation.
SPSSequence< SPSTuple< SPSExecutorAddr, SPSMachOJITDylibDepInfo > > SPSMachOJITDylibDepInfoMap
SPSTuple< SPSExecutorAddr, SPSExecutorAddr > SPSExecutorAddrRange
LLVM_ABI StringRef MachOSwift5EntrySectionName
LLVM_ABI StringRef MachOThreadBSSSectionName
LLVM_ABI StringRef MachOThreadVarsSectionName
ExecutionSession::CallControllerHandlerBinding bindCallControllerHandlerSPS(SymbolNameSpec Name, HandlerT &&Handler, SymbolLookupFlags LF=SymbolLookupFlags::RequiredSymbol)
Bind a call-controller handler that takes concrete argument types (and a sender for a concrete return...
JITDylibSearchOrder makeJITDylibSearchOrder(ArrayRef< JITDylib * > JDs, JITDylibLookupFlags Flags=JITDylibLookupFlags::MatchExportedSymbolsOnly)
Convenience function for creating a search order from an ArrayRef of JITDylib*, all with the same fla...
std::vector< std::pair< JITDylib *, JITDylibLookupFlags > > JITDylibSearchOrder
A list of (JITDylib*, JITDylibLookupFlags) pairs to be used as a search order during symbol lookup.
IntrusiveRefCntPtr< JITDylib > JITDylibSP
std::unique_ptr< ReExportsMaterializationUnit > symbolAliases(SymbolAliasMap Aliases)
Create a ReExportsMaterializationUnit with the given aliases.
LLVM_ABI StringRef MachOObjCProtoListSectionName
LLVM_ABI StringRef MachOSwift5ProtosSectionName
LLVM_ABI StringRef MachOEHFrameSectionName
LLVM_ABI StringRef MachOModInitFuncSectionName
LLVM_ABI StringRef MachOObjCConstSectionName
LLVM_ABI StringRef MachODataDataSectionName
std::unique_ptr< ReExportsMaterializationUnit > reexports(JITDylib &SourceJD, SymbolAliasMap Aliases, JITDylibLookupFlags SourceJDLookupFlags=JITDylibLookupFlags::MatchExportedSymbolsOnly)
Create a materialization unit for re-exporting symbols from another JITDylib with alternative names/f...
LLVM_ABI StringRef MachOCompactUnwindSectionName
LLVM_ABI StringRef MachOSwift5ProtoSectionName
@ MatchExportedSymbolsOnly
static void addAliases(ExecutionSession &ES, SymbolAliasMap &Aliases, ArrayRef< std::pair< const char *, const char * > > AL)
LLVM_ABI StringRef MachOObjCCatListSectionName
LLVM_ABI StringRef MachOObjCClassRefsSectionName
LLVM_ABI StringRef MachOObjCDataSectionName
LLVM_ABI StringRef MachOObjCClassNameSectionName
LLVM_ABI StringRef MachOObjCMethNameSectionName
LLVM_ABI StringRef MachOInitSectionNames[22]
LLVM_ABI StringRef MachOObjCClassListSectionName
LLVM_ABI StringRef MachOObjCSelRefsSectionName
LLVM_ABI StringRef MachOSwift5FieldMetadataSectionName
LLVM_ABI StringRef MachOCStringSectionName
LLVM_ABI StringRef MachOObjCMethTypeSectionName
LLVM_ABI StringRef MachOSwift5TypesSectionName
LLVM_ABI StringRef MachOObjCNLCatListSectionName
jitlink::Block & createHeaderBlock(MachOPlatform &MOP, const MachOPlatform::HeaderOptions &Opts, JITDylib &JD, jitlink::LinkGraph &G, jitlink::Section &HeaderSection)
LLVM_ABI StringRef MachOObjCNLClassListSectionName
LLVM_ABI StringRef MachOObjCImageInfoSectionName
LLVM_ABI MachOHeaderInfo getMachOHeaderInfoFromTriple(const Triple &TT)
LLVM_ABI RegisterDependenciesFunction NoDependenciesToRegister
This can be used as the value for a RegisterDependenciesFunction if there are no dependants to regist...
LLVM_ABI StringRef MachOThreadDataSectionName
LLVM_ABI StringRef MachOUnwindInfoSectionName
LLVM_ABI StringRef MachODataCommonSectionName
LLVM_ABI StringRef MachOObjCProtoRefsSectionName
@ Ready
Emitted to memory, but waiting on transitive dependencies.
DenseMap< SymbolStringPtr, SymbolAliasMapEntry > SymbolAliasMap
A map of Symbols to (Symbol, Flags) pairs.
LLVM_ABI StringRef MachOSwift5TypeRefSectionName
LLVM_ABI StringRef MachOObjCCatList2SectionName
DenseMap< SymbolStringPtr, JITSymbolFlags > SymbolFlagsMap
A map from symbol names (as SymbolStringPtrs) to JITSymbolFlags.
LLVM_ABI iterator begin() const
value_type byte_swap(value_type value, endianness endian)
Swap the bytes of value to match the given endianness.
uint32_t read32(const void *P, endianness E)
void write32(void *P, uint32_t V, endianness E)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
OutputIt copy(R &&Range, OutputIt Out)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.
LinkGraphPassList PostAllocationPasses
Post-allocation passes.
LinkGraphPassList PostFixupPasses
Post-fixup passes.
LinkGraphPassList PostPrunePasses
Post-prune passes.
LinkGraphPassList PrePrunePasses
Pre-prune passes.
SPSExpected< uint64_t >() SPSSig
static constexpr SymbolNameSpec Name