@@ -692,11 +692,12 @@ getTestObjectFileInterface(Session &S, MemoryBufferRef O) {
692
692
}
693
693
694
694
static Error loadProcessSymbols (Session &S) {
695
+ S.ProcessSymsJD = &S.ES .createBareJITDylib (" Process" );
695
696
auto FilterMainEntryPoint =
696
697
[EPName = S.ES .intern (EntryPointName)](SymbolStringPtr Name) {
697
698
return Name != EPName;
698
699
};
699
- S.MainJD ->addGenerator (
700
+ S.ProcessSymsJD ->addGenerator (
700
701
ExitOnErr (orc::EPCDynamicLibrarySearchGenerator::GetForTargetProcess (
701
702
S.ES , std::move (FilterMainEntryPoint))));
702
703
@@ -707,8 +708,9 @@ static Error loadDylibs(Session &S) {
707
708
LLVM_DEBUG (dbgs () << " Loading dylibs...\n " );
708
709
for (const auto &Dylib : Dylibs) {
709
710
LLVM_DEBUG (dbgs () << " " << Dylib << " \n " );
710
- if (auto Err = S.loadAndLinkDynamicLibrary (*S.MainJD , Dylib))
711
- return Err;
711
+ auto DL = S.getOrLoadDynamicLibrary (Dylib);
712
+ if (!DL)
713
+ return DL.takeError ();
712
714
}
713
715
714
716
return Error::success ();
@@ -963,69 +965,79 @@ Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err)
963
965
964
966
ES.setErrorReporter (reportLLVMJITLinkError);
965
967
966
- if (auto MainJDOrErr = ES.createJITDylib (" main" ))
967
- MainJD = &*MainJDOrErr;
968
- else {
969
- Err = MainJDOrErr.takeError ();
970
- return ;
971
- }
972
-
973
968
if (!NoProcessSymbols)
974
969
ExitOnErr (loadProcessSymbols (*this ));
975
- else {
976
- // This symbol is used in testcases.
977
- auto &TestResultJD = ES.createBareJITDylib (" <TestResultJD>" );
978
- ExitOnErr (TestResultJD.define (absoluteSymbols (
979
- {{ES.intern (" llvm_jitlink_setTestResultOverride" ),
980
- {ExecutorAddr::fromPtr (llvm_jitlink_setTestResultOverride),
981
- JITSymbolFlags::Exported}}})));
982
- MainJD->addToLinkOrder (TestResultJD);
983
- }
984
970
985
971
ExitOnErr (loadDylibs (*this ));
986
972
987
973
auto &TT = ES.getTargetTriple ();
988
974
989
- if (DebuggerSupport && TT.isOSBinFormatMachO ())
990
- ObjLayer.addPlugin (ExitOnErr (
991
- GDBJITDebugInfoRegistrationPlugin::Create (this ->ES , *MainJD, TT)));
975
+ if (DebuggerSupport && TT.isOSBinFormatMachO ()) {
976
+ if (!ProcessSymsJD) {
977
+ Err = make_error<StringError>(" MachO debugging requires process symbols" ,
978
+ inconvertibleErrorCode ());
979
+ return ;
980
+ }
981
+ ObjLayer.addPlugin (ExitOnErr (GDBJITDebugInfoRegistrationPlugin::Create (
982
+ this ->ES , *ProcessSymsJD, TT)));
983
+ }
992
984
993
985
if (PerfSupport && TT.isOSBinFormatELF ()) {
986
+ if (!ProcessSymsJD) {
987
+ Err = make_error<StringError>(" MachO debugging requires process symbols" ,
988
+ inconvertibleErrorCode ());
989
+ return ;
990
+ }
994
991
ObjLayer.addPlugin (ExitOnErr (DebugInfoPreservationPlugin::Create ()));
995
992
ObjLayer.addPlugin (ExitOnErr (PerfSupportPlugin::Create (
996
- this ->ES .getExecutorProcessControl (), *MainJD , true , true )));
993
+ this ->ES .getExecutorProcessControl (), *ProcessSymsJD , true , true )));
997
994
}
998
995
999
996
// Set up the platform.
1000
- if (TT.isOSBinFormatMachO () && !OrcRuntime.empty ()) {
1001
- if (auto P =
1002
- MachOPlatform::Create (ES, ObjLayer, *MainJD, OrcRuntime.c_str ()))
1003
- ES.setPlatform (std::move (*P));
1004
- else {
1005
- Err = P.takeError ();
1006
- return ;
1007
- }
1008
- } else if (TT.isOSBinFormatELF () && !OrcRuntime.empty ()) {
1009
- if (auto P =
1010
- ELFNixPlatform::Create (ES, ObjLayer, *MainJD, OrcRuntime.c_str ()))
1011
- ES.setPlatform (std::move (*P));
1012
- else {
1013
- Err = P.takeError ();
1014
- return ;
1015
- }
1016
- } else if (TT.isOSBinFormatCOFF () && !OrcRuntime.empty ()) {
1017
- auto LoadDynLibrary = [&, this ](JITDylib &JD, StringRef DLLName) -> Error {
1018
- if (!DLLName.ends_with_insensitive (" .dll" ))
1019
- return make_error<StringError>(" DLLName not ending with .dll" ,
1020
- inconvertibleErrorCode ());
1021
- return loadAndLinkDynamicLibrary (JD, DLLName);
1022
- };
997
+ if (!OrcRuntime.empty ()) {
998
+ assert (ProcessSymsJD && " ProcessSymsJD should have been set" );
999
+ PlatformJD = &ES.createBareJITDylib (" Platform" );
1000
+ PlatformJD->addToLinkOrder (*ProcessSymsJD);
1001
+
1002
+ if (TT.isOSBinFormatMachO ()) {
1003
+ if (auto P = MachOPlatform::Create (ES, ObjLayer, *PlatformJD,
1004
+ OrcRuntime.c_str ()))
1005
+ ES.setPlatform (std::move (*P));
1006
+ else {
1007
+ Err = P.takeError ();
1008
+ return ;
1009
+ }
1010
+ } else if (TT.isOSBinFormatELF ()) {
1011
+ if (auto P = ELFNixPlatform::Create (ES, ObjLayer, *PlatformJD,
1012
+ OrcRuntime.c_str ()))
1013
+ ES.setPlatform (std::move (*P));
1014
+ else {
1015
+ Err = P.takeError ();
1016
+ return ;
1017
+ }
1018
+ } else if (TT.isOSBinFormatCOFF ()) {
1019
+ auto LoadDynLibrary = [&, this ](JITDylib &JD,
1020
+ StringRef DLLName) -> Error {
1021
+ if (!DLLName.ends_with_insensitive (" .dll" ))
1022
+ return make_error<StringError>(" DLLName not ending with .dll" ,
1023
+ inconvertibleErrorCode ());
1024
+ return loadAndLinkDynamicLibrary (JD, DLLName);
1025
+ };
1023
1026
1024
- if (auto P = COFFPlatform::Create (ES, ObjLayer, *MainJD, OrcRuntime.c_str (),
1025
- std::move (LoadDynLibrary)))
1026
- ES.setPlatform (std::move (*P));
1027
- else {
1028
- Err = P.takeError ();
1027
+ if (auto P = COFFPlatform::Create (ES, ObjLayer, *PlatformJD,
1028
+ OrcRuntime.c_str (),
1029
+ std::move (LoadDynLibrary)))
1030
+ ES.setPlatform (std::move (*P));
1031
+ else {
1032
+ Err = P.takeError ();
1033
+ return ;
1034
+ }
1035
+ } else {
1036
+ Err = make_error<StringError>(
1037
+ " -" + OrcRuntime.ArgStr + " specified, but format " +
1038
+ Triple::getObjectFormatTypeName (TT.getObjectFormat ()) +
1039
+ " not supported" ,
1040
+ inconvertibleErrorCode ());
1029
1041
return ;
1030
1042
}
1031
1043
} else if (TT.isOSBinFormatELF ()) {
@@ -1037,6 +1049,24 @@ Session::Session(std::unique_ptr<ExecutorProcessControl> EPC, Error &Err)
1037
1049
ES, ExitOnErr (createJITLoaderGDBRegistrar (this ->ES )), true , true ));
1038
1050
}
1039
1051
1052
+ if (auto MainJDOrErr = ES.createJITDylib (" main" ))
1053
+ MainJD = &*MainJDOrErr;
1054
+ else {
1055
+ Err = MainJDOrErr.takeError ();
1056
+ return ;
1057
+ }
1058
+
1059
+ if (NoProcessSymbols) {
1060
+ // This symbol is used in testcases, but we're not reflecting process
1061
+ // symbols so we'll need to make it available some other way.
1062
+ auto &TestResultJD = ES.createBareJITDylib (" <TestResultJD>" );
1063
+ ExitOnErr (TestResultJD.define (absoluteSymbols (
1064
+ {{ES.intern (" llvm_jitlink_setTestResultOverride" ),
1065
+ {ExecutorAddr::fromPtr (llvm_jitlink_setTestResultOverride),
1066
+ JITSymbolFlags::Exported}}})));
1067
+ MainJD->addToLinkOrder (TestResultJD);
1068
+ }
1069
+
1040
1070
ObjLayer.addPlugin (std::make_unique<JITLinkSessionPlugin>(*this ));
1041
1071
1042
1072
// Process any harness files.
@@ -1266,6 +1296,10 @@ static Error sanitizeArguments(const Triple &TT, const char *ArgV0) {
1266
1296
if (DebuggerSupport.getNumOccurrences () == 0 && NoExec)
1267
1297
DebuggerSupport = false ;
1268
1298
1299
+ if (!OrcRuntime.empty () && NoProcessSymbols)
1300
+ return make_error<StringError>(" -orc-runtime requires process symbols" ,
1301
+ inconvertibleErrorCode ());
1302
+
1269
1303
// If -slab-allocate is passed, check that we're not trying to use it in
1270
1304
// -oop-executor or -oop-executor-connect mode.
1271
1305
//
@@ -1365,6 +1399,13 @@ static Error createJITDylibs(Session &S,
1365
1399
}
1366
1400
}
1367
1401
1402
+ if (S.PlatformJD )
1403
+ S.JDSearchOrder .push_back (
1404
+ {S.PlatformJD , JITDylibLookupFlags::MatchExportedSymbolsOnly});
1405
+ if (S.ProcessSymsJD )
1406
+ S.JDSearchOrder .push_back (
1407
+ {S.ProcessSymsJD , JITDylibLookupFlags::MatchExportedSymbolsOnly});
1408
+
1368
1409
LLVM_DEBUG ({
1369
1410
dbgs () << " Dylib search order is [ " ;
1370
1411
for (auto &KV : S.JDSearchOrder )
@@ -1416,23 +1457,67 @@ static Error addAliases(Session &S,
1416
1457
const std::map<unsigned , JITDylib *> &IdxToJD) {
1417
1458
// Define absolute symbols.
1418
1459
LLVM_DEBUG (dbgs () << " Defining aliases...\n " );
1460
+
1461
+ DenseMap<std::pair<JITDylib *, JITDylib *>, SymbolAliasMap> Reexports;
1419
1462
for (auto AliasItr = Aliases.begin (), AliasEnd = Aliases.end ();
1420
1463
AliasItr != AliasEnd; ++AliasItr) {
1421
- unsigned AliasArgIdx = Aliases.getPosition (AliasItr - Aliases.begin ());
1422
- auto &JD = *std::prev (IdxToJD.lower_bound (AliasArgIdx))->second ;
1423
1464
1424
- StringRef AliasStmt = *AliasItr;
1425
- size_t EqIdx = AliasStmt.find_first_of (' =' );
1426
- if (EqIdx == StringRef::npos)
1427
- return make_error<StringError>(" Invalid alias definition \" " + AliasStmt +
1428
- " \" . Syntax: <name>=<addr>" ,
1429
- inconvertibleErrorCode ());
1430
- StringRef Alias = AliasStmt.substr (0 , EqIdx).trim ();
1431
- StringRef Aliasee = AliasStmt.substr (EqIdx + 1 ).trim ();
1465
+ auto BadExpr = [&]() {
1466
+ return make_error<StringError>(
1467
+ " Invalid alias definition \" " + *AliasItr +
1468
+ " \" . Syntax: [<dst-jd>:]<alias>=[<src-jd>:]<aliasee>" ,
1469
+ inconvertibleErrorCode ());
1470
+ };
1471
+
1472
+ auto GetJD = [&](StringRef JDName) -> Expected<JITDylib *> {
1473
+ if (JDName.empty ()) {
1474
+ unsigned AliasArgIdx = Aliases.getPosition (AliasItr - Aliases.begin ());
1475
+ return std::prev (IdxToJD.lower_bound (AliasArgIdx))->second ;
1476
+ }
1477
+
1478
+ auto *JD = S.ES .getJITDylibByName (JDName);
1479
+ if (!JD)
1480
+ return make_error<StringError>(StringRef (" In alias definition \" " ) +
1481
+ *AliasItr + " \" no dylib named " +
1482
+ JDName,
1483
+ inconvertibleErrorCode ());
1432
1484
1433
- SymbolAliasMap SAM;
1434
- SAM[S.ES .intern (Alias)] = {S.ES .intern (Aliasee), JITSymbolFlags::Exported};
1435
- if (auto Err = JD.define (symbolAliases (std::move (SAM))))
1485
+ return JD;
1486
+ };
1487
+
1488
+ {
1489
+ // First split on '=' to get alias and aliasee.
1490
+ StringRef AliasStmt = *AliasItr;
1491
+ auto [AliasExpr, AliaseeExpr] = AliasStmt.split (' =' );
1492
+ if (AliaseeExpr.empty ())
1493
+ return BadExpr ();
1494
+
1495
+ auto [AliasJDName, Alias] = AliasExpr.split (' :' );
1496
+ if (Alias.empty ())
1497
+ std::swap (AliasJDName, Alias);
1498
+
1499
+ auto AliasJD = GetJD (AliasJDName);
1500
+ if (!AliasJD)
1501
+ return AliasJD.takeError ();
1502
+
1503
+ auto [AliaseeJDName, Aliasee] = AliaseeExpr.split (' :' );
1504
+ if (Aliasee.empty ())
1505
+ std::swap (AliaseeJDName, Aliasee);
1506
+
1507
+ if (AliaseeJDName.empty () && !AliasJDName.empty ())
1508
+ AliaseeJDName = AliasJDName;
1509
+ auto AliaseeJD = GetJD (AliaseeJDName);
1510
+ if (!AliaseeJD)
1511
+ return AliaseeJD.takeError ();
1512
+
1513
+ Reexports[{*AliasJD, *AliaseeJD}][S.ES .intern (Alias)] = {
1514
+ S.ES .intern (Aliasee), JITSymbolFlags::Exported};
1515
+ }
1516
+ }
1517
+
1518
+ for (auto &[JDs, AliasMap] : Reexports) {
1519
+ auto [DstJD, SrcJD] = JDs;
1520
+ if (auto Err = DstJD->define (reexports (*SrcJD, std::move (AliasMap))))
1436
1521
return Err;
1437
1522
}
1438
1523
@@ -1766,6 +1851,14 @@ static Error addLibraries(Session &S,
1766
1851
inconvertibleErrorCode ());
1767
1852
}
1768
1853
1854
+ // Add platform and process symbols if available.
1855
+ for (auto &[Idx, JD] : IdxToJD) {
1856
+ if (S.PlatformJD )
1857
+ JD->addToLinkOrder (*S.PlatformJD );
1858
+ if (S.ProcessSymsJD )
1859
+ JD->addToLinkOrder (*S.ProcessSymsJD );
1860
+ }
1861
+
1769
1862
return Error::success ();
1770
1863
}
1771
1864
0 commit comments