diff options
author | Lang Hames <lhames@gmail.com> | 2018-07-11 04:39:11 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-07-11 04:39:11 +0000 |
commit | fdf1a855e01fc935e37c282308a5c4ecbcedb79b (patch) | |
tree | 27dc419f6e3966da38444d5dcf6e45a0c88e0bab | |
parent | 92617559bbb432e45efb462658020529c1ac9237 (diff) | |
download | bcm5719-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.cpp | 2 | ||||
-rw-r--r-- | llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp | 42 |
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>( |