summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/ExecutionEngine
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-09-27 02:09:36 +0000
committerLang Hames <lhames@gmail.com>2018-09-27 02:09:36 +0000
commit5ad09de9f366860e146513fc9f7b1a986f5b0fc0 (patch)
treed6b7b72e68ebfa4526480b8914ae842327f27df0 /llvm/unittests/ExecutionEngine
parent27ec210fbd69f01b60e6e47770398a562d49b93d (diff)
downloadbcm5719-llvm-5ad09de9f366860e146513fc9f7b1a986f5b0fc0.tar.gz
bcm5719-llvm-5ad09de9f366860e146513fc9f7b1a986f5b0fc0.zip
Revert "Re-revert r343129."
This reverts commit 4e2557dbc76704beb8c4cf1191cb786e719db5d3. llvm-svn: 343161
Diffstat (limited to 'llvm/unittests/ExecutionEngine')
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt1
-rw-r--r--llvm/unittests/ExecutionEngine/Orc/ThreadSafeModuleTest.cpp94
2 files changed, 95 insertions, 0 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt
index c18c9361cb0..3a47bfa20bf 100644
--- a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt
@@ -26,6 +26,7 @@ add_llvm_unittest(OrcJITTests
RTDyldObjectLinkingLayerTest.cpp
RTDyldObjectLinkingLayer2Test.cpp
SymbolStringPoolTest.cpp
+ ThreadSafeModuleTest.cpp
)
target_link_libraries(OrcJITTests PRIVATE ${ORC_JIT_TEST_LIBS})
diff --git a/llvm/unittests/ExecutionEngine/Orc/ThreadSafeModuleTest.cpp b/llvm/unittests/ExecutionEngine/Orc/ThreadSafeModuleTest.cpp
new file mode 100644
index 00000000000..363c0976718
--- /dev/null
+++ b/llvm/unittests/ExecutionEngine/Orc/ThreadSafeModuleTest.cpp
@@ -0,0 +1,94 @@
+//===--- ThreadSafeModuleTest.cpp - Test basic use of ThreadSafeModule ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
+#include "gtest/gtest.h"
+
+#include <atomic>
+#include <future>
+#include <thread>
+
+using namespace llvm;
+using namespace llvm::orc;
+
+namespace {
+
+TEST(ThreadSafeModuleTest, ContextWhollyOwnedByOneModule) {
+ // Test that ownership of a context can be transferred to a single
+ // ThreadSafeModule.
+ ThreadSafeContext TSCtx(llvm::make_unique<LLVMContext>());
+ ThreadSafeModule TSM(llvm::make_unique<Module>("M", *TSCtx.getContext()),
+ std::move(TSCtx));
+}
+
+TEST(ThreadSafeModuleTest, ContextOwnershipSharedByTwoModules) {
+ // Test that ownership of a context can be shared between more than one
+ // ThreadSafeModule.
+ ThreadSafeContext TSCtx(llvm::make_unique<LLVMContext>());
+
+ ThreadSafeModule TSM1(llvm::make_unique<Module>("M1", *TSCtx.getContext()),
+ TSCtx);
+ ThreadSafeModule TSM2(llvm::make_unique<Module>("M2", *TSCtx.getContext()),
+ std::move(TSCtx));
+}
+
+TEST(ThreadSafeModuleTest, ContextOwnershipSharedWithClient) {
+ // Test that ownership of a context can be shared with a client-held
+ // ThreadSafeContext so that it can be re-used for new modules.
+ ThreadSafeContext TSCtx(llvm::make_unique<LLVMContext>());
+
+ {
+ // Create and destroy a module.
+ ThreadSafeModule TSM1(llvm::make_unique<Module>("M1", *TSCtx.getContext()),
+ TSCtx);
+ }
+
+ // Verify that the context is still available for re-use.
+ ThreadSafeModule TSM2(llvm::make_unique<Module>("M2", *TSCtx.getContext()),
+ std::move(TSCtx));
+}
+
+TEST(ThreadSafeModuleTest, ThreadSafeModuleMoveAssignment) {
+ // Move assignment needs to move the module before the context (opposite
+ // to the field order) to ensure that overwriting with an empty
+ // ThreadSafeModule does not destroy the context early.
+ ThreadSafeContext TSCtx(llvm::make_unique<LLVMContext>());
+ ThreadSafeModule TSM(llvm::make_unique<Module>("M", *TSCtx.getContext()),
+ std::move(TSCtx));
+ TSM = ThreadSafeModule();
+}
+
+TEST(ThreadSafeModuleTest, BasicContextLockAPI) {
+ // Test that basic lock API calls work.
+ ThreadSafeContext TSCtx(llvm::make_unique<LLVMContext>());
+ ThreadSafeModule TSM(llvm::make_unique<Module>("M", *TSCtx.getContext()),
+ TSCtx);
+
+ { auto L = TSCtx.getLock(); }
+
+ { auto L = TSM.getContextLock(); }
+}
+
+TEST(ThreadSafeModuleTest, ContextLockPreservesContext) {
+ // Test that the existence of a context lock preserves the attached
+ // context.
+ // The trick to verify this is a bit of a hack: We attach a Module
+ // (without the ThreadSafeModule wrapper) to the context, then verify
+ // that this Module destructs safely (which it will not if its context
+ // has been destroyed) even though all references to the context have
+ // been thrown away (apart from the lock).
+
+ ThreadSafeContext TSCtx(llvm::make_unique<LLVMContext>());
+ auto L = TSCtx.getLock();
+ auto &Ctx = *TSCtx.getContext();
+ auto M = llvm::make_unique<Module>("M", Ctx);
+ TSCtx = ThreadSafeContext();
+}
+
+} // end anonymous namespace
OpenPOWER on IntegriCloud