<div dir="ltr"><div><a class="gmail_plusreply" id="plusReplyChip-2" href="mailto:eugenis@google.com" tabindex="-1">+Evgenii Stepanov</a> <br></div>It still fails tests <a href="https://lab.llvm.org/buildbot/#/builders/5/builds/7082" target="_blank" class="cremed">https://lab.llvm.org/buildbot/#/builders/5/builds/7082</a></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 26 Apr 2021 at 20:56, Lang Hames via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Lang Hames<br>
Date: 2021-04-26T20:44:40-07:00<br>
New Revision: d122d80b3d1c3ffdfbf6a2168f3d61fa4337facc<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/d122d80b3d1c3ffdfbf6a2168f3d61fa4337facc" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d122d80b3d1c3ffdfbf6a2168f3d61fa4337facc</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/d122d80b3d1c3ffdfbf6a2168f3d61fa4337facc.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d122d80b3d1c3ffdfbf6a2168f3d61fa4337facc.diff</a><br>
<br>
LOG: Reapply "[ORC] Add unit tests for parts of the ..." with fixes and improvements.<br>
<br>
This reapplies 8740360093b, which was reverted in bbddadd46e4 due to buildbot<br>
errors.<br>
<br>
This version checks that a JIT instance can be safely constructed, skipping<br>
tests if it can not be. To enable this it introduces new C API to retrieve and<br>
set the target triple for a JITTargetMachineBuilder.<br>
<br>
Added: <br>
llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp<br>
<br>
Modified: <br>
llvm/include/llvm-c/LLJIT.h<br>
llvm/include/llvm-c/Orc.h<br>
llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp<br>
llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff --git a/llvm/include/llvm-c/LLJIT.h b/llvm/include/llvm-c/LLJIT.h<br>
index 976fda22bc48..b140a5d05881 100644<br>
--- a/llvm/include/llvm-c/LLJIT.h<br>
+++ b/llvm/include/llvm-c/LLJIT.h<br>
@@ -78,6 +78,9 @@ void LLVMOrcDisposeLLJITBuilder(LLVMOrcLLJITBuilderRef Builder);<br>
* instance. Calling this function is optional: if it is not called then the<br>
* LLJITBuilder will use JITTargeTMachineBuilder::detectHost to construct a<br>
* JITTargetMachineBuilder.<br>
+ *<br>
+ * This function takes ownership of the JTMB argument: clients should not<br>
+ * dispose of the JITTargetMachineBuilder after calling this function.<br>
*/<br>
void LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(<br>
LLVMOrcLLJITBuilderRef Builder, LLVMOrcJITTargetMachineBuilderRef JTMB);<br>
<br>
diff --git a/llvm/include/llvm-c/Orc.h b/llvm/include/llvm-c/Orc.h<br>
index ac20986233f1..78f6f28a4657 100644<br>
--- a/llvm/include/llvm-c/Orc.h<br>
+++ b/llvm/include/llvm-c/Orc.h<br>
@@ -623,8 +623,9 @@ void LLVMOrcDisposeThreadSafeModule(LLVMOrcThreadSafeModuleRef TSM);<br>
* Create a JITTargetMachineBuilder by detecting the host.<br>
*<br>
* On success the client owns the resulting JITTargetMachineBuilder. It must be<br>
- * passed to a consuming operation (e.g. LLVMOrcCreateLLJITBuilder) or disposed<br>
- * of by calling LLVMOrcDisposeJITTargetMachineBuilder.<br>
+ * passed to a consuming operation (e.g.<br>
+ * LLVMOrcLLJITBuilderSetJITTargetMachineBuilder) or disposed of by calling<br>
+ * LLVMOrcDisposeJITTargetMachineBuilder.<br>
*/<br>
LLVMErrorRef LLVMOrcJITTargetMachineBuilderDetectHost(<br>
LLVMOrcJITTargetMachineBuilderRef *Result);<br>
@@ -646,6 +647,29 @@ LLVMOrcJITTargetMachineBuilderCreateFromTargetMachine(LLVMTargetMachineRef TM);<br>
void LLVMOrcDisposeJITTargetMachineBuilder(<br>
LLVMOrcJITTargetMachineBuilderRef JTMB);<br>
<br>
+/**<br>
+ * Returns the target triple for the given JITTargetMachineBuilder as a string.<br>
+ *<br>
+ * The caller owns the resulting string as must dispose of it by calling<br>
+ * LLVMOrcJITTargetMachineBuilderDisposeTargetTriple.<br>
+ */<br>
+char *LLVMOrcJITTargetMachineBuilderGetTargetTriple(<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB);<br>
+<br>
+/**<br>
+ * Sets the target triple for the given JITTargetMachineBuilder to the given<br>
+ * string.<br>
+ */<br>
+void LLVMOrcJITTargetMachineBuilderSetTargetTriple(<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple);<br>
+<br>
+/**<br>
+ * Destroy a triple string returned by<br>
+ * LLVMOrcJITTargetMachineBuilderGetTargetTriple.<br>
+ */<br>
+void LLVMOrcJITTargetMachineBuilderDisposeTargetTriple(<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB, char *TargetTriple);<br>
+<br>
/**<br>
* Emit an object buffer to an ObjectLayer.<br>
*<br>
<br>
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp b/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp<br>
index 796daf58d9bb..419f6e81e6e3 100644<br>
--- a/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp<br>
+++ b/llvm/lib/ExecutionEngine/Orc/OrcV2CBindings.cpp<br>
@@ -473,6 +473,24 @@ void LLVMOrcDisposeJITTargetMachineBuilder(<br>
delete unwrap(JTMB);<br>
}<br>
<br>
+char *LLVMOrcJITTargetMachineBuilderGetTargetTriple(<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB) {<br>
+ auto Tmp = unwrap(JTMB)->getTargetTriple().str();<br>
+ char *TargetTriple = (char *)malloc(Tmp.size() + 1);<br>
+ strcpy(TargetTriple, Tmp.c_str());<br>
+ return TargetTriple;<br>
+}<br>
+<br>
+void LLVMOrcJITTargetMachineBuilderSetTargetTriple(<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB, const char *TargetTriple) {<br>
+ unwrap(JTMB)->getTargetTriple() = Triple(TargetTriple);<br>
+}<br>
+<br>
+void LLVMOrcJITTargetMachineBuilderDisposeTargetTriple(<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB, char *TargetTriple) {<br>
+ free(TargetTriple);<br>
+}<br>
+<br>
void LLVMOrcObjectLayerEmit(LLVMOrcObjectLayerRef ObjLayer,<br>
LLVMOrcMaterializationResponsibilityRef R,<br>
LLVMMemoryBufferRef ObjBuffer) {<br>
<br>
diff --git a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt<br>
index d205d53829aa..505692233ebe 100644<br>
--- a/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt<br>
+++ b/llvm/unittests/ExecutionEngine/Orc/CMakeLists.txt<br>
@@ -17,6 +17,7 @@ add_llvm_unittest(OrcJITTests<br>
IndirectionUtilsTest.cpp<br>
JITTargetMachineBuilderTest.cpp<br>
LazyCallThroughAndReexportsTest.cpp<br>
+ OrcCAPITest.cpp<br>
OrcTestCommon.cpp<br>
QueueChannel.cpp<br>
ResourceTrackerTest.cpp<br>
<br>
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp<br>
new file mode 100644<br>
index 000000000000..eaad4a206836<br>
--- /dev/null<br>
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp<br>
@@ -0,0 +1,307 @@<br>
+//===--- OrcCAPITest.cpp - Unit tests for the OrcJIT v2 C API ---*- C++ -*-===//<br>
+//<br>
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.<br>
+// See <a href="https://llvm.org/LICENSE.txt" rel="noreferrer" target="_blank">https://llvm.org/LICENSE.txt</a> for license information.<br>
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "llvm-c/Core.h"<br>
+#include "llvm-c/LLJIT.h"<br>
+#include "llvm-c/Orc.h"<br>
+#include "gtest/gtest.h"<br>
+<br>
+#include "llvm/Support/Debug.h"<br>
+#include "llvm/Support/raw_ostream.h"<br>
+<br>
+using namespace llvm;<br>
+<br>
+// OrcCAPITestBase contains several helper methods and pointers for unit tests<br>
+// written for the LLVM-C API. It provides the following helpers:<br>
+//<br>
+// 1. Jit: an LLVMOrcLLJIT instance which is freed upon test exit<br>
+// 2. ExecutionSession: the LLVMOrcExecutionSession for the JIT<br>
+// 3. MainDylib: the main JITDylib for the LLJIT instance<br>
+// 4. materializationUnitFn: function pointer to an empty function, used for<br>
+// materialization unit testing<br>
+// 5. definitionGeneratorFn: function pointer for a basic<br>
+// LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction<br>
+// 6. createTestModule: helper method for creating a basic thread-safe-module<br>
+class OrcCAPITestBase : public testing::Test {<br>
+protected:<br>
+ LLVMOrcLLJITRef Jit = nullptr;<br>
+ LLVMOrcExecutionSessionRef ExecutionSession = nullptr;<br>
+ LLVMOrcJITDylibRef MainDylib = nullptr;<br>
+<br>
+public:<br>
+ static void SetUpTestCase() {<br>
+ LLVMInitializeNativeTarget();<br>
+<br>
+ // Attempt to set up a JIT instance once to verify that we can.<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB = nullptr;<br>
+ if (LLVMErrorRef E = LLVMOrcJITTargetMachineBuilderDetectHost(&JTMB)) {<br>
+ // If setup fails then disable these tests.<br>
+ LLVMConsumeError(E);<br>
+ TargetSupported = false;<br>
+ return;<br>
+ }<br>
+<br>
+ char *Triple = LLVMOrcJITTargetMachineBuilderGetTargetTriple(JTMB);<br>
+ if (!isSupported(Triple)) {<br>
+ // If this triple isn't supported then bail out.<br>
+ TargetSupported = false;<br>
+ LLVMOrcJITTargetMachineBuilderDisposeTargetTriple(JTMB, Triple);<br>
+ LLVMOrcDisposeJITTargetMachineBuilder(JTMB);<br>
+ return;<br>
+ }<br>
+<br>
+ LLVMOrcJITTargetMachineBuilderDisposeTargetTriple(JTMB, Triple);<br>
+ LLVMOrcLLJITBuilderRef Builder = LLVMOrcCreateLLJITBuilder();<br>
+ LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(Builder, JTMB);<br>
+ LLVMOrcLLJITRef J;<br>
+ if (LLVMErrorRef E = LLVMOrcCreateLLJIT(&J, Builder)) {<br>
+ // If setup fails then disable these tests.<br>
+ TargetSupported = false;<br>
+ LLVMConsumeError(E);<br>
+ return;<br>
+ }<br>
+<br>
+ LLVMOrcDisposeLLJIT(J);<br>
+ TargetSupported = true;<br>
+ }<br>
+<br>
+ void SetUp() override {<br>
+ if (!TargetSupported)<br>
+ return;<br>
+<br>
+ LLVMOrcJITTargetMachineBuilderRef JTMB = nullptr;<br>
+ LLVMErrorRef E1 = LLVMOrcJITTargetMachineBuilderDetectHost(&JTMB);<br>
+ assert(E1 == LLVMErrorSuccess && "Expected call to detect host to succeed");<br>
+<br>
+ LLVMOrcLLJITBuilderRef Builder = LLVMOrcCreateLLJITBuilder();<br>
+ LLVMOrcLLJITBuilderSetJITTargetMachineBuilder(Builder, JTMB);<br>
+ LLVMErrorRef E2 = LLVMOrcCreateLLJIT(&Jit, Builder);<br>
+ assert(E2 == LLVMErrorSuccess &&<br>
+ "Expected call to create LLJIT to succeed");<br>
+ ExecutionSession = LLVMOrcLLJITGetExecutionSession(Jit);<br>
+ MainDylib = LLVMOrcLLJITGetMainJITDylib(Jit);<br>
+ }<br>
+ void TearDown() override {<br>
+ LLVMOrcDisposeLLJIT(Jit);<br>
+ Jit = nullptr;<br>
+ }<br>
+<br>
+protected:<br>
+ static bool isSupported(StringRef Triple) {<br>
+ if (Triple.startswith("armv7"))<br>
+ return false;<br>
+ return true;<br>
+ }<br>
+<br>
+ static void materializationUnitFn() {}<br>
+ // Stub definition generator, where all Names are materialized from the<br>
+ // materializationUnitFn() test function and defined into the JIT Dylib<br>
+ static LLVMErrorRef<br>
+ definitionGeneratorFn(LLVMOrcDefinitionGeneratorRef G, void *Ctx,<br>
+ LLVMOrcLookupStateRef *LS, LLVMOrcLookupKind K,<br>
+ LLVMOrcJITDylibRef JD, LLVMOrcJITDylibLookupFlags F,<br>
+ LLVMOrcCLookupSet Names, size_t NamesCount) {<br>
+ for (size_t I = 0; I < NamesCount; I++) {<br>
+ LLVMOrcCLookupSetElement Element = Names[I];<br>
+ LLVMOrcJITTargetAddress Addr =<br>
+ (LLVMOrcJITTargetAddress)(&materializationUnitFn);<br>
+ LLVMJITSymbolFlags Flags = {LLVMJITSymbolGenericFlagsWeak, 0};<br>
+ LLVMJITEvaluatedSymbol Sym = {Addr, Flags};<br>
+ LLVMOrcRetainSymbolStringPoolEntry(Element.Name);<br>
+ LLVMJITCSymbolMapPair Pair = {Element.Name, Sym};<br>
+ LLVMJITCSymbolMapPair Pairs[] = {Pair};<br>
+ LLVMOrcMaterializationUnitRef MU = LLVMOrcAbsoluteSymbols(Pairs, 1);<br>
+ LLVMErrorRef Err = LLVMOrcJITDylibDefine(JD, MU);<br>
+ if (Err)<br>
+ return Err;<br>
+ }<br>
+ return LLVMErrorSuccess;<br>
+ }<br>
+ // create a test LLVM IR module containing a function named "sum" which has<br>
+ // returns the sum of its two parameters<br>
+ static LLVMOrcThreadSafeModuleRef createTestModule() {<br>
+ LLVMOrcThreadSafeContextRef TSC = LLVMOrcCreateNewThreadSafeContext();<br>
+ LLVMContextRef Ctx = LLVMOrcThreadSafeContextGetContext(TSC);<br>
+ LLVMModuleRef Mod = LLVMModuleCreateWithNameInContext("test", Ctx);<br>
+ {<br>
+ LLVMTypeRef Int32Ty = LLVMInt32TypeInContext(Ctx);<br>
+ LLVMTypeRef ParamTys[] = {Int32Ty, Int32Ty};<br>
+ LLVMTypeRef TestFnTy = LLVMFunctionType(Int32Ty, ParamTys, 2, 0);<br>
+ LLVMValueRef TestFn = LLVMAddFunction(Mod, "sum", TestFnTy);<br>
+ LLVMBuilderRef IRBuilder = LLVMCreateBuilderInContext(Ctx);<br>
+ LLVMBasicBlockRef EntryBB = LLVMAppendBasicBlock(TestFn, "entry");<br>
+ LLVMPositionBuilderAtEnd(IRBuilder, EntryBB);<br>
+ LLVMValueRef Arg1 = LLVMGetParam(TestFn, 0);<br>
+ LLVMValueRef Arg2 = LLVMGetParam(TestFn, 1);<br>
+ LLVMValueRef Sum = LLVMBuildAdd(IRBuilder, Arg1, Arg2, "");<br>
+ LLVMBuildRet(IRBuilder, Sum);<br>
+ LLVMDisposeBuilder(IRBuilder);<br>
+ }<br>
+ LLVMOrcThreadSafeModuleRef TSM = LLVMOrcCreateNewThreadSafeModule(Mod, TSC);<br>
+ LLVMOrcDisposeThreadSafeContext(TSC);<br>
+ return TSM;<br>
+ }<br>
+<br>
+ static bool TargetSupported;<br>
+};<br>
+<br>
+bool OrcCAPITestBase::TargetSupported = false;<br>
+<br>
+TEST_F(OrcCAPITestBase, SymbolStringPoolUniquing) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+<br>
+ LLVMOrcSymbolStringPoolEntryRef E1 =<br>
+ LLVMOrcExecutionSessionIntern(ExecutionSession, "aaa");<br>
+ LLVMOrcSymbolStringPoolEntryRef E2 =<br>
+ LLVMOrcExecutionSessionIntern(ExecutionSession, "aaa");<br>
+ LLVMOrcSymbolStringPoolEntryRef E3 =<br>
+ LLVMOrcExecutionSessionIntern(ExecutionSession, "bbb");<br>
+ const char *SymbolName = LLVMOrcSymbolStringPoolEntryStr(E1);<br>
+ ASSERT_EQ(E1, E2) << "String pool entries are not unique";<br>
+ ASSERT_NE(E1, E3) << "Unique symbol pool entries are equal";<br>
+ ASSERT_STREQ("aaa", SymbolName) << "String value of symbol is not equal";<br>
+ LLVMOrcReleaseSymbolStringPoolEntry(E1);<br>
+ LLVMOrcReleaseSymbolStringPoolEntry(E2);<br>
+ LLVMOrcReleaseSymbolStringPoolEntry(E3);<br>
+}<br>
+<br>
+TEST_F(OrcCAPITestBase, JITDylibLookup) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+ LLVMOrcJITDylibRef DoesNotExist =<br>
+ LLVMOrcExecutionSessionGetJITDylibByName(ExecutionSession, "test");<br>
+ ASSERT_FALSE(!!DoesNotExist);<br>
+ LLVMOrcJITDylibRef L1 =<br>
+ LLVMOrcExecutionSessionCreateBareJITDylib(ExecutionSession, "test");<br>
+ LLVMOrcJITDylibRef L2 =<br>
+ LLVMOrcExecutionSessionGetJITDylibByName(ExecutionSession, "test");<br>
+ ASSERT_EQ(L1, L2) << "Located JIT Dylib is not equal to original";<br>
+}<br>
+<br>
+TEST_F(OrcCAPITestBase, MaterializationUnitCreation) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+<br>
+ LLVMOrcSymbolStringPoolEntryRef Name =<br>
+ LLVMOrcLLJITMangleAndIntern(Jit, "test");<br>
+ LLVMJITSymbolFlags Flags = {LLVMJITSymbolGenericFlagsWeak, 0};<br>
+ LLVMOrcJITTargetAddress Addr =<br>
+ (LLVMOrcJITTargetAddress)(&materializationUnitFn);<br>
+ LLVMJITEvaluatedSymbol Sym = {Addr, Flags};<br>
+ LLVMJITCSymbolMapPair Pair = {Name, Sym};<br>
+ LLVMJITCSymbolMapPair Pairs[] = {Pair};<br>
+ LLVMOrcMaterializationUnitRef MU = LLVMOrcAbsoluteSymbols(Pairs, 1);<br>
+ LLVMOrcJITDylibDefine(MainDylib, MU);<br>
+ LLVMOrcJITTargetAddress OutAddr;<br>
+ if (LLVMOrcLLJITLookup(Jit, &OutAddr, "test")) {<br>
+ FAIL() << "Failed to look up \"test\" symbol";<br>
+ }<br>
+ ASSERT_EQ(Addr, OutAddr);<br>
+}<br>
+<br>
+TEST_F(OrcCAPITestBase, DefinitionGenerators) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+<br>
+ LLVMOrcDefinitionGeneratorRef Gen =<br>
+ LLVMOrcCreateCustomCAPIDefinitionGenerator(&definitionGeneratorFn,<br>
+ nullptr);<br>
+ LLVMOrcJITDylibAddGenerator(MainDylib, Gen);<br>
+ LLVMOrcJITTargetAddress OutAddr;<br>
+ if (LLVMOrcLLJITLookup(Jit, &OutAddr, "test")) {<br>
+ FAIL() << "The DefinitionGenerator did not create symbol \"test\"";<br>
+ }<br>
+ LLVMOrcJITTargetAddress ExpectedAddr =<br>
+ (LLVMOrcJITTargetAddress)(&materializationUnitFn);<br>
+ ASSERT_EQ(ExpectedAddr, OutAddr);<br>
+}<br>
+<br>
+TEST_F(OrcCAPITestBase, ResourceTrackerDefinitionLifetime) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+<br>
+ // This test case ensures that all symbols loaded into a JITDylib with a<br>
+ // ResourceTracker attached are cleared from the JITDylib once the RT is<br>
+ // removed.<br>
+ LLVMOrcResourceTrackerRef RT =<br>
+ LLVMOrcJITDylibCreateResourceTracker(MainDylib);<br>
+ LLVMOrcThreadSafeModuleRef TSM = createTestModule();<br>
+ if (LLVMErrorRef E = LLVMOrcLLJITAddLLVMIRModuleWithRT(Jit, RT, TSM)) {<br>
+ FAIL() << "Failed to add LLVM IR module to LLJIT";<br>
+ }<br>
+ LLVMOrcJITTargetAddress TestFnAddr;<br>
+ if (LLVMOrcLLJITLookup(Jit, &TestFnAddr, "sum")) {<br>
+ FAIL() << "Symbol \"sum\" was not added into JIT";<br>
+ }<br>
+ ASSERT_TRUE(!!TestFnAddr);<br>
+ LLVMOrcResourceTrackerRemove(RT);<br>
+ LLVMOrcJITTargetAddress OutAddr;<br>
+ LLVMErrorRef Err = LLVMOrcLLJITLookup(Jit, &OutAddr, "sum");<br>
+ ASSERT_TRUE(Err);<br>
+ ASSERT_FALSE(OutAddr);<br>
+ LLVMOrcReleaseResourceTracker(RT);<br>
+ LLVMConsumeError(Err);<br>
+}<br>
+<br>
+TEST_F(OrcCAPITestBase, ResourceTrackerTransfer) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+<br>
+ LLVMOrcResourceTrackerRef DefaultRT =<br>
+ LLVMOrcJITDylibGetDefaultResourceTracker(MainDylib);<br>
+ LLVMOrcResourceTrackerRef RT2 =<br>
+ LLVMOrcJITDylibCreateResourceTracker(MainDylib);<br>
+ LLVMOrcThreadSafeModuleRef TSM = createTestModule();<br>
+ if (LLVMErrorRef E = LLVMOrcLLJITAddLLVMIRModuleWithRT(Jit, DefaultRT, TSM)) {<br>
+ FAIL() << "Failed to add LLVM IR module to LLJIT";<br>
+ }<br>
+ LLVMOrcJITTargetAddress Addr;<br>
+ if (LLVMOrcLLJITLookup(Jit, &Addr, "sum")) {<br>
+ FAIL() << "Symbol \"sum\" was not added into JIT";<br>
+ }<br>
+ LLVMOrcResourceTrackerTransferTo(DefaultRT, RT2);<br>
+ LLVMErrorRef Err = LLVMOrcLLJITLookup(Jit, &Addr, "sum");<br>
+ ASSERT_FALSE(Err);<br>
+ LLVMOrcReleaseResourceTracker(RT2);<br>
+}<br>
+<br>
+TEST_F(OrcCAPITestBase, ExecutionTest) {<br>
+ if (!Jit) {<br>
+ // TODO: Use GTEST_SKIP() when GTest is updated to version 1.10.0<br>
+ return;<br>
+ }<br>
+<br>
+ using SumFunctionType = int32_t (*)(int32_t, int32_t);<br>
+<br>
+ // This test performs OrcJIT compilation of a simple sum module<br>
+ LLVMInitializeNativeAsmPrinter();<br>
+ LLVMOrcThreadSafeModuleRef TSM = createTestModule();<br>
+ if (LLVMErrorRef E = LLVMOrcLLJITAddLLVMIRModule(Jit, MainDylib, TSM)) {<br>
+ FAIL() << "Failed to add LLVM IR module to LLJIT";<br>
+ }<br>
+ LLVMOrcJITTargetAddress TestFnAddr;<br>
+ if (LLVMOrcLLJITLookup(Jit, &TestFnAddr, "sum")) {<br>
+ FAIL() << "Symbol \"sum\" was not added into JIT";<br>
+ }<br>
+ auto *SumFn = (SumFunctionType)(TestFnAddr);<br>
+ int32_t Result = SumFn(1, 1);<br>
+ ASSERT_EQ(2, Result);<br>
+}<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>