summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-07-11 04:39:11 +0000
committerLang Hames <lhames@gmail.com>2018-07-11 04:39:11 +0000
commitfdf1a855e01fc935e37c282308a5c4ecbcedb79b (patch)
tree27dc419f6e3966da38444d5dcf6e45a0c88e0bab
parent92617559bbb432e45efb462658020529c1ac9237 (diff)
downloadbcm5719-llvm-fdf1a855e01fc935e37c282308a5c4ecbcedb79b.tar.gz
bcm5719-llvm-fdf1a855e01fc935e37c282308a5c4ecbcedb79b.zip
[ORC] Add unit tests for the reexports utility that were left out of r336741,
and fix a bug that these exposed. llvm-svn: 336760
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp2
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp42
2 files changed, 43 insertions, 1 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 38f2213a85f..7272cd6014d 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -462,7 +462,7 @@ void ReExportsMaterializationUnit::materialize(
// FIXME: We're creating a SymbolFlagsMap and a std::map of
// std::sets just to add one dependency here. This needs a
// re-think.
- Resolved.insert(KV.first);
+ Resolved.insert(KV.second.Aliasee);
}
QueryInfo->R.resolve(ResolutionMap);
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index 0b36e3c49aa..09e6a23bea7 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -300,6 +300,48 @@ TEST_F(CoreAPIsStandardTest, TestChainedAliases) {
<< "\"Baz\"'s address should match \"Foo\"'s";
}
+TEST_F(CoreAPIsStandardTest, TestBasicReExports) {
+ // Test that the basic use case of re-exporting a single symbol from another
+ // VSO works.
+ cantFail(V.define(absoluteSymbols({{Foo, FooSym}})));
+
+ auto &V2 = ES.createVSO("V2");
+
+ cantFail(V2.define(reexports(V, {{Bar, {Foo, BarSym.getFlags()}}})));
+
+ auto Result = cantFail(lookup({&V2}, Bar));
+ EXPECT_EQ(Result.getAddress(), FooSym.getAddress())
+ << "Re-export Bar for symbol Foo should match FooSym's address";
+}
+
+TEST_F(CoreAPIsStandardTest, TestThatReExportsDontUnnecessarilyMaterialize) {
+ // Test that re-exports do not materialize symbols that have not been queried
+ // for.
+ cantFail(V.define(absoluteSymbols({{Foo, FooSym}})));
+
+ bool BarMaterialized = false;
+ auto BarMU = llvm::make_unique<SimpleMaterializationUnit>(
+ SymbolFlagsMap({{Bar, BarSym.getFlags()}}),
+ [&](MaterializationResponsibility R) {
+ BarMaterialized = true;
+ R.resolve({{Bar, BarSym}});
+ R.finalize();
+ });
+
+ cantFail(V.define(BarMU));
+
+ auto &V2 = ES.createVSO("V2");
+
+ cantFail(V2.define(reexports(
+ V, {{Baz, {Foo, BazSym.getFlags()}}, {Qux, {Bar, QuxSym.getFlags()}}})));
+
+ auto Result = cantFail(lookup({&V2}, Baz));
+ EXPECT_EQ(Result.getAddress(), FooSym.getAddress())
+ << "Re-export Baz for symbol Foo should match FooSym's address";
+
+ EXPECT_FALSE(BarMaterialized) << "Bar should not have been materialized";
+}
+
TEST_F(CoreAPIsStandardTest, TestTrivialCircularDependency) {
Optional<MaterializationResponsibility> FooR;
auto FooMU = llvm::make_unique<SimpleMaterializationUnit>(
OpenPOWER on IntegriCloud