diff options
author | Lang Hames <lhames@gmail.com> | 2017-09-17 03:25:03 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2017-09-17 03:25:03 +0000 |
commit | ec30063ff313c9dffbfdc65243a87a80833d0c5b (patch) | |
tree | c17831be8f6f3c6c5e9ff826e13a453a2d1103b7 /llvm/unittests/ExecutionEngine | |
parent | 4b93d23abb9f484b82ffc63e25082653335fb360 (diff) | |
download | bcm5719-llvm-ec30063ff313c9dffbfdc65243a87a80833d0c5b.tar.gz bcm5719-llvm-ec30063ff313c9dffbfdc65243a87a80833d0c5b.zip |
[ORC] Hook up the LLVMOrcAddObjectFile function in the Orc C Bindings.
This can be used to add a relocatable object to the JIT session.
llvm-svn: 313474
Diffstat (limited to 'llvm/unittests/ExecutionEngine')
-rw-r--r-- | llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp index 5a4d6b4a225..d9448d47667 100644 --- a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "OrcTestCommon.h" +#include "llvm/ExecutionEngine/Orc/CompileUtils.h" #include "llvm-c/Core.h" #include "llvm-c/OrcBindings.h" #include "llvm-c/Target.h" @@ -37,6 +38,15 @@ protected: return MB.takeModule(); } + std::shared_ptr<object::OwningBinary<object::ObjectFile>> + createTestObject() { + orc::SimpleCompiler IRCompiler(*TM); + auto M = createTestModule(TM->getTargetTriple()); + M->setDataLayout(TM->createDataLayout()); + return std::make_shared<object::OwningBinary<object::ObjectFile>>( + IRCompiler(*M)); + } + typedef int (*MainFnTy)(); static int myTestFuncImpl() { @@ -134,6 +144,36 @@ TEST_F(OrcCAPIExecutionTest, TestLazyIRCompilation) { LLVMOrcDisposeInstance(JIT); } +TEST_F(OrcCAPIExecutionTest, TestAddObjectFile) { + if (!TM) + return; + + std::unique_ptr<MemoryBuffer> ObjBuffer; + { + auto OwningObj = createTestObject(); + auto ObjAndBuffer = OwningObj->takeBinary(); + ObjBuffer = std::move(ObjAndBuffer.second); + } + + LLVMOrcJITStackRef JIT = + LLVMOrcCreateInstance(wrap(TM.get())); + LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc"); + + LLVMOrcModuleHandle H; + LLVMOrcAddObjectFile(JIT, &H, wrap(ObjBuffer.release()), myResolver, nullptr); + LLVMOrcTargetAddress MainAddr; + LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main"); + MainFnTy MainFn = (MainFnTy)MainAddr; + int Result = MainFn(); + EXPECT_EQ(Result, 42) + << "Lazily JIT'd code did not return expected result"; + + LLVMOrcRemoveModule(JIT, H); + + LLVMOrcDisposeMangledSymbol(testFuncName); + LLVMOrcDisposeInstance(JIT); +} + TEST_F(OrcCAPIExecutionTest, TestDirectCallbacksAPI) { if (!TM) return; |