@@ -255,12 +255,11 @@ struct ObjCImageInfoFlags {
255
255
namespace llvm {
256
256
namespace orc {
257
257
258
- Expected<std::unique_ptr<MachOPlatform>>
259
- MachOPlatform::Create (ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
260
- JITDylib &PlatformJD,
261
- std::unique_ptr<DefinitionGenerator> OrcRuntime,
262
- MachOHeaderMUBuilder BuildMachOHeaderMU,
263
- std::optional<SymbolAliasMap> RuntimeAliases) {
258
+ Expected<std::unique_ptr<MachOPlatform>> MachOPlatform::Create (
259
+ ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
260
+ JITDylib &PlatformJD, std::unique_ptr<DefinitionGenerator> OrcRuntime,
261
+ HeaderOptions PlatformJDOpts, MachOHeaderMUBuilder BuildMachOHeaderMU,
262
+ std::optional<SymbolAliasMap> RuntimeAliases) {
264
263
265
264
// If the target is not supported then bail out immediately.
266
265
if (!supportedTarget (ES.getTargetTriple ()))
@@ -290,9 +289,9 @@ MachOPlatform::Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
290
289
291
290
// Create the instance.
292
291
Error Err = Error::success ();
293
- auto P = std::unique_ptr<MachOPlatform>(
294
- new MachOPlatform ( ES, ObjLinkingLayer, PlatformJD, std::move (OrcRuntime),
295
- std::move (BuildMachOHeaderMU), Err));
292
+ auto P = std::unique_ptr<MachOPlatform>(new MachOPlatform (
293
+ ES, ObjLinkingLayer, PlatformJD, std::move (OrcRuntime),
294
+ std::move (PlatformJDOpts), std::move (BuildMachOHeaderMU), Err));
296
295
if (Err)
297
296
return std::move (Err);
298
297
return std::move (P);
@@ -301,6 +300,7 @@ MachOPlatform::Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
301
300
Expected<std::unique_ptr<MachOPlatform>>
302
301
MachOPlatform::Create (ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
303
302
JITDylib &PlatformJD, const char *OrcRuntimePath,
303
+ HeaderOptions PlatformJDOpts,
304
304
MachOHeaderMUBuilder BuildMachOHeaderMU,
305
305
std::optional<SymbolAliasMap> RuntimeAliases) {
306
306
@@ -312,11 +312,16 @@ MachOPlatform::Create(ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
312
312
313
313
return Create (ES, ObjLinkingLayer, PlatformJD,
314
314
std::move (*OrcRuntimeArchiveGenerator),
315
- std::move (BuildMachOHeaderMU), std::move (RuntimeAliases));
315
+ std::move (PlatformJDOpts), std::move (BuildMachOHeaderMU),
316
+ std::move (RuntimeAliases));
316
317
}
317
318
318
319
Error MachOPlatform::setupJITDylib (JITDylib &JD) {
319
- if (auto Err = JD.define (BuildMachOHeaderMU (*this )))
320
+ return setupJITDylib (JD, /* Opts=*/ {});
321
+ }
322
+
323
+ Error MachOPlatform::setupJITDylib (JITDylib &JD, HeaderOptions Opts) {
324
+ if (auto Err = JD.define (BuildMachOHeaderMU (*this , std::move (Opts))))
320
325
return Err;
321
326
322
327
return ES.lookup ({&JD}, MachOHeaderStartSymbol).takeError ();
@@ -432,7 +437,8 @@ MachOPlatform::MachOPlatform(
432
437
ExecutionSession &ES, ObjectLinkingLayer &ObjLinkingLayer,
433
438
JITDylib &PlatformJD,
434
439
std::unique_ptr<DefinitionGenerator> OrcRuntimeGenerator,
435
- MachOHeaderMUBuilder BuildMachOHeaderMU, Error &Err)
440
+ HeaderOptions PlatformJDOpts, MachOHeaderMUBuilder BuildMachOHeaderMU,
441
+ Error &Err)
436
442
: ES(ES), PlatformJD(PlatformJD), ObjLinkingLayer(ObjLinkingLayer),
437
443
BuildMachOHeaderMU (std::move(BuildMachOHeaderMU)) {
438
444
ErrorAsOutParameter _ (&Err);
@@ -497,7 +503,8 @@ MachOPlatform::MachOPlatform(
497
503
// the support methods callable. The bootstrap is now complete.
498
504
499
505
// Step (1) Add header materialization unit and request.
500
- if ((Err = PlatformJD.define (this ->BuildMachOHeaderMU (*this ))))
506
+ if ((Err = PlatformJD.define (
507
+ this ->BuildMachOHeaderMU (*this , std::move (PlatformJDOpts)))))
501
508
return ;
502
509
if ((Err = ES.lookup (&PlatformJD, MachOHeaderStartSymbol).takeError ()))
503
510
return ;
@@ -1669,9 +1676,10 @@ Error MachOPlatform::MachOPlatformPlugin::addSymbolTableRegistration(
1669
1676
}
1670
1677
1671
1678
template <typename MachOTraits>
1672
- jitlink::Block &createTrivialHeaderBlock (MachOPlatform &MOP,
1673
- jitlink::LinkGraph &G,
1674
- jitlink::Section &HeaderSection) {
1679
+ jitlink::Block &createHeaderBlock (MachOPlatform &MOP,
1680
+ const MachOPlatform::HeaderOptions &Opts,
1681
+ JITDylib &JD, jitlink::LinkGraph &G,
1682
+ jitlink::Section &HeaderSection) {
1675
1683
auto HdrInfo =
1676
1684
getMachOHeaderInfoFromTriple (MOP.getExecutionSession ().getTargetTriple ());
1677
1685
MachOBuilder<MachOTraits> B (HdrInfo.PageSize );
@@ -1680,6 +1688,19 @@ jitlink::Block &createTrivialHeaderBlock(MachOPlatform &MOP,
1680
1688
B.Header .cputype = HdrInfo.CPUType ;
1681
1689
B.Header .cpusubtype = HdrInfo.CPUSubType ;
1682
1690
1691
+ if (Opts.IDDylib )
1692
+ B.template addLoadCommand <MachO::LC_ID_DYLIB>(
1693
+ Opts.IDDylib ->Name , Opts.IDDylib ->Timestamp ,
1694
+ Opts.IDDylib ->CurrentVersion , Opts.IDDylib ->CompatibilityVersion );
1695
+ else
1696
+ B.template addLoadCommand <MachO::LC_ID_DYLIB>(JD.getName (), 0 , 0 , 0 );
1697
+
1698
+ for (auto &D : Opts.LoadDylibs )
1699
+ B.template addLoadCommand <MachO::LC_LOAD_DYLIB>(
1700
+ D.Name , D.Timestamp , D.CurrentVersion , D.CompatibilityVersion );
1701
+ for (auto &P : Opts.RPaths )
1702
+ B.template addLoadCommand <MachO::LC_RPATH>(P);
1703
+
1683
1704
auto HeaderContent = G.allocateBuffer (B.layout ());
1684
1705
B.write (HeaderContent);
1685
1706
@@ -1688,10 +1709,11 @@ jitlink::Block &createTrivialHeaderBlock(MachOPlatform &MOP,
1688
1709
}
1689
1710
1690
1711
SimpleMachOHeaderMU::SimpleMachOHeaderMU (MachOPlatform &MOP,
1691
- SymbolStringPtr HeaderStartSymbol)
1712
+ SymbolStringPtr HeaderStartSymbol,
1713
+ MachOPlatform::HeaderOptions Opts)
1692
1714
: MaterializationUnit(
1693
1715
createHeaderInterface (MOP, std::move(HeaderStartSymbol))),
1694
- MOP(MOP) {}
1716
+ MOP(MOP), Opts(std::move(Opts)) {}
1695
1717
1696
1718
void SimpleMachOHeaderMU::materialize (
1697
1719
std::unique_ptr<MaterializationResponsibility> R) {
@@ -1725,7 +1747,7 @@ SimpleMachOHeaderMU::createHeaderBlock(JITDylib &JD, jitlink::LinkGraph &G,
1725
1747
switch (MOP.getExecutionSession ().getTargetTriple ().getArch ()) {
1726
1748
case Triple::aarch64:
1727
1749
case Triple::x86_64:
1728
- return createTrivialHeaderBlock <MachO64LE>(MOP, G, HeaderSection);
1750
+ return ::createHeaderBlock <MachO64LE>(MOP, Opts, JD , G, HeaderSection);
1729
1751
default :
1730
1752
llvm_unreachable (" Unsupported architecture" );
1731
1753
}
0 commit comments