summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-08-02 20:13:58 +0000
committerLang Hames <lhames@gmail.com>2018-08-02 20:13:58 +0000
commitbe1066de56118a93f11ea53ea1ac6eb95b8a90f7 (patch)
treefa652d46b44cb3b8d0496ea194012ccf6b6a2ad3
parent8899c29b1e0835f06972b03adab2e8fd91339c8d (diff)
downloadbcm5719-llvm-be1066de56118a93f11ea53ea1ac6eb95b8a90f7.tar.gz
bcm5719-llvm-be1066de56118a93f11ea53ea1ac6eb95b8a90f7.zip
[ORC] Add a re-exports fallback definition generator.
An instance of ReexportsFallbackDefinitionGenerator can be attached to a VSO (via setFallbackDefinitionGenerator) to re-export symbols on demandy from a backing VSO. llvm-svn: 338764
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/Core.h11
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp24
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp22
3 files changed, 57 insertions, 0 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index fd03687cfc2..8456dff7055 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -344,6 +344,17 @@ reexports(VSO &SourceV, SymbolAliasMap Aliases) {
Expected<SymbolAliasMap>
buildSimpleReexportsAliasMap(VSO &SourceV, const SymbolNameSet &Symbols);
+class ReexportsFallbackDefinitionGenerator {
+public:
+ using SymbolPredicate = std::function<bool(SymbolStringPtr)>;
+ ReexportsFallbackDefinitionGenerator(VSO &BackingVSO, SymbolPredicate Allow);
+ SymbolNameSet operator()(VSO &V, const SymbolNameSet &Names);
+
+private:
+ VSO &BackingVSO;
+ SymbolPredicate Allow;
+};
+
/// Base utilities for ExecutionSession.
class ExecutionSessionBase {
// FIXME: Remove this when we remove the old ORC layers.
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 4325d57f73d..3e5ba0399db 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -886,6 +886,30 @@ buildSimpleReexportsAliasMap(VSO &SourceV, const SymbolNameSet &Symbols) {
return Result;
}
+ReexportsFallbackDefinitionGenerator::ReexportsFallbackDefinitionGenerator(
+ VSO &BackingVSO, SymbolPredicate Allow)
+ : BackingVSO(BackingVSO), Allow(std::move(Allow)) {}
+
+SymbolNameSet ReexportsFallbackDefinitionGenerator::
+operator()(VSO &V, const SymbolNameSet &Names) {
+ orc::SymbolNameSet Added;
+ orc::SymbolAliasMap AliasMap;
+
+ auto Flags = BackingVSO.lookupFlags(Names);
+
+ for (auto &KV : Flags) {
+ if (!Allow(KV.first))
+ continue;
+ AliasMap[KV.first] = SymbolAliasMapEntry(KV.first, KV.second);
+ Added.insert(KV.first);
+ }
+
+ if (!Added.empty())
+ cantFail(V.define(reexports(BackingVSO, AliasMap)));
+
+ return Added;
+}
+
Error VSO::defineMaterializing(const SymbolFlagsMap &SymbolFlags) {
return ES.runSessionLocked([&]() -> Error {
std::vector<SymbolMap::iterator> AddedSyms;
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index baa1e3b5e8c..68c081dd520 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -273,6 +273,28 @@ 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.
+
+ auto &V2 = ES.createVSO("V2");
+ cantFail(V2.define(absoluteSymbols({{Foo, FooSym}, {Bar, BarSym}})));
+
+ auto Filter = [this](SymbolStringPtr Name) { return Name != Bar; };
+
+ V.setFallbackDefinitionGenerator(
+ ReexportsFallbackDefinitionGenerator(V2, Filter));
+
+ auto Flags = V.lookupFlags({Foo, Bar, Baz});
+ EXPECT_EQ(Flags.size(), 1U) << "Unexpected number of results";
+ EXPECT_EQ(Flags[Foo], FooSym.getFlags()) << "Unexpected flags for Foo";
+
+ auto Result = cantFail(lookup({&V}, Foo));
+
+ EXPECT_EQ(Result.getAddress(), FooSym.getAddress())
+ << "Incorrect reexported symbol address";
+}
+
TEST_F(CoreAPIsStandardTest, TestTrivialCircularDependency) {
Optional<MaterializationResponsibility> FooR;
auto FooMU = llvm::make_unique<SimpleMaterializationUnit>(
OpenPOWER on IntegriCloud