1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00

[ORC] Simplify naming for JITDylib definition generators.

Renames:
  JITDylib's setFallbackDefinitionGenerator method to setGenerator.
  DynamicLibraryFallbackGenerator class to DynamicLibrarySearchGenerator.
  ReexportsFallbackDefinitionGenerator to ReexportsGenerator.

llvm-svn: 344489
This commit is contained in:
Lang Hames 2018-10-15 05:07:54 +00:00
parent 185e5e3022
commit c76b89e505
6 changed files with 80 additions and 75 deletions

View File

@ -395,15 +395,22 @@ reexports(JITDylib &SourceJD, SymbolAliasMap Aliases) {
Expected<SymbolAliasMap>
buildSimpleReexportsAliasMap(JITDylib &SourceJD, const SymbolNameSet &Symbols);
class ReexportsFallbackDefinitionGenerator {
/// ReexportsGenerator can be used with JITDylib::setGenerator to automatically
/// re-export a subset of the source JITDylib's symbols in the target.
class ReexportsGenerator {
public:
using SymbolPredicate = std::function<bool(SymbolStringPtr)>;
ReexportsFallbackDefinitionGenerator(JITDylib &BackingJD,
SymbolPredicate Allow);
/// Create a reexports generator. If an Allow predicate is passed, only
/// symbols for which the predicate returns true will be reexported. If no
/// Allow predicate is passed, all symbols will be exported.
ReexportsGenerator(JITDylib &SourceJD,
SymbolPredicate Allow = SymbolPredicate());
SymbolNameSet operator()(JITDylib &JD, const SymbolNameSet &Names);
private:
JITDylib &BackingJD;
JITDylib &SourceJD;
SymbolPredicate Allow;
};
@ -478,7 +485,7 @@ class JITDylib {
friend class ExecutionSession;
friend class MaterializationResponsibility;
public:
using FallbackDefinitionGeneratorFunction = std::function<SymbolNameSet(
using GeneratorFunction = std::function<SymbolNameSet(
JITDylib &Parent, const SymbolNameSet &Names)>;
using AsynchronousSymbolQuerySet =
@ -495,12 +502,12 @@ public:
/// Get a reference to the ExecutionSession for this JITDylib.
ExecutionSession &getExecutionSession() const { return ES; }
/// Set a fallback defenition generator. If set, lookup and lookupFlags will
/// pass the unresolved symbols set to the fallback definition generator,
/// allowing it to add a new definition to the JITDylib.
void setFallbackDefinitionGenerator(
FallbackDefinitionGeneratorFunction FallbackDefinitionGenerator) {
this->FallbackDefinitionGenerator = std::move(FallbackDefinitionGenerator);
/// Set a definition generator. If set, whenever a symbol fails to resolve
/// within this JITDylib, lookup and lookupFlags will pass the unresolved
/// symbols set to the definition generator. The generator can optionally
/// add a definition for the unresolved symbols to the dylib.
void setGenerator(GeneratorFunction DefGenerator) {
this->DefGenerator = std::move(DefGenerator);
}
/// Set the search order to be used when fixing up definitions in JITDylib.
@ -667,7 +674,7 @@ private:
SymbolMap Symbols;
UnmaterializedInfosMap UnmaterializedInfos;
MaterializingInfosMap MaterializingInfos;
FallbackDefinitionGeneratorFunction FallbackDefinitionGenerator;
GeneratorFunction DefGenerator;
JITDylibList SearchOrder;
};

View File

@ -212,32 +212,30 @@ public:
/// If an instance of this class is attached to a JITDylib as a fallback
/// definition generator, then any symbol found in the given DynamicLibrary that
/// passes the 'Allow' predicate will be added to the JITDylib.
class DynamicLibraryFallbackGenerator {
class DynamicLibrarySearchGenerator {
public:
using SymbolPredicate = std::function<bool(SymbolStringPtr)>;
static bool AllowAll(SymbolStringPtr Name) { return true; }
/// Create a DynamicLibraryFallbackGenerator that searches for symbols in the
/// Create a DynamicLibrarySearchGenerator that searches for symbols in the
/// given sys::DynamicLibrary.
/// Only symbols that match the 'Allow' predicate will be searched for.
DynamicLibraryFallbackGenerator(sys::DynamicLibrary Dylib,
const DataLayout &DL,
SymbolPredicate Allow = AllowAll);
/// If the Allow predicate is given then only symbols matching the predicate
/// will be searched for in the DynamicLibrary. If the predicate is not given
/// then all symbols will be searched for.
DynamicLibrarySearchGenerator(sys::DynamicLibrary Dylib, const DataLayout &DL,
SymbolPredicate Allow = SymbolPredicate());
/// Permanently loads the library at the given path and, on success, returns
/// a DynamicLibraryFallbackGenerator that will search it for symbol
/// definitions matching the Allow predicate.
/// On failure returns the reason the library failed to load.
static Expected<DynamicLibraryFallbackGenerator>
/// a DynamicLibrarySearchGenerator that will search it for symbol definitions
/// in the library. On failure returns the reason the library failed to load.
static Expected<DynamicLibrarySearchGenerator>
Load(const char *FileName, const DataLayout &DL,
SymbolPredicate Allow = AllowAll);
SymbolPredicate Allow = SymbolPredicate());
/// Creates a DynamicLibraryFallbackGenerator that searches for symbols in
/// Creates a DynamicLibrarySearchGenerator that searches for symbols in
/// the current process.
static Expected<DynamicLibraryFallbackGenerator>
CreateForCurrentProcess(const DataLayout &DL,
SymbolPredicate Allow = AllowAll) {
static Expected<DynamicLibrarySearchGenerator>
GetForCurrentProcess(const DataLayout &DL,
SymbolPredicate Allow = SymbolPredicate()) {
return Load(nullptr, DL, std::move(Allow));
}

View File

@ -686,26 +686,26 @@ buildSimpleReexportsAliasMap(JITDylib &SourceJD, const SymbolNameSet &Symbols) {
return Result;
}
ReexportsFallbackDefinitionGenerator::ReexportsFallbackDefinitionGenerator(
JITDylib &BackingJD, SymbolPredicate Allow)
: BackingJD(BackingJD), Allow(std::move(Allow)) {}
ReexportsGenerator::ReexportsGenerator(JITDylib &SourceJD,
SymbolPredicate Allow)
: SourceJD(SourceJD), Allow(std::move(Allow)) {}
SymbolNameSet ReexportsFallbackDefinitionGenerator::
operator()(JITDylib &JD, const SymbolNameSet &Names) {
SymbolNameSet ReexportsGenerator::operator()(JITDylib &JD,
const SymbolNameSet &Names) {
orc::SymbolNameSet Added;
orc::SymbolAliasMap AliasMap;
auto Flags = BackingJD.lookupFlags(Names);
auto Flags = SourceJD.lookupFlags(Names);
for (auto &KV : Flags) {
if (!Allow(KV.first))
if (Allow && !Allow(KV.first))
continue;
AliasMap[KV.first] = SymbolAliasMapEntry(KV.first, KV.second);
Added.insert(KV.first);
}
if (!Added.empty())
cantFail(JD.define(reexports(BackingJD, AliasMap)));
cantFail(JD.define(reexports(SourceJD, AliasMap)));
return Added;
}
@ -1117,10 +1117,10 @@ SymbolFlagsMap JITDylib::lookupFlags(const SymbolNameSet &Names) {
return ES.runSessionLocked([&, this]() {
SymbolFlagsMap Result;
auto Unresolved = lookupFlagsImpl(Result, Names);
if (FallbackDefinitionGenerator && !Unresolved.empty()) {
auto FallbackDefs = FallbackDefinitionGenerator(*this, Unresolved);
if (!FallbackDefs.empty()) {
auto Unresolved2 = lookupFlagsImpl(Result, FallbackDefs);
if (DefGenerator && !Unresolved.empty()) {
auto NewDefs = DefGenerator(*this, Unresolved);
if (!NewDefs.empty()) {
auto Unresolved2 = lookupFlagsImpl(Result, NewDefs);
(void)Unresolved2;
assert(Unresolved2.empty() &&
"All fallback defs should have been found by lookupFlagsImpl");
@ -1156,14 +1156,13 @@ void JITDylib::lodgeQuery(std::shared_ptr<AsynchronousSymbolQuery> &Q,
assert(Q && "Query can not be null");
lodgeQueryImpl(Q, Unresolved, MatchNonExportedInJD, MatchNonExported, MUs);
if (FallbackDefinitionGenerator && !Unresolved.empty()) {
auto FallbackDefs = FallbackDefinitionGenerator(*this, Unresolved);
if (!FallbackDefs.empty()) {
for (auto &D : FallbackDefs)
if (DefGenerator && !Unresolved.empty()) {
auto NewDefs = DefGenerator(*this, Unresolved);
if (!NewDefs.empty()) {
for (auto &D : NewDefs)
Unresolved.erase(D);
lodgeQueryImpl(Q, FallbackDefs, MatchNonExportedInJD, MatchNonExported,
MUs);
assert(FallbackDefs.empty() &&
lodgeQueryImpl(Q, NewDefs, MatchNonExportedInJD, MatchNonExported, MUs);
assert(NewDefs.empty() &&
"All fallback defs should have been found by lookupImpl");
}
}
@ -1250,15 +1249,15 @@ SymbolNameSet JITDylib::legacyLookup(std::shared_ptr<AsynchronousSymbolQuery> Q,
SymbolNameSet Unresolved = std::move(Names);
ES.runSessionLocked([&, this]() {
ActionFlags = lookupImpl(Q, MUs, Unresolved);
if (FallbackDefinitionGenerator && !Unresolved.empty()) {
if (DefGenerator && !Unresolved.empty()) {
assert(ActionFlags == None &&
"ActionFlags set but unresolved symbols remain?");
auto FallbackDefs = FallbackDefinitionGenerator(*this, Unresolved);
if (!FallbackDefs.empty()) {
for (auto &D : FallbackDefs)
auto NewDefs = DefGenerator(*this, Unresolved);
if (!NewDefs.empty()) {
for (auto &D : NewDefs)
Unresolved.erase(D);
ActionFlags = lookupImpl(Q, MUs, FallbackDefs);
assert(FallbackDefs.empty() &&
ActionFlags = lookupImpl(Q, MUs, NewDefs);
assert(NewDefs.empty() &&
"All fallback defs should have been found by lookupImpl");
}
}

View File

@ -178,21 +178,22 @@ Error LocalCXXRuntimeOverrides2::enable(JITDylib &JD,
return JD.define(absoluteSymbols(std::move(RuntimeInterposes)));
}
DynamicLibraryFallbackGenerator::DynamicLibraryFallbackGenerator(
DynamicLibrarySearchGenerator::DynamicLibrarySearchGenerator(
sys::DynamicLibrary Dylib, const DataLayout &DL, SymbolPredicate Allow)
: Dylib(std::move(Dylib)), Allow(std::move(Allow)),
GlobalPrefix(DL.getGlobalPrefix()) {}
Expected<DynamicLibraryFallbackGenerator> DynamicLibraryFallbackGenerator::Load(
const char *FileName, const DataLayout &DL, SymbolPredicate Allow) {
Expected<DynamicLibrarySearchGenerator>
DynamicLibrarySearchGenerator::Load(const char *FileName, const DataLayout &DL,
SymbolPredicate Allow) {
std::string ErrMsg;
auto Lib = sys::DynamicLibrary::getPermanentLibrary(FileName, &ErrMsg);
if (!Lib.isValid())
return make_error<StringError>(std::move(ErrMsg), inconvertibleErrorCode());
return DynamicLibraryFallbackGenerator(std::move(Lib), DL, std::move(Allow));
return DynamicLibrarySearchGenerator(std::move(Lib), DL, std::move(Allow));
}
SymbolNameSet DynamicLibraryFallbackGenerator::
SymbolNameSet DynamicLibrarySearchGenerator::
operator()(JITDylib &JD, const SymbolNameSet &Names) {
orc::SymbolNameSet Added;
orc::SymbolMap NewSymbols;
@ -200,7 +201,10 @@ operator()(JITDylib &JD, const SymbolNameSet &Names) {
bool HasGlobalPrefix = (GlobalPrefix != '\0');
for (auto &Name : Names) {
if (!Allow(Name) || (*Name).empty())
if ((*Name).empty())
continue;
if (Allow && !Allow(Name))
continue;
if (HasGlobalPrefix && (*Name).front() != GlobalPrefix)
@ -215,8 +219,8 @@ operator()(JITDylib &JD, const SymbolNameSet &Names) {
}
}
// Add any new symbols to JD. Since the fallback generator is only called for
// symbols that are not already defined, this will never trigger a duplicate
// Add any new symbols to JD. Since the generator is only called for symbols
// that are not already defined, this will never trigger a duplicate
// definition error, so we can wrap this call in a 'cantFail'.
if (!NewSymbols.empty())
cantFail(JD.define(absoluteSymbols(std::move(NewSymbols))));

View File

@ -793,8 +793,8 @@ int runOrcLazyJIT(const char *ProgName) {
}
return Dump(std::move(TSM), R);
});
J->getMainJITDylib().setFallbackDefinitionGenerator(ExitOnErr(
orc::DynamicLibraryFallbackGenerator::CreateForCurrentProcess(DL)));
J->getMainJITDylib().setGenerator(
ExitOnErr(orc::DynamicLibrarySearchGenerator::GetForCurrentProcess(DL)));
orc::MangleAndInterner Mangle(J->getExecutionSession(), DL);
orc::LocalCXXRuntimeOverrides2 CXXRuntimeOverrides;

View File

@ -342,17 +342,15 @@ TEST_F(CoreAPIsStandardTest, TestThatReExportsDontUnnecessarilyMaterialize) {
EXPECT_FALSE(BarMaterialized) << "Bar should not have been materialized";
}
TEST_F(CoreAPIsStandardTest, TestReexportsFallbackGenerator) {
// Test that a re-exports fallback generator can dynamically generate
// reexports.
TEST_F(CoreAPIsStandardTest, TestReexportsGenerator) {
// Test that a re-exports generator can dynamically generate reexports.
auto &JD2 = ES.createJITDylib("JD2");
cantFail(JD2.define(absoluteSymbols({{Foo, FooSym}, {Bar, BarSym}})));
auto Filter = [this](SymbolStringPtr Name) { return Name != Bar; };
JD.setFallbackDefinitionGenerator(
ReexportsFallbackDefinitionGenerator(JD2, Filter));
JD.setGenerator(ReexportsGenerator(JD2, Filter));
auto Flags = JD.lookupFlags({Foo, Bar, Baz});
EXPECT_EQ(Flags.size(), 1U) << "Unexpected number of results";
@ -679,14 +677,13 @@ TEST_F(CoreAPIsStandardTest, DefineMaterializingSymbol) {
<< "Expected Bar == BarSym";
}
TEST_F(CoreAPIsStandardTest, FallbackDefinitionGeneratorTest) {
TEST_F(CoreAPIsStandardTest, GeneratorTest) {
cantFail(JD.define(absoluteSymbols({{Foo, FooSym}})));
JD.setFallbackDefinitionGenerator(
[&](JITDylib &JD2, const SymbolNameSet &Names) {
cantFail(JD2.define(absoluteSymbols({{Bar, BarSym}})));
return SymbolNameSet({Bar});
});
JD.setGenerator([&](JITDylib &JD2, const SymbolNameSet &Names) {
cantFail(JD2.define(absoluteSymbols({{Bar, BarSym}})));
return SymbolNameSet({Bar});
});
auto Result = cantFail(ES.lookup({&JD}, {Foo, Bar}));