summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ExecutionEngine
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-01-24 21:21:10 +0000
committerLang Hames <lhames@gmail.com>2018-01-24 21:21:10 +0000
commit7f20eacf779c11921f0406706fe6125b94097b57 (patch)
tree0eb49adecac33c9cb9eee545a4589d155ba56b32 /llvm/unittests/ExecutionEngine
parent14f3ef1f0ed0d6b835306afd5eead5177e2d9002 (diff)
downloadbcm5719-llvm-7f20eacf779c11921f0406706fe6125b94097b57.tar.gz
bcm5719-llvm-7f20eacf779c11921f0406706fe6125b94097b57.zip
[ORC] Add a LambdaSymbolResolver convenience class and docs for SymbolResolver.
This patch adds a LambdaSymbolResolver convenience utility that can create an orc::SymbolResolver from a pair of function objects that supply the behavior for the lookupFlags and lookup methods. This class plays the same role for orc::SymbolResolver as the legacy LambdaResolver class plays for LegacyJITSymbolResolver, and will replace the latter class once all ORC APIs are migrated to orc::SymbolResolver. This patch also adds some documentation for the orc::SymbolResolver class as this was left out of the original commit. llvm-svn: 323375
Diffstat (limited to 'llvm/unittests/ExecutionEngine')
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 2b63dbf7c1f..3454ee236c3 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -258,4 +258,70 @@ TEST(CoreAPIsTest, AddAndMaterializeLazySymbol) {
EXPECT_TRUE(OnReadyRun) << "OnReady was not run";
}
+TEST(CoreAPIsTest, TestLambdaSymbolResolver) {
+ JITEvaluatedSymbol FooSym(0xdeadbeef, JITSymbolFlags::Exported);
+ JITEvaluatedSymbol BarSym(0xcafef00d, JITSymbolFlags::Exported);
+
+ SymbolStringPool SP;
+ auto Foo = SP.intern("foo");
+ auto Bar = SP.intern("bar");
+ auto Baz = SP.intern("baz");
+
+ VSO V;
+ cantFail(V.define({{Foo, FooSym}, {Bar, BarSym}}));
+
+ auto Resolver = createSymbolResolver(
+ [&](const SymbolNameSet &Symbols) { return V.lookupFlags(Symbols); },
+ [&](AsynchronousSymbolQuery &Q, SymbolNameSet Symbols) {
+ auto LR = V.lookup(Q, Symbols);
+ assert(LR.MaterializationWork.empty() &&
+ "Test generated unexpected materialization "
+ "work?");
+ return std::move(LR.UnresolvedSymbols);
+ });
+
+ SymbolNameSet Symbols({Foo, Bar, Baz});
+
+ LookupFlagsResult LFR = Resolver->lookupFlags(Symbols);
+
+ EXPECT_EQ(LFR.SymbolFlags.size(), 2U)
+ << "lookupFlags returned the wrong number of results";
+ EXPECT_EQ(LFR.SymbolFlags.count(Foo), 1U)
+ << "Missing lookupFlags result for foo";
+ EXPECT_EQ(LFR.SymbolFlags.count(Bar), 1U)
+ << "Missing lookupFlags result for bar";
+ EXPECT_EQ(LFR.SymbolFlags[Foo], FooSym.getFlags())
+ << "Incorrect lookupFlags result for Foo";
+ EXPECT_EQ(LFR.SymbolFlags[Bar], BarSym.getFlags())
+ << "Incorrect lookupFlags result for Bar";
+ EXPECT_EQ(LFR.SymbolsNotFound.size(), 1U)
+ << "Expected one symbol not found in lookupFlags";
+ EXPECT_EQ(LFR.SymbolsNotFound.count(Baz), 1U)
+ << "Expected baz not to be found in lookupFlags";
+
+ bool OnResolvedRun = false;
+
+ auto OnResolved = [&](Expected<SymbolMap> Result) {
+ OnResolvedRun = true;
+ EXPECT_TRUE(!!Result) << "Unexpected error";
+ EXPECT_EQ(Result->size(), 2U) << "Unexpected number of resolved symbols";
+ EXPECT_EQ(Result->count(Foo), 1U) << "Missing lookup result for foo";
+ EXPECT_EQ(Result->count(Bar), 1U) << "Missing lookup result for bar";
+ EXPECT_EQ((*Result)[Foo].getAddress(), FooSym.getAddress())
+ << "Incorrect address for foo";
+ EXPECT_EQ((*Result)[Bar].getAddress(), BarSym.getAddress())
+ << "Incorrect address for bar";
+ };
+ auto OnReady = [&](Error Err) {
+ EXPECT_FALSE(!!Err) << "Finalization should never fail in this test";
+ };
+
+ AsynchronousSymbolQuery Q({Foo, Bar}, OnResolved, OnReady);
+ auto Unresolved = Resolver->lookup(Q, Symbols);
+
+ EXPECT_EQ(Unresolved.size(), 1U) << "Expected one unresolved symbol";
+ EXPECT_EQ(Unresolved.count(Baz), 1U) << "Expected baz to not be resolved";
+ EXPECT_TRUE(OnResolvedRun) << "OnResolved was never run";
+}
+
} // namespace
OpenPOWER on IntegriCloud