<div dir="ltr">Looks like it was fixed in <a href="https://lab.llvm.org/buildbot/#/builders/5/builds/7086">https://lab.llvm.org/buildbot/#/builders/5/builds/7086</a> -- thanks!<div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 26, 2021 at 10:13 PM Vitaly Buka <<a href="mailto:vitalybuka@google.com">vitalybuka@google.com</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"><div dir="ltr"><div><a class="gmail_plusreply" id="gmail-m_294090635471647952plusReplyChip-2" href="mailto:eugenis@google.com" target="_blank">+Evgenii Stepanov</a> <br></div>It still fails tests <a href="https://lab.llvm.org/buildbot/#/builders/5/builds/7082" target="_blank">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>
</blockquote></div>