summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp')
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
index a79f31fab0d..5a74246b1c3 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
+++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
@@ -12,6 +12,7 @@
#include "gtest/gtest.h"
#include <set>
+#include <thread>
using namespace llvm;
using namespace llvm::orc;
@@ -325,4 +326,80 @@ TEST(CoreAPIsTest, TestLambdaSymbolResolver) {
EXPECT_TRUE(OnResolvedRun) << "OnResolved was never run";
}
+TEST(CoreAPIsTest, TestLookupWithUnthreadedMaterialization) {
+ constexpr JITTargetAddress FakeFooAddr = 0xdeadbeef;
+ JITEvaluatedSymbol FooSym(FakeFooAddr, JITSymbolFlags::Exported);
+
+ SymbolStringPool SSP;
+ auto Foo = SSP.intern("foo");
+
+ auto Source = std::make_shared<SimpleSource>(
+ [&](VSO &V, SymbolNameSet Symbols) -> Error {
+ V.resolve({{Foo, FooSym}});
+ V.finalize({Foo});
+ return Error::success();
+ },
+ [](VSO &V, SymbolStringPtr Name) -> Error {
+ llvm_unreachable("Not expecting finalization");
+ });
+
+ VSO V;
+
+ SymbolFlagsMap InitialSymbols({{Foo, JITSymbolFlags::Exported}});
+ cantFail(V.defineLazy(InitialSymbols, Source));
+
+ ExecutionSession ES(SSP);
+ auto FooLookupResult =
+ cantFail(lookup({&V}, Foo, MaterializeOnCurrentThread(ES)));
+
+ EXPECT_EQ(FooLookupResult.getAddress(), FooSym.getAddress())
+ << "lookup returned an incorrect address";
+ EXPECT_EQ(FooLookupResult.getFlags(), FooSym.getFlags())
+ << "lookup returned incorrect flags";
+}
+
+TEST(CoreAPIsTest, TestLookupWithThreadedMaterialization) {
+#if LLVM_ENABLE_THREADS
+ constexpr JITTargetAddress FakeFooAddr = 0xdeadbeef;
+ JITEvaluatedSymbol FooSym(FakeFooAddr, JITSymbolFlags::Exported);
+
+ SymbolStringPool SSP;
+ auto Foo = SSP.intern("foo");
+
+ auto Source = std::make_shared<SimpleSource>(
+ [&](VSO &V, SymbolNameSet Symbols) -> Error {
+ V.resolve({{Foo, FooSym}});
+ V.finalize({Foo});
+ return Error::success();
+ },
+ [](VSO &V, SymbolStringPtr Name) -> Error {
+ llvm_unreachable("Not expecting finalization");
+ });
+
+ VSO V;
+
+ SymbolFlagsMap InitialSymbols({{Foo, JITSymbolFlags::Exported}});
+ cantFail(V.defineLazy(InitialSymbols, Source));
+
+ ExecutionSession ES(SSP);
+
+ auto MaterializeOnNewThread =
+ [&ES](VSO &V, std::shared_ptr<SymbolSource> Source, SymbolNameSet Names) {
+ std::thread(
+ [&ES, &V, Source, Names]() {
+ if (auto Err = Source->materialize(V, std::move(Names)))
+ ES.reportError(std::move(Err));
+ }).detach();
+ };
+
+ auto FooLookupResult =
+ cantFail(lookup({&V}, Foo, MaterializeOnNewThread));
+
+ EXPECT_EQ(FooLookupResult.getAddress(), FooSym.getAddress())
+ << "lookup returned an incorrect address";
+ EXPECT_EQ(FooLookupResult.getFlags(), FooSym.getFlags())
+ << "lookup returned incorrect flags";
+#endif
+}
+
} // namespace
OpenPOWER on IntegriCloud