23#define DEBUG_TYPE "orc"
37class SPSMachOExecutorSymbolFlags;
49 return SPSMachOJITDylibDepInfo::AsArgList::serialize(OB, DDI.
Sealed,
55 return SPSMachOJITDylibDepInfo::AsArgList::deserialize(IB, DDI.
Sealed,
64 using UT = std::underlying_type_t<MachOPlatform::MachOExecutorSymbolFlags>;
92using SPSRegisterSymbolsArgs =
95 SPSMachOExecutorSymbolFlags>>>;
97std::unique_ptr<jitlink::LinkGraph> createPlatformGraph(
MachOPlatform &MOP,
100 return std::make_unique<jitlink::LinkGraph>(
101 std::move(Name), ES.getSymbolStringPool(), ES.getTargetTriple(),
106class MachOPlatformCompleteBootstrapMaterializationUnit
109 using SymbolTableVector =
113 MachOPlatformCompleteBootstrapMaterializationUnit(
114 MachOPlatform &MOP, StringRef PlatformJDName,
115 SymbolStringPtr CompleteBootstrapSymbol, SymbolTableVector SymTab,
117 ExecutorAddr PlatformBootstrap, ExecutorAddr PlatformShutdown,
118 ExecutorAddr RegisterJITDylib, ExecutorAddr DeregisterJITDylib,
119 ExecutorAddr RegisterObjectSymbolTable,
120 ExecutorAddr DeregisterObjectSymbolTable)
121 : MaterializationUnit(
123 MOP(MOP), PlatformJDName(PlatformJDName),
124 CompleteBootstrapSymbol(std::move(CompleteBootstrapSymbol)),
125 SymTab(std::move(SymTab)), DeferredAAs(std::move(DeferredAAs)),
126 MachOHeaderAddr(MachOHeaderAddr), PlatformBootstrap(PlatformBootstrap),
127 PlatformShutdown(PlatformShutdown), RegisterJITDylib(RegisterJITDylib),
128 DeregisterJITDylib(DeregisterJITDylib),
129 RegisterObjectSymbolTable(RegisterObjectSymbolTable),
130 DeregisterObjectSymbolTable(DeregisterObjectSymbolTable) {}
132 StringRef
getName()
const override {
133 return "MachOPlatformCompleteBootstrap";
136 void materialize(std::unique_ptr<MaterializationResponsibility> R)
override {
137 using namespace jitlink;
138 auto G = createPlatformGraph(MOP,
"<OrcRTCompleteBootstrap>");
139 auto &PlaceholderSection =
140 G->createSection(
"__orc_rt_cplt_bs", MemProt::Read);
141 auto &PlaceholderBlock =
142 G->createZeroFillBlock(PlaceholderSection, 1, ExecutorAddr(), 1, 0);
143 G->addDefinedSymbol(PlaceholderBlock, 0, *CompleteBootstrapSymbol, 1,
144 Linkage::Strong, Scope::Hidden,
false,
true);
147 G->allocActions().reserve(DeferredAAs.size() + 3);
150 G->allocActions().push_back(
156 G->allocActions().push_back(
158 SPSArgList<SPSString, SPSExecutorAddr>>(
159 RegisterJITDylib, PlatformJDName, MachOHeaderAddr)),
161 DeregisterJITDylib, MachOHeaderAddr))});
164 G->allocActions().push_back(
166 RegisterObjectSymbolTable, MachOHeaderAddr, SymTab)),
168 DeregisterObjectSymbolTable, MachOHeaderAddr, SymTab))});
171 std::move(DeferredAAs.begin(), DeferredAAs.end(),
172 std::back_inserter(
G->allocActions()));
174 MOP.getObjectLinkingLayer().emit(std::move(R), std::move(
G));
177 void discard(
const JITDylib &JD,
const SymbolStringPtr &Sym)
override {}
181 StringRef PlatformJDName;
182 SymbolStringPtr CompleteBootstrapSymbol;
183 SymbolTableVector SymTab;
185 ExecutorAddr MachOHeaderAddr;
186 ExecutorAddr PlatformBootstrap;
187 ExecutorAddr PlatformShutdown;
188 ExecutorAddr RegisterJITDylib;
189 ExecutorAddr DeregisterJITDylib;
190 ExecutorAddr RegisterObjectSymbolTable;
191 ExecutorAddr DeregisterObjectSymbolTable;
194static StringRef ObjCRuntimeObjectSectionsData[] = {
202static StringRef ObjCRuntimeObjectSectionsText[] = {
209static StringRef ObjCRuntimeObjectSectionName =
210 "__llvm_jitlink_ObjCRuntimeRegistrationObject";
212static StringRef ObjCImageInfoSymbolName =
213 "__llvm_jitlink_macho_objc_imageinfo";
215struct ObjCImageInfoFlags {
216 uint16_t SwiftABIVersion;
217 uint16_t SwiftVersion;
218 bool HasCategoryClassProperties;
219 bool HasSignedObjCClassROs;
221 static constexpr uint32_t SIGNED_CLASS_RO = (1 << 4);
222 static constexpr uint32_t HAS_CATEGORY_CLASS_PROPERTIES = (1 << 6);
224 explicit ObjCImageInfoFlags(uint32_t RawFlags) {
225 HasSignedObjCClassROs = RawFlags & SIGNED_CLASS_RO;
226 HasCategoryClassProperties = RawFlags & HAS_CATEGORY_CLASS_PROPERTIES;
227 SwiftABIVersion = (RawFlags >> 8) & 0xFF;
228 SwiftVersion = (RawFlags >> 16) & 0xFFFF;
231 uint32_t rawFlags()
const {
233 if (HasCategoryClassProperties)
234 Result |= HAS_CATEGORY_CLASS_PROPERTIES;
235 if (HasSignedObjCClassROs)
236 Result |= SIGNED_CLASS_RO;
237 Result |= (SwiftABIVersion << 8);
238 Result |= (SwiftVersion << 16);
247std::optional<MachOPlatform::HeaderOptions::BuildVersionOpts>
253 switch (TT.getOS()) {
255 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
256 : MachO::PLATFORM_IOS;
262 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
263 : MachO::PLATFORM_TVOS;
266 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
267 : MachO::PLATFORM_WATCHOS;
270 Platform = TT.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
271 : MachO::PLATFORM_XROS;
282 std::unique_ptr<DefinitionGenerator> OrcRuntime,
286 std::optional<SymbolAliasMap> RuntimeAliases) {
288 auto &ES = ObjLinkingLayer.getExecutionSession();
291 if (!supportedTarget(ES.getTargetTriple()))
293 ES.getTargetTriple().str(),
301 if (
auto Err = PlatformJD.define(
symbolAliases(std::move(*RuntimeAliases))))
302 return std::move(Err);
306 if (
auto Err = PlatformJD.define(
reexports(
307 ES.getBootstrapJITDylib(),
308 {{ES.intern(
"___orc_rt_jit_dispatch"),
309 {ES.intern(rt::DispatchName),
310 JITSymbolFlags::Exported | JITSymbolFlags::Callable}},
311 {ES.intern(
"___orc_rt_jit_dispatch_ctx"),
312 {ES.intern(rt::DispatchCtxName), JITSymbolFlags::Exported}}})))
318 auto P = std::unique_ptr<MachOPlatform>(
319 new MachOPlatform(ObjLinkingLayer, PlatformJD, std::move(OrcRuntime),
320 std::move(BuildHeaderOpts), std::move(PlatformJDOpts),
321 std::move(BuildMachOHeaderMU), Err));
323 return std::move(Err);
331 std::optional<SymbolAliasMap> RuntimeAliases) {
334 auto OrcRuntimeArchiveGenerator =
336 if (!OrcRuntimeArchiveGenerator)
337 return OrcRuntimeArchiveGenerator.takeError();
339 return Create(ObjLinkingLayer, PlatformJD,
340 std::move(*OrcRuntimeArchiveGenerator),
341 std::move(BuildHeaderOpts), std::move(PlatformJDOpts),
342 std::move(BuildMachOHeaderMU), std::move(RuntimeAliases));
350 if (
auto Err = JD.
define(BuildMachOHeaderMU(*
this, std::move(Opts))))
353 return ES.lookup({&JD}, MachOHeaderStartSymbol).takeError();
357 std::lock_guard<std::mutex> Lock(PlatformMutex);
358 auto I = JITDylibToHeaderAddr.find(&JD);
359 if (
I != JITDylibToHeaderAddr.end()) {
360 assert(HeaderAddrToJITDylib.count(
I->second) &&
361 "HeaderAddrToJITDylib missing entry");
362 HeaderAddrToJITDylib.erase(
I->second);
363 JITDylibToHeaderAddr.erase(
I);
365 JITDylibToPThreadKey.erase(&JD);
376 RegisteredInitSymbols[&JD].add(InitSym,
379 dbgs() <<
"MachOPlatform: Registered init symbol " << *InitSym <<
" for MU "
390 ArrayRef<std::pair<const char *, const char *>> AL) {
391 for (
auto &KV : AL) {
392 auto AliasName = ES.
intern(KV.first);
393 assert(!Aliases.
count(AliasName) &&
"Duplicate symbol name in alias map");
394 Aliases[std::move(AliasName)] = {ES.
intern(KV.second),
409 static const std::pair<const char *, const char *> RequiredCXXAliases[] = {
410 {
"___cxa_atexit",
"___orc_rt_macho_cxa_atexit"}};
417 static const std::pair<const char *, const char *>
418 StandardRuntimeUtilityAliases[] = {
419 {
"___orc_rt_run_program",
"___orc_rt_macho_run_program"},
420 {
"___orc_rt_jit_dlerror",
"___orc_rt_macho_jit_dlerror"},
421 {
"___orc_rt_jit_dlopen",
"___orc_rt_macho_jit_dlopen"},
422 {
"___orc_rt_jit_dlupdate",
"___orc_rt_macho_jit_dlupdate"},
423 {
"___orc_rt_jit_dlclose",
"___orc_rt_macho_jit_dlclose"},
424 {
"___orc_rt_jit_dlsym",
"___orc_rt_macho_jit_dlsym"},
425 {
"___orc_rt_log_error",
"___orc_rt_log_error_to_stderr"}};
428 StandardRuntimeUtilityAliases);
433 static const std::pair<const char *, const char *>
434 StandardLazyCompilationAliases[] = {
435 {
"__orc_rt_reenter",
"__orc_rt_sysv_reenter"},
436 {
"__orc_rt_resolve_tag",
"___orc_rt_resolve_tag"}};
439 StandardLazyCompilationAliases);
446bool MachOPlatform::supportedTarget(
const Triple &TT) {
447 switch (TT.getArch()) {
457 switch (
G.getTargetTriple().getArch()) {
468MachOPlatform::flagsForSymbol(jitlink::Symbol &Sym) {
479MachOPlatform::MachOPlatform(
481 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
482 HeaderOptionsBuilder BuildHeaderOpts, HeaderOptions PlatformJDOpts,
483 MachOHeaderMUBuilder BuildMachOHeaderMU,
Error &Err)
484 : ES(ObjLinkingLayer.getExecutionSession()), PlatformJD(PlatformJD),
485 ObjLinkingLayer(ObjLinkingLayer),
486 BuildHeaderOpts(std::
move(BuildHeaderOpts)),
487 BuildMachOHeaderMU(std::
move(BuildMachOHeaderMU)) {
488 ErrorAsOutParameter
_(Err);
489 ObjLinkingLayer.addPlugin(std::make_unique<MachOPlatformPlugin>(*
this));
490 PlatformJD.addGenerator(std::move(OrcRuntimeGenerator));
494 std::optional<bool> ForceEHFrames;
495 if ((Err = ES.getBootstrapMapValue<
bool,
bool>(
"darwin-use-ehframes-only",
498 this->ForceEHFrames = ForceEHFrames.value_or(
false);
559 if ((Err = PlatformJD.define(
560 this->BuildMachOHeaderMU(*
this, std::move(PlatformJDOpts)))))
562 if ((Err = ES.lookup(&PlatformJD, MachOHeaderStartSymbol).takeError()))
569 {PlatformBootstrap.Name, PlatformShutdown.Name,
570 RegisterJITDylib.Name, DeregisterJITDylib.Name,
571 RegisterObjectSymbolTable.Name,
572 DeregisterObjectSymbolTable.Name,
573 RegisterObjectPlatformSections.Name,
574 DeregisterObjectPlatformSections.Name,
575 CreatePThreadKey.Name}))
581 std::unique_lock<std::mutex> Lock(PlatformMutex);
582 BI.CV.wait(Lock, [&]() {
return BI.ActiveGraphs == 0; });
587 auto BootstrapCompleteSymbol = ES.intern(
"__orc_rt_macho_complete_bootstrap");
588 if ((Err = PlatformJD.define(
589 std::make_unique<MachOPlatformCompleteBootstrapMaterializationUnit>(
590 *
this, PlatformJD.getName(), BootstrapCompleteSymbol,
591 std::move(BI.SymTab), std::move(BI.DeferredAAs),
592 BI.MachOHeaderAddr, PlatformBootstrap.Addr,
593 PlatformShutdown.Addr, RegisterJITDylib.Addr,
594 DeregisterJITDylib.Addr, RegisterObjectSymbolTable.Addr,
595 DeregisterObjectSymbolTable.Addr))))
599 std::move(BootstrapCompleteSymbol))
610 if ((Err = associateRuntimeSupportFunctions()))
614Error MachOPlatform::associateRuntimeSupportFunctions() {
617 using PushInitializersSPSSig =
618 SPSExpected<SPSMachOJITDylibDepInfoMap>(SPSExecutorAddr);
619 WFs[ES.intern(
"___orc_rt_macho_push_initializers_tag")] =
620 ES.wrapAsyncWithSPS<PushInitializersSPSSig>(
621 this, &MachOPlatform::rt_pushInitializers);
623 using PushSymbolsSPSSig =
624 SPSError(SPSExecutorAddr, SPSSequence<SPSTuple<SPSString, bool>>);
625 WFs[ES.intern(
"___orc_rt_macho_push_symbols_tag")] =
626 ES.wrapAsyncWithSPS<PushSymbolsSPSSig>(
this,
627 &MachOPlatform::rt_pushSymbols);
629 return ES.registerJITDispatchHandlers(PlatformJD, std::move(WFs));
632void MachOPlatform::pushInitializersLoop(
633 PushInitializersSendResultFn SendResult,
JITDylibSP JD) {
634 DenseMap<JITDylib *, SymbolLookupSet> NewInitSymbols;
635 DenseMap<JITDylib *, SmallVector<JITDylib *>> JDDepMap;
638 ES.runSessionLocked([&]() {
639 while (!Worklist.empty()) {
642 auto DepJD = Worklist.back();
651 auto &
DM = It->second;
654 if (KV.first == DepJD)
656 DM.push_back(KV.first);
657 Worklist.push_back(KV.first);
662 auto RISItr = RegisteredInitSymbols.find(DepJD);
663 if (RISItr != RegisteredInitSymbols.end()) {
664 NewInitSymbols[DepJD] = std::move(RISItr->second);
665 RegisteredInitSymbols.erase(RISItr);
672 if (NewInitSymbols.
empty()) {
678 DenseMap<JITDylib *, ExecutorAddr> HeaderAddrs;
681 std::lock_guard<std::mutex> Lock(PlatformMutex);
682 for (
auto &KV : JDDepMap) {
683 auto I = JITDylibToHeaderAddr.find(KV.first);
684 if (
I != JITDylibToHeaderAddr.end())
685 HeaderAddrs[KV.first] =
I->second;
691 DIM.reserve(JDDepMap.size());
692 for (
auto &KV : JDDepMap) {
693 auto HI = HeaderAddrs.
find(KV.first);
695 if (HI == HeaderAddrs.
end())
699 for (
auto &Dep : KV.second) {
700 auto HJ = HeaderAddrs.
find(Dep);
701 if (HJ != HeaderAddrs.
end())
702 DepInfo.DepHeaders.push_back(HJ->second);
704 DIM.push_back(std::make_pair(
H, std::move(DepInfo)));
712 [
this, SendResult = std::move(SendResult), JD](
Error Err)
mutable {
714 SendResult(std::move(Err));
716 pushInitializersLoop(std::move(SendResult), JD);
718 ES, std::move(NewInitSymbols));
721void MachOPlatform::rt_pushInitializers(PushInitializersSendResultFn SendResult,
725 std::lock_guard<std::mutex> Lock(PlatformMutex);
726 auto I = HeaderAddrToJITDylib.find(JDHeaderAddr);
727 if (
I != HeaderAddrToJITDylib.end())
732 dbgs() <<
"MachOPlatform::rt_pushInitializers(" << JDHeaderAddr <<
") ";
734 dbgs() <<
"pushing initializers for " << JD->
getName() <<
"\n";
736 dbgs() <<
"No JITDylib for header address.\n";
741 formatv(
"{0:x}", JDHeaderAddr),
746 pushInitializersLoop(std::move(SendResult), JD);
749void MachOPlatform::rt_pushSymbols(
750 PushSymbolsInSendResultFn SendResult,
ExecutorAddr Handle,
751 const std::vector<std::pair<StringRef, bool>> &SymbolNames) {
753 JITDylib *JD =
nullptr;
756 std::lock_guard<std::mutex> Lock(PlatformMutex);
757 auto I = HeaderAddrToJITDylib.find(Handle);
758 if (
I != HeaderAddrToJITDylib.end())
762 dbgs() <<
"MachOPlatform::rt_pushSymbols(";
766 dbgs() <<
"<invalid handle " << Handle <<
">, [ ";
767 for (
auto &Name : SymbolNames)
768 dbgs() <<
"\"" <<
Name.first <<
"\" ";
780 for (
auto &[Name,
Required] : SymbolNames)
788 [SendResult = std::move(SendResult)](Expected<SymbolMap>
Result)
mutable {
789 SendResult(
Result.takeError());
794Expected<uint64_t> MachOPlatform::createPThreadKey() {
795 if (!CreatePThreadKey.Addr)
797 "Attempting to create pthread key in target, but runtime support has "
798 "not been loaded yet",
801 Expected<uint64_t>
Result(0);
802 if (
auto Err = ES.callSPSWrapper<SPSExpected<uint64_t>(
void)>(
803 CreatePThreadKey.Addr,
Result))
804 return std::move(Err);
808void MachOPlatform::MachOPlatformPlugin::modifyPassConfig(
810 jitlink::PassConfiguration &Config) {
812 using namespace jitlink;
814 bool InBootstrapPhase =
false;
816 ExecutorAddr HeaderAddr;
818 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
821 InBootstrapPhase =
true;
822 ++MP.Bootstrap->ActiveGraphs;
828 if (
I != MP.JITDylibToHeaderAddr.end())
829 HeaderAddr =
I->second;
834 if (MP.ForceEHFrames)
843 Linkage::Strong, Scope::Local,
true);
848 return bootstrapPipelineRecordRuntimeFunctions(
G);
857 if (InitSymbol == MP.MachOHeaderStartSymbol && !InBootstrapPhase) {
859 return associateJITDylibHeaderSymbol(
G, MR);
868 if (
auto Err = preserveImportantSections(
G, MR))
870 return processObjCImageInfo(
G, MR);
873 [
this](LinkGraph &
G) {
return createObjCRuntimeObject(
G); });
875 [
this, &MR](LinkGraph &
G) {
return populateObjCRuntimeObject(
G, MR); });
883 return fixTLVSectionsAndEdges(G, JD);
889 auto JITSymTabInfo = std::make_shared<JITSymTabVector>();
891 return prepareSymbolTableRegistration(
G, *JITSymTabInfo);
894 InBootstrapPhase](LinkGraph &
G) {
895 return addSymbolTableRegistration(
G, MR, *JITSymTabInfo, InBootstrapPhase);
902 InBootstrapPhase](LinkGraph &
G) {
903 return registerObjectPlatformSections(G, JD, HeaderAddr, InBootstrapPhase);
908 if (InBootstrapPhase)
910 [
this](LinkGraph &
G) {
return bootstrapPipelineEnd(
G); });
913Error MachOPlatform::MachOPlatformPlugin::
914 bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G) {
916 std::pair<StringRef, ExecutorAddr *> RuntimeSymbols[] = {
917 {*MP.MachOHeaderStartSymbol, &MP.Bootstrap->MachOHeaderAddr},
918 {*MP.PlatformBootstrap.Name, &MP.PlatformBootstrap.Addr},
919 {*MP.PlatformShutdown.Name, &MP.PlatformShutdown.Addr},
920 {*MP.RegisterJITDylib.Name, &MP.RegisterJITDylib.Addr},
921 {*MP.DeregisterJITDylib.Name, &MP.DeregisterJITDylib.Addr},
922 {*MP.RegisterObjectSymbolTable.Name, &MP.RegisterObjectSymbolTable.Addr},
923 {*MP.DeregisterObjectSymbolTable.Name,
924 &MP.DeregisterObjectSymbolTable.Addr},
925 {*MP.RegisterObjectPlatformSections.Name,
926 &MP.RegisterObjectPlatformSections.Addr},
927 {*MP.DeregisterObjectPlatformSections.Name,
928 &MP.DeregisterObjectPlatformSections.Addr},
929 {*MP.CreatePThreadKey.Name, &MP.CreatePThreadKey.Addr},
930 {*MP.RegisterObjCRuntimeObject.Name, &MP.RegisterObjCRuntimeObject.Addr},
931 {*MP.DeregisterObjCRuntimeObject.Name,
932 &MP.DeregisterObjCRuntimeObject.Addr}};
934 bool RegisterMachOHeader =
false;
936 for (
auto *Sym :
G.defined_symbols()) {
937 for (
auto &RTSym : RuntimeSymbols) {
941 "Duplicate " + RTSym.first +
942 " detected during MachOPlatform bootstrap",
945 if (Sym->
getName() == MP.MachOHeaderStartSymbol)
946 RegisterMachOHeader =
true;
953 if (RegisterMachOHeader) {
956 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
957 MP.JITDylibToHeaderAddr[&MP.PlatformJD] = MP.Bootstrap->MachOHeaderAddr;
958 MP.HeaderAddrToJITDylib[MP.Bootstrap->MachOHeaderAddr] = &MP.PlatformJD;
964Error MachOPlatform::MachOPlatformPlugin::bootstrapPipelineEnd(
965 jitlink::LinkGraph &
G) {
966 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
968 --MP.Bootstrap->ActiveGraphs;
971 if (MP.Bootstrap->ActiveGraphs == 0)
972 MP.Bootstrap->CV.notify_all();
976Error MachOPlatform::MachOPlatformPlugin::associateJITDylibHeaderSymbol(
977 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
978 auto I =
llvm::find_if(
G.defined_symbols(), [
this](jitlink::Symbol *Sym) {
979 return Sym->getName() == MP.MachOHeaderStartSymbol;
981 assert(
I !=
G.defined_symbols().end() &&
"Missing MachO header start symbol");
984 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
985 auto HeaderAddr = (*I)->getAddress();
986 MP.JITDylibToHeaderAddr[&JD] = HeaderAddr;
987 MP.HeaderAddrToJITDylib[HeaderAddr] = &JD;
990 G.allocActions().push_back(
993 MP.RegisterJITDylib.Addr, JD.
getName(), HeaderAddr)),
995 MP.DeregisterJITDylib.Addr, HeaderAddr))});
999Error MachOPlatform::MachOPlatformPlugin::preserveImportantSections(
1000 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
1005 if (
auto *ObjCImageInfoSec =
1007 if (ObjCImageInfoSec->blocks_size() != 1)
1009 "In " +
G.getName() +
1010 "__DATA,__objc_imageinfo contains multiple blocks",
1012 G.addAnonymousSymbol(**ObjCImageInfoSec->blocks().begin(), 0, 0,
false,
1015 for (
auto *
B : ObjCImageInfoSec->blocks())
1016 if (!
B->edges_empty())
1019 " contains references to symbols",
1028 jitlink::Symbol *InitSym =
nullptr;
1036 auto *InitSection =
G.findSectionByName(InitSectionName);
1037 if (!InitSection || InitSection->empty())
1043 auto &
B = **InitSection->blocks().begin();
1044 InitSym = &
G.addDefinedSymbol(
1050 for (
auto *
B : InitSection->blocks()) {
1054 auto &S =
G.addAnonymousSymbol(*
B, 0,
B->getSize(),
false,
true);
1063Error MachOPlatform::MachOPlatformPlugin::processObjCImageInfo(
1064 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
1076 auto ObjCImageInfoBlocks = ObjCImageInfo->blocks();
1079 if (ObjCImageInfoBlocks.empty())
1081 " section in " +
G.getName(),
1085 if (std::next(ObjCImageInfoBlocks.begin()) != ObjCImageInfoBlocks.end())
1088 " section in " +
G.getName(),
1093 for (
auto &Sec :
G.sections()) {
1094 if (&Sec != ObjCImageInfo)
1095 for (
auto *
B : Sec.blocks())
1096 for (
auto &
E :
B->edges())
1097 if (
E.getTarget().isDefined() &&
1098 &
E.getTarget().getSection() == ObjCImageInfo)
1100 " is referenced within file " +
1105 auto &ObjCImageInfoBlock = **ObjCImageInfoBlocks.begin();
1106 auto *ObjCImageInfoData = ObjCImageInfoBlock.getContent().data();
1112 std::lock_guard<std::mutex> Lock(PluginMutex);
1115 if (ObjCImageInfoItr != ObjCImageInfos.end()) {
1118 if (ObjCImageInfoItr->second.Version !=
Version)
1120 "ObjC version in " +
G.getName() +
1121 " does not match first registered version",
1123 if (ObjCImageInfoItr->second.Flags != Flags)
1124 if (
Error E = mergeImageInfoFlags(
G, MR, ObjCImageInfoItr->second, Flags))
1128 while (ObjCImageInfo->symbols_size() != 0)
1129 G.removeDefinedSymbol(**ObjCImageInfo->symbols().begin());
1130 G.removeBlock(ObjCImageInfoBlock);
1133 dbgs() <<
"MachOPlatform: Registered __objc_imageinfo for "
1135 <<
"; flags = " <<
formatv(
"{0:x4}", Flags) <<
"\n";
1139 G.addDefinedSymbol(ObjCImageInfoBlock, 0, ObjCImageInfoSymbolName,
1143 {{MR.getExecutionSession().intern(ObjCImageInfoSymbolName),
1144 JITSymbolFlags()}}))
1152Error MachOPlatform::MachOPlatformPlugin::mergeImageInfoFlags(
1153 jitlink::LinkGraph &
G, MaterializationResponsibility &MR,
1154 ObjCImageInfo &Info, uint32_t NewFlags) {
1155 if (
Info.Flags == NewFlags)
1158 ObjCImageInfoFlags Old(
Info.Flags);
1159 ObjCImageInfoFlags
New(NewFlags);
1162 if (Old.SwiftABIVersion &&
New.SwiftABIVersion &&
1163 Old.SwiftABIVersion !=
New.SwiftABIVersion)
1165 " does not match first registered flags",
1171 if (
Info.Finalized && Old.HasCategoryClassProperties &&
1172 !
New.HasCategoryClassProperties)
1175 " does not match first registered flags",
1177 if (
Info.Finalized && Old.HasSignedObjCClassROs && !
New.HasSignedObjCClassROs)
1180 " does not match first registered flags",
1189 if (Old.SwiftVersion &&
New.SwiftVersion)
1190 New.SwiftVersion = std::min(Old.SwiftVersion,
New.SwiftVersion);
1191 else if (Old.SwiftVersion)
1192 New.SwiftVersion = Old.SwiftVersion;
1194 if (!
New.SwiftABIVersion)
1195 New.SwiftABIVersion = Old.SwiftABIVersion;
1197 if (Old.HasCategoryClassProperties !=
New.HasCategoryClassProperties)
1198 New.HasCategoryClassProperties =
false;
1200 if (Old.HasSignedObjCClassROs !=
New.HasSignedObjCClassROs)
1201 New.HasSignedObjCClassROs =
false;
1204 dbgs() <<
"MachOPlatform: Merging __objc_imageinfo flags for "
1206 <<
formatv(
"{0:x4}", Old.rawFlags()) <<
")"
1207 <<
" with " <<
G.getName() <<
" (" <<
formatv(
"{0:x4}", NewFlags)
1209 <<
" -> " <<
formatv(
"{0:x4}",
New.rawFlags()) <<
"\n";
1216Error MachOPlatform::MachOPlatformPlugin::fixTLVSectionsAndEdges(
1217 jitlink::LinkGraph &
G, JITDylib &JD) {
1218 auto TLVBootStrapSymbolName =
G.intern(
"__tlv_bootstrap");
1220 for (
auto *Sym :
G.external_symbols())
1221 if (Sym->
getName() == TLVBootStrapSymbolName) {
1223 MP.getExecutionSession().intern(
"___orc_rt_macho_tlv_get_addr");
1224 Sym->
setName(std::move(TLSGetADDR));
1230 std::optional<uint64_t>
Key;
1232 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1233 auto I = MP.JITDylibToPThreadKey.find(&JD);
1234 if (
I != MP.JITDylibToPThreadKey.end())
1239 if (
auto KeyOrErr = MP.createPThreadKey())
1242 return KeyOrErr.takeError();
1245 uint64_t PlatformKeyBits =
1248 for (
auto *
B : ThreadDataSec->blocks()) {
1249 if (
B->getSize() != 3 *
G.getPointerSize())
1251 formatv(
"{0:x}",
B->getAddress()) +
1252 " has unexpected size",
1255 auto NewBlockContent =
G.allocateBuffer(
B->getSize());
1256 llvm::copy(
B->getContent(), NewBlockContent.data());
1257 memcpy(NewBlockContent.data() +
G.getPointerSize(), &PlatformKeyBits,
1258 G.getPointerSize());
1259 B->setContent(NewBlockContent);
1264 for (
auto *
B :
G.blocks())
1265 for (
auto &
E :
B->edges())
1268 E.setKind(jitlink::x86_64::
1269 RequestGOTAndTransformToPCRel32GOTLoadREXRelaxable);
1274std::optional<MachOPlatform::MachOPlatformPlugin::UnwindSections>
1275MachOPlatform::MachOPlatformPlugin::findUnwindSectionInfo(
1276 jitlink::LinkGraph &
G) {
1277 using namespace jitlink;
1284 auto ScanUnwindInfoSection = [&](
Section &Sec, ExecutorAddrRange &SecRange,
1285 auto AddCodeBlocks) {
1286 if (Sec.blocks().empty())
1288 SecRange = (*Sec.blocks().
begin())->getRange();
1289 for (
auto *
B : Sec.blocks()) {
1290 auto R =
B->getRange();
1291 SecRange.Start = std::min(SecRange.Start,
R.Start);
1292 SecRange.End = std::max(SecRange.End,
R.End);
1298 ScanUnwindInfoSection(*EHFrameSec, US.DwarfSection, [&](
Block &
B) {
1299 if (auto *Fn = jitlink::EHFrameCFIBlockInspector::FromEdgeScan(B)
1301 if (Fn->getTarget().isDefined())
1302 CodeBlocks.push_back(&Fn->getTarget().getBlock());
1307 ScanUnwindInfoSection(
1308 *CUInfoSec, US.CompactUnwindSection, [&](
Block &
B) {
1309 for (auto &E : B.edges()) {
1310 assert(E.getTarget().isDefined() &&
1311 "unwind-info record edge has external target");
1312 assert(E.getKind() == Edge::KeepAlive &&
1313 "unwind-info record has unexpected edge kind");
1314 CodeBlocks.push_back(&E.getTarget().getBlock());
1321 if (CodeBlocks.
empty())
1322 return std::nullopt;
1327 return LHS->getAddress() <
RHS->getAddress();
1329 for (
auto *
B : CodeBlocks) {
1330 if (US.CodeRanges.empty() || US.CodeRanges.back().End !=
B->getAddress())
1331 US.CodeRanges.push_back(
B->getRange());
1333 US.CodeRanges.back().End =
B->getRange().End;
1337 dbgs() <<
"MachOPlatform identified unwind info in " <<
G.getName() <<
":\n"
1339 if (US.DwarfSection.Start)
1340 dbgs() << US.DwarfSection <<
"\n";
1343 dbgs() <<
" Compact-unwind: ";
1344 if (US.CompactUnwindSection.Start)
1345 dbgs() << US.CompactUnwindSection <<
"\n";
1348 <<
"for code ranges:\n";
1349 for (
auto &CR : US.CodeRanges)
1350 dbgs() <<
" " << CR <<
"\n";
1351 if (US.CodeRanges.size() >=
G.sections_size())
1352 dbgs() <<
"WARNING: High number of discontiguous code ranges! "
1353 "Padding may be interfering with coalescing.\n";
1359Error MachOPlatform::MachOPlatformPlugin::registerObjectPlatformSections(
1360 jitlink::LinkGraph &
G, JITDylib &JD, ExecutorAddr HeaderAddr,
1361 bool InBootstrapPhase) {
1365 jitlink::Section *ThreadDataSection =
1373 if (ThreadDataSection)
1374 G.mergeSections(*ThreadDataSection, *ThreadBSSSection);
1376 ThreadDataSection = ThreadBSSSection;
1385 for (
auto &SecName : DataSections) {
1386 if (
auto *Sec =
G.findSectionByName(SecName)) {
1387 jitlink::SectionRange
R(*Sec);
1389 MachOPlatformSecs.
push_back({SecName,
R.getRange()});
1395 if (ThreadDataSection) {
1396 jitlink::SectionRange
R(*ThreadDataSection);
1404 ObjCRuntimeObjectSectionName};
1406 for (
auto &SecName : PlatformSections) {
1407 auto *Sec =
G.findSectionByName(SecName);
1410 jitlink::SectionRange
R(*Sec);
1414 MachOPlatformSecs.
push_back({SecName,
R.getRange()});
1417 std::optional<std::tuple<SmallVector<ExecutorAddrRange>, ExecutorAddrRange,
1420 if (
auto UI = findUnwindSectionInfo(
G))
1421 UnwindInfo = std::make_tuple(std::move(UI->CodeRanges), UI->DwarfSection,
1422 UI->CompactUnwindSection);
1424 if (!MachOPlatformSecs.
empty() || UnwindInfo) {
1427 dbgs() <<
"MachOPlatform: Scraped " <<
G.getName() <<
" init sections:\n";
1428 for (
auto &KV : MachOPlatformSecs)
1429 dbgs() <<
" " << KV.first <<
": " << KV.second <<
"\n";
1432 assert(HeaderAddr &&
"Null header registered for JD");
1433 using SPSRegisterObjectPlatformSectionsArgs = SPSArgList<
1435 SPSOptional<SPSTuple<SPSSequence<SPSExecutorAddrRange>,
1437 SPSSequence<SPSTuple<SPSString, SPSExecutorAddrRange>>>;
1442 MP.RegisterObjectPlatformSections.Addr, HeaderAddr, UnwindInfo,
1443 MachOPlatformSecs)),
1446 MP.DeregisterObjectPlatformSections.Addr, HeaderAddr,
1447 UnwindInfo, MachOPlatformSecs))};
1452 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1453 MP.Bootstrap->DeferredAAs.push_back(std::move(
AllocActions));
1460Error MachOPlatform::MachOPlatformPlugin::createObjCRuntimeObject(
1461 jitlink::LinkGraph &
G) {
1463 bool NeedTextSegment =
false;
1464 size_t NumRuntimeSections = 0;
1466 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsData)
1467 if (
G.findSectionByName(ObjCRuntimeSectionName))
1468 ++NumRuntimeSections;
1470 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsText) {
1471 if (
G.findSectionByName(ObjCRuntimeSectionName)) {
1472 ++NumRuntimeSections;
1473 NeedTextSegment =
true;
1478 if (NumRuntimeSections == 0)
1483 ++NumRuntimeSections;
1485 size_t MachOSize =
sizeof(MachO::mach_header_64) +
1486 (NeedTextSegment + 1) *
sizeof(MachO::segment_command_64) +
1487 NumRuntimeSections *
sizeof(MachO::section_64);
1489 auto &Sec =
G.createSection(ObjCRuntimeObjectSectionName,
1491 G.createMutableContentBlock(Sec, MachOSize, ExecutorAddr(), 16, 0,
true);
1496Error MachOPlatform::MachOPlatformPlugin::populateObjCRuntimeObject(
1497 jitlink::LinkGraph &
G, MaterializationResponsibility &MR) {
1499 auto *ObjCRuntimeObjectSec =
1500 G.findSectionByName(ObjCRuntimeObjectSectionName);
1502 if (!ObjCRuntimeObjectSec)
1505 switch (
G.getTargetTriple().getArch()) {
1512 G.getTargetTriple().str(),
1516 auto &SecBlock = **ObjCRuntimeObjectSec->blocks().begin();
1519 MachO::section_64 Sec;
1520 unique_function<void(
size_t RecordOffset)> AddFixups;
1523 std::vector<SecDesc> TextSections, DataSections;
1524 auto AddSection = [&](SecDesc &SD, jitlink::Section &GraphSec) {
1525 jitlink::SectionRange SR(GraphSec);
1526 StringRef FQName = GraphSec.getName();
1527 memset(&SD.Sec, 0,
sizeof(MachO::section_64));
1529 memcpy(SD.Sec.segname, FQName.
data(), 6);
1530 SD.Sec.addr = SR.getStart() - SecBlock.getAddress();
1531 SD.Sec.size = SR.getSize();
1537 DataSections.push_back({});
1538 auto &SD = DataSections.back();
1539 memset(&SD.Sec, 0,
sizeof(SD.Sec));
1540 memcpy(SD.Sec.sectname,
"__objc_imageinfo", 16);
1541 strcpy(SD.Sec.segname,
"__DATA");
1543 jitlink::Symbol *ObjCImageInfoSym =
nullptr;
1544 SD.AddFixups = [&, ObjCImageInfoSym](
size_t RecordOffset)
mutable {
1545 auto PointerEdge = getPointerEdgeKind(
G);
1548 if (!ObjCImageInfoSym) {
1549 auto Name =
G.intern(ObjCImageInfoSymbolName);
1550 ObjCImageInfoSym =
G.findExternalSymbolByName(Name);
1551 if (!ObjCImageInfoSym)
1552 ObjCImageInfoSym =
G.findAbsoluteSymbolByName(Name);
1553 if (!ObjCImageInfoSym) {
1554 ObjCImageInfoSym =
G.findDefinedSymbolByName(Name);
1555 if (ObjCImageInfoSym) {
1556 std::optional<uint32_t>
Flags;
1558 std::lock_guard<std::mutex> Lock(PluginMutex);
1560 if (It != ObjCImageInfos.end()) {
1561 It->second.Finalized =
true;
1562 Flags = It->second.Flags;
1571 Content.size() == 8 &&
1572 "__objc_image_info size should have been verified already");
1577 if (!ObjCImageInfoSym)
1578 ObjCImageInfoSym = &
G.addExternalSymbol(std::move(Name), 8,
false);
1581 SecBlock.addEdge(PointerEdge,
1582 RecordOffset + ((
char *)&SD.Sec.addr - (
char *)&SD.Sec),
1583 *ObjCImageInfoSym, -SecBlock.getAddress().getValue());
1587 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsData) {
1588 if (
auto *GraphSec =
G.findSectionByName(ObjCRuntimeSectionName)) {
1589 DataSections.push_back({});
1590 AddSection(DataSections.back(), *GraphSec);
1594 for (
auto ObjCRuntimeSectionName : ObjCRuntimeObjectSectionsText) {
1595 if (
auto *GraphSec =
G.findSectionByName(ObjCRuntimeSectionName)) {
1596 TextSections.push_back({});
1597 AddSection(TextSections.back(), *GraphSec);
1601 assert(ObjCRuntimeObjectSec->blocks_size() == 1 &&
1602 "Unexpected number of blocks in runtime sections object");
1606 MachO::mach_header_64 Hdr;
1608 switch (
G.getTargetTriple().getArch()) {
1622 Hdr.
ncmds = 1 + !TextSections.empty();
1624 Hdr.
ncmds *
sizeof(MachO::segment_command_64) +
1625 (TextSections.size() + DataSections.size()) *
sizeof(MachO::section_64);
1629 auto SecContent = SecBlock.getAlreadyMutableContent();
1630 char *
P = SecContent.data();
1631 auto WriteMachOStruct = [&](
auto S) {
1634 memcpy(
P, &S,
sizeof(S));
1638 auto WriteSegment = [&](StringRef
Name, std::vector<SecDesc> &Secs) {
1639 MachO::segment_command_64 SegLC;
1640 memset(&SegLC, 0,
sizeof(SegLC));
1642 SegLC.
cmd = MachO::LC_SEGMENT_64;
1643 SegLC.
cmdsize =
sizeof(MachO::segment_command_64) +
1644 Secs.size() *
sizeof(MachO::section_64);
1645 SegLC.
nsects = Secs.size();
1646 WriteMachOStruct(SegLC);
1647 for (
auto &SD : Secs) {
1649 SD.AddFixups(
P - SecContent.data());
1650 WriteMachOStruct(SD.Sec);
1654 WriteMachOStruct(Hdr);
1655 if (!TextSections.empty())
1656 WriteSegment(
"__TEXT", TextSections);
1657 if (!DataSections.empty())
1658 WriteSegment(
"__DATA", DataSections);
1660 assert(
P == SecContent.end() &&
"Underflow writing ObjC runtime object");
1664Error MachOPlatform::MachOPlatformPlugin::prepareSymbolTableRegistration(
1665 jitlink::LinkGraph &
G, JITSymTabVector &JITSymTabInfo) {
1673 DenseMap<StringRef, jitlink::Symbol *> ExistingStrings;
1674 for (
auto *Sym : CStringSec->symbols()) {
1680 std::make_pair(StringRef(Content.data(), Content.size()), Sym));
1686 SmallVector<jitlink::Symbol *> SymsToProcess;
1690 for (
auto *Sym : SymsToProcess) {
1695 if (
I == ExistingStrings.
end()) {
1696 auto &NameBlock =
G.createMutableContentBlock(
1697 *CStringSec,
G.allocateCString(*Sym->
getName()),
1698 orc::ExecutorAddr(), 1, 0);
1699 auto &SymbolNameSym =
G.addAnonymousSymbol(
1700 NameBlock, 0, NameBlock.getSize(),
false,
true);
1701 JITSymTabInfo.push_back({Sym, &SymbolNameSym});
1703 JITSymTabInfo.push_back({Sym,
I->second});
1710Error MachOPlatform::MachOPlatformPlugin::addSymbolTableRegistration(
1711 jitlink::LinkGraph &
G, MaterializationResponsibility &MR,
1712 JITSymTabVector &JITSymTabInfo,
bool InBootstrapPhase) {
1714 ExecutorAddr HeaderAddr;
1716 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1718 assert(
I != MP.JITDylibToHeaderAddr.end() &&
"No header registered for JD");
1719 assert(
I->second &&
"Null header registered for JD");
1720 HeaderAddr =
I->second;
1727 std::lock_guard<std::mutex> Lock(MP.PlatformMutex);
1728 auto &SymTab = MP.Bootstrap->SymTab;
1729 for (
auto &[OriginalSymbol, NameSym] : JITSymTabInfo)
1730 SymTab.push_back({NameSym->getAddress(), OriginalSymbol->getAddress(),
1731 flagsForSymbol(*OriginalSymbol)});
1735 SymbolTableVector SymTab;
1736 for (
auto &[OriginalSymbol, NameSym] : JITSymTabInfo)
1737 SymTab.push_back({NameSym->getAddress(), OriginalSymbol->getAddress(),
1738 flagsForSymbol(*OriginalSymbol)});
1740 G.allocActions().push_back(
1742 MP.RegisterObjectSymbolTable.Addr, HeaderAddr, SymTab)),
1744 MP.DeregisterObjectSymbolTable.Addr, HeaderAddr, SymTab))});
1749template <
typename MachOTraits>
1759 B.Header.cputype = HdrInfo.CPUType;
1760 B.Header.cpusubtype = HdrInfo.CPUSubType;
1763 B.template addLoadCommand<MachO::LC_ID_DYLIB>(
1765 Opts.
IDDylib->CurrentVersion, Opts.
IDDylib->CompatibilityVersion);
1767 B.template addLoadCommand<MachO::LC_ID_DYLIB>(JD.
getName(), 0, 0, 0);
1770 B.template addLoadCommand<MachO::LC_UUID>(*Opts.
UUID);
1773 B.template addLoadCommand<MachO::LC_BUILD_VERSION>(
1774 BV.Platform, BV.MinOS, BV.SDK,
static_cast<uint32_t>(0));
1777 B.template addLoadCommand<MachO::LC_TARGET_TRIPLE>(*Opts.
TargetTriple);
1782 case LoadKind::Default:
1783 B.template addLoadCommand<MachO::LC_LOAD_DYLIB>(
1784 LD.D.Name, LD.D.Timestamp, LD.D.CurrentVersion,
1785 LD.D.CompatibilityVersion);
1787 case LoadKind::Weak:
1788 B.template addLoadCommand<MachO::LC_LOAD_WEAK_DYLIB>(
1789 LD.D.Name, LD.D.Timestamp, LD.D.CurrentVersion,
1790 LD.D.CompatibilityVersion);
1795 B.template addLoadCommand<MachO::LC_RPATH>(
P);
1797 auto HeaderContent =
G.allocateBuffer(
B.layout());
1798 B.write(HeaderContent);
1800 return G.createContentBlock(HeaderSection, HeaderContent,
ExecutorAddr(), 8,
1808 createHeaderInterface(
MOP,
std::
move(HeaderStartSymbol))),
1812 std::unique_ptr<MaterializationResponsibility> R) {
1813 auto G = createPlatformGraph(
MOP,
"<MachOHeaderMU>");
1814 addMachOHeader(R->getTargetJITDylib(), *
G, R->getInitializerSymbol());
1815 MOP.getObjectLinkingLayer().emit(std::move(R), std::move(
G));
1821void SimpleMachOHeaderMU::addMachOHeader(
1824 auto &HeaderSection =
G.createSection(
"__header",
MemProt::Read);
1828 G.addDefinedSymbol(HeaderBlock, 0, *InitializerSymbol, HeaderBlock.getSize(),
1831 for (
auto &HS : AdditionalHeaderSymbols)
1832 G.addDefinedSymbol(HeaderBlock, HS.Offset, HS.Name, HeaderBlock.getSize(),
1840 switch (
MOP.getExecutionSession().getTargetTriple().getArch()) {
1843 return ::createHeaderBlock<MachO64LE>(
MOP,
Opts, JD,
G, HeaderSection);
1854 for (
auto &HS : AdditionalHeaderSymbols)
1863 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),...
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
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)
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.
DenseMap< SymbolStringPtr, JITDispatchHandlerFunction > JITDispatchHandlerAssociationMap
A map associating tag names with asynchronous wrapper function implementations in the JIT.
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.
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.
Pointer to a pooled string representing a symbol name.
A utility class for serializing to a blob from a variadic list.
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
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)
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.