summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ExecutionEngine
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-10-06 23:03:59 +0000
committerLang Hames <lhames@gmail.com>2018-10-06 23:03:59 +0000
commit535448e08d318038ce22d9f1234a37647e47af14 (patch)
treea91d1c687ba12a429c23e561d45c64a809ffa016 /llvm/unittests/ExecutionEngine
parentcb5702c3fd741b9311bab7d9cce7cea39fc7ae42 (diff)
downloadbcm5719-llvm-535448e08d318038ce22d9f1234a37647e47af14.tar.gz
bcm5719-llvm-535448e08d318038ce22d9f1234a37647e47af14.zip
[ORC] Add a 'remove' method to JITDylib to remove symbols.
Symbols can be removed provided that all are present in the JITDylib and none are currently in the materializing state. On success all requested symbols are removed. On failure an error is returned and no symbols are removed. llvm-svn: 343928
Diffstat (limited to 'llvm/unittests/ExecutionEngine')
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index d0e4effe75e..47f62a796b8 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -107,6 +107,92 @@ TEST_F(CoreAPIsStandardTest, EmptyLookup) {
EXPECT_TRUE(OnReadyRun) << "OnReady was not run for empty query";
}
+TEST_F(CoreAPIsStandardTest, RemoveSymbolsTest) {
+ // Test that:
+ // (1) Missing symbols generate a SymbolsNotFound error.
+ // (2) Materializing symbols generate a SymbolCouldNotBeRemoved error.
+ // (3) Removal of unmaterialized symbols triggers discard on the
+ // materialization unit.
+ // (4) Removal of symbols destroys empty materialization units.
+ // (5) Removal of materialized symbols works.
+
+ // Foo will be fully materialized.
+ cantFail(JD.define(absoluteSymbols({{Foo, FooSym}})));
+
+ // Bar will be unmaterialized.
+ bool BarDiscarded = false;
+ bool BarMaterializerDestructed = false;
+ cantFail(JD.define(llvm::make_unique<SimpleMaterializationUnit>(
+ SymbolFlagsMap({{Bar, BarSym.getFlags()}}),
+ [this](MaterializationResponsibility R) {
+ ADD_FAILURE() << "Unexpected materialization of \"Bar\"";
+ R.resolve({{Bar, BarSym}});
+ R.emit();
+ },
+ [&](const JITDylib &JD, const SymbolStringPtr &Name) {
+ EXPECT_EQ(Name, Bar) << "Expected \"Bar\" to be discarded";
+ if (Name == Bar)
+ BarDiscarded = true;
+ },
+ [&]() { BarMaterializerDestructed = true; })));
+
+ // Baz will be in the materializing state initially, then
+ // materialized for the final removal attempt.
+ Optional<MaterializationResponsibility> BazR;
+ cantFail(JD.define(llvm::make_unique<SimpleMaterializationUnit>(
+ SymbolFlagsMap({{Baz, BazSym.getFlags()}}),
+ [&](MaterializationResponsibility R) { BazR.emplace(std::move(R)); },
+ [](const JITDylib &JD, const SymbolStringPtr &Name) {
+ ADD_FAILURE() << "\"Baz\" discarded unexpectedly";
+ })));
+
+ bool OnResolvedRun = false;
+ bool OnReadyRun = false;
+ ES.lookup({&JD}, {Foo, Baz},
+ [&](Expected<SymbolMap> Result) {
+ EXPECT_TRUE(!!Result) << "OnResolved failed unexpectedly";
+ consumeError(Result.takeError());
+ OnResolvedRun = true;
+ },
+ [&](Error Err) {
+ EXPECT_FALSE(!!Err) << "OnReady failed unexpectedly";
+ consumeError(std::move(Err));
+ OnReadyRun = true;
+ },
+ NoDependenciesToRegister);
+
+ {
+ // Attempt 1: Search for a missing symbol, Qux.
+ auto Err = JD.remove({Foo, Bar, Baz, Qux});
+ EXPECT_TRUE(!!Err) << "Expected failure";
+ EXPECT_TRUE(Err.isA<SymbolsNotFound>())
+ << "Expected a SymbolsNotFound error";
+ }
+
+ {
+ // Attempt 2: Search for a symbol that is still materializing, Baz.
+ auto Err = JD.remove({Foo, Bar, Baz});
+ EXPECT_TRUE(!!Err) << "Expected failure";
+ EXPECT_TRUE(Err.isA<SymbolsCouldNotBeRemoved>())
+ << "Expected a SymbolsNotFound error";
+ }
+
+ BazR->resolve({{Baz, BazSym}});
+ BazR->emit();
+ {
+ // Attempt 3: Search now that all symbols are fully materialized
+ // (Foo, Baz), or not yet materialized (Bar).
+ auto Err = JD.remove({Foo, Bar, Baz});
+ EXPECT_FALSE(!!Err) << "Expected failure";
+ }
+
+ EXPECT_TRUE(BarDiscarded) << "\"Bar\" should have been discarded";
+ EXPECT_TRUE(BarMaterializerDestructed)
+ << "\"Bar\"'s materializer should have been destructed";
+ EXPECT_TRUE(OnResolvedRun) << "OnResolved should have been run";
+ EXPECT_TRUE(OnReadyRun) << "OnReady should have been run";
+}
+
TEST_F(CoreAPIsStandardTest, ChainedJITDylibLookup) {
cantFail(JD.define(absoluteSymbols({{Foo, FooSym}})));
OpenPOWER on IntegriCloud