111         std::unique_ptr<DefinitionGenerator> OrcRuntime,
 
  112         std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
 
  117         const char *OrcRuntimePath,
 
  118         std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
 
  140  standardRuntimeUtilityAliases();
 
  145  standardLazyCompilationAliases();
 
  149  struct BootstrapInfo {
 
  151    std::condition_variable CV;
 
  152    size_t ActiveGraphs = 0;
 
  156    void addArgumentsToRTFnMap(
 
  160      std::lock_guard<std::mutex> Lock(
Mutex);
 
  161      auto &argList = DeferredRTFnMap[std::make_pair(func1, func2)];
 
  162      argList.emplace_back(arg1, arg2);
 
  169  class LLVM_ABI ELFNixPlatformPlugin : 
public ObjectLinkingLayer::Plugin {
 
  171    ELFNixPlatformPlugin(ELFNixPlatform &MP) : MP(MP) {}
 
  173    void modifyPassConfig(MaterializationResponsibility &MR,
 
  174                          jitlink::LinkGraph &
G,
 
  175                          jitlink::PassConfiguration &Config) 
override;
 
  179    Error notifyFailed(MaterializationResponsibility &MR)
 override {
 
  180      return Error::success();
 
  183    Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
 override {
 
  184      return Error::success();
 
  187    void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
 
  188                                     ResourceKey SrcKey)
 override {}
 
  191    Error bootstrapPipelineStart(jitlink::LinkGraph &
G);
 
  192    Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &
G);
 
  193    Error bootstrapPipelineEnd(jitlink::LinkGraph &
G);
 
  195    void addDSOHandleSupportPasses(MaterializationResponsibility &MR,
 
  196                                   jitlink::PassConfiguration &Config);
 
  198    void addEHAndTLVSupportPasses(MaterializationResponsibility &MR,
 
  199                                  jitlink::PassConfiguration &Config,
 
  200                                  bool IsBootstrapping);
 
  202    Error preserveInitSections(jitlink::LinkGraph &
G,
 
  203                               MaterializationResponsibility &MR);
 
  205    Error registerInitSections(jitlink::LinkGraph &
G, JITDylib &JD,
 
  206                               bool IsBootstrapping);
 
  208    Error fixTLVSectionsAndEdges(jitlink::LinkGraph &
G, JITDylib &JD);
 
  210    std::mutex PluginMutex;
 
  214  using PushInitializersSendResultFn =
 
  215      unique_function<void(Expected<ELFNixJITDylibDepInfoMap>)>;
 
  217  using SendSymbolAddressFn = unique_function<void(Expected<ExecutorAddr>)>;
 
  219  static bool supportedTarget(
const Triple &TT);
 
  221  ELFNixPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
 
  222                 std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
 
  226  Error associateRuntimeSupportFunctions(JITDylib &PlatformJD);
 
  228  void pushInitializersLoop(PushInitializersSendResultFn SendResult,
 
  231  void rt_recordInitializers(PushInitializersSendResultFn SendResult,
 
  232                             ExecutorAddr JDHeader);
 
  234  void rt_lookupSymbol(SendSymbolAddressFn SendResult, ExecutorAddr Handle,
 
  235                       StringRef SymbolName);
 
  237  Error registerPerObjectSections(jitlink::LinkGraph &
G,
 
  238                                  const ELFPerObjectSectionsToRegister &POSR,
 
  239                                  bool IsBootstrapping);
 
  241  Expected<uint64_t> createPThreadKey();
 
  243  ExecutionSession &ES;
 
  244  JITDylib &PlatformJD;
 
  245  ObjectLinkingLayer &ObjLinkingLayer;
 
  247  SymbolStringPtr DSOHandleSymbol;
 
  250      ES.intern(
"__orc_rt_elfnix_platform_bootstrap")};
 
  252      ES.intern(
"__orc_rt_elfnix_platform_shutdown")};
 
  254      ES.intern(
"__orc_rt_elfnix_register_jitdylib")};
 
  256      ES.intern(
"__orc_rt_elfnix_deregister_jitdylib")};
 
  258      ES.intern(
"__orc_rt_elfnix_register_object_sections")};
 
  260      ES.intern(
"__orc_rt_elfnix_deregister_object_sections")};
 
  262      ES.intern(
"__orc_rt_elfnix_register_init_sections")};
 
  264      ES.intern(
"__orc_rt_elfnix_deregister_init_sections")};
 
  266      ES.intern(
"__orc_rt_elfnix_create_pthread_key")};
 
  268  DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
 
  272  std::mutex PlatformMutex;
 
  273  std::vector<ELFPerObjectSectionsToRegister> BootstrapPOSRs;
 
  275  DenseMap<ExecutorAddr, JITDylib *> HandleAddrToJITDylib;
 
  276  DenseMap<JITDylib *, ExecutorAddr> JITDylibToHandleAddr;
 
  277  DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;
 
  279  std::atomic<BootstrapInfo *> Bootstrap;