LegacyAPIInteropTest.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. //===----------- CoreAPIsTest.cpp - Unit tests for Core ORC APIs ----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "OrcTestCommon.h"
  10. #include "llvm/ExecutionEngine/Orc/Legacy.h"
  11. #include "gtest/gtest.h"
  12. using namespace llvm;
  13. using namespace llvm::orc;
  14. class LegacyAPIsStandardTest : public CoreAPIsBasedStandardTest {};
  15. namespace {
  16. TEST_F(LegacyAPIsStandardTest, TestLambdaSymbolResolver) {
  17. cantFail(V.define(absoluteSymbols({{Foo, FooSym}, {Bar, BarSym}})));
  18. auto Resolver = createSymbolResolver(
  19. [&](const SymbolNameSet &Symbols) { return V.lookupFlags(Symbols); },
  20. [&](std::shared_ptr<AsynchronousSymbolQuery> Q, SymbolNameSet Symbols) {
  21. return V.lookup(std::move(Q), Symbols);
  22. });
  23. SymbolNameSet Symbols({Foo, Bar, Baz});
  24. SymbolFlagsMap SymbolFlags = Resolver->lookupFlags(Symbols);
  25. EXPECT_EQ(SymbolFlags.size(), 2U)
  26. << "lookupFlags returned the wrong number of results";
  27. EXPECT_EQ(SymbolFlags.count(Foo), 1U) << "Missing lookupFlags result for foo";
  28. EXPECT_EQ(SymbolFlags.count(Bar), 1U) << "Missing lookupFlags result for bar";
  29. EXPECT_EQ(SymbolFlags[Foo], FooSym.getFlags())
  30. << "Incorrect lookupFlags result for Foo";
  31. EXPECT_EQ(SymbolFlags[Bar], BarSym.getFlags())
  32. << "Incorrect lookupFlags result for Bar";
  33. bool OnResolvedRun = false;
  34. auto OnResolved =
  35. [&](Expected<AsynchronousSymbolQuery::ResolutionResult> Result) {
  36. OnResolvedRun = true;
  37. EXPECT_TRUE(!!Result) << "Unexpected error";
  38. EXPECT_EQ(Result->Symbols.size(), 2U)
  39. << "Unexpected number of resolved symbols";
  40. EXPECT_EQ(Result->Symbols.count(Foo), 1U)
  41. << "Missing lookup result for foo";
  42. EXPECT_EQ(Result->Symbols.count(Bar), 1U)
  43. << "Missing lookup result for bar";
  44. EXPECT_EQ(Result->Symbols[Foo].getAddress(), FooSym.getAddress())
  45. << "Incorrect address for foo";
  46. EXPECT_EQ(Result->Symbols[Bar].getAddress(), BarSym.getAddress())
  47. << "Incorrect address for bar";
  48. };
  49. auto OnReady = [&](Error Err) {
  50. EXPECT_FALSE(!!Err) << "Finalization should never fail in this test";
  51. };
  52. auto Q = std::make_shared<AsynchronousSymbolQuery>(SymbolNameSet({Foo, Bar}),
  53. OnResolved, OnReady);
  54. auto Unresolved = Resolver->lookup(std::move(Q), Symbols);
  55. EXPECT_EQ(Unresolved.size(), 1U) << "Expected one unresolved symbol";
  56. EXPECT_EQ(Unresolved.count(Baz), 1U) << "Expected baz to not be resolved";
  57. EXPECT_TRUE(OnResolvedRun) << "OnResolved was never run";
  58. }
  59. TEST(LegacyAPIInteropTest, QueryAgainstVSO) {
  60. ExecutionSession ES(std::make_shared<SymbolStringPool>());
  61. auto Foo = ES.getSymbolStringPool().intern("foo");
  62. auto &V = ES.createVSO("V");
  63. JITEvaluatedSymbol FooSym(0xdeadbeef, JITSymbolFlags::Exported);
  64. cantFail(V.define(absoluteSymbols({{Foo, FooSym}})));
  65. auto LookupFlags = [&](const SymbolNameSet &Names) {
  66. return V.lookupFlags(Names);
  67. };
  68. auto Lookup = [&](std::shared_ptr<AsynchronousSymbolQuery> Query,
  69. SymbolNameSet Symbols) {
  70. return V.lookup(std::move(Query), Symbols);
  71. };
  72. auto UnderlyingResolver =
  73. createSymbolResolver(std::move(LookupFlags), std::move(Lookup));
  74. JITSymbolResolverAdapter Resolver(ES, *UnderlyingResolver, nullptr);
  75. JITSymbolResolver::LookupSet Names{StringRef("foo")};
  76. auto LFR = Resolver.lookupFlags(Names);
  77. EXPECT_TRUE(!!LFR) << "lookupFlags failed";
  78. EXPECT_EQ(LFR->size(), 1U)
  79. << "lookupFlags returned the wrong number of results";
  80. EXPECT_EQ(LFR->count(*Foo), 1U)
  81. << "lookupFlags did not contain a result for 'foo'";
  82. EXPECT_EQ((*LFR)[*Foo], FooSym.getFlags())
  83. << "lookupFlags contained the wrong result for 'foo'";
  84. auto LR = Resolver.lookup(Names);
  85. EXPECT_TRUE(!!LR) << "lookup failed";
  86. EXPECT_EQ(LR->size(), 1U) << "lookup returned the wrong number of results";
  87. EXPECT_EQ(LR->count(*Foo), 1U) << "lookup did not contain a result for 'foo'";
  88. EXPECT_EQ((*LR)[*Foo].getFlags(), FooSym.getFlags())
  89. << "lookup returned the wrong result for flags of 'foo'";
  90. EXPECT_EQ((*LR)[*Foo].getAddress(), FooSym.getAddress())
  91. << "lookup returned the wrong result for address of 'foo'";
  92. }
  93. TEST(LegacyAPIInteropTset, LegacyLookupHelpersFn) {
  94. constexpr JITTargetAddress FooAddr = 0xdeadbeef;
  95. JITSymbolFlags FooFlags = JITSymbolFlags::Exported;
  96. bool BarMaterialized = false;
  97. constexpr JITTargetAddress BarAddr = 0xcafef00d;
  98. JITSymbolFlags BarFlags = static_cast<JITSymbolFlags::FlagNames>(
  99. JITSymbolFlags::Exported | JITSymbolFlags::Weak);
  100. auto LegacyLookup = [&](const std::string &Name) -> JITSymbol {
  101. if (Name == "foo")
  102. return {FooAddr, FooFlags};
  103. if (Name == "bar") {
  104. auto BarMaterializer = [&]() -> Expected<JITTargetAddress> {
  105. BarMaterialized = true;
  106. return BarAddr;
  107. };
  108. return {BarMaterializer, BarFlags};
  109. }
  110. return nullptr;
  111. };
  112. ExecutionSession ES;
  113. auto Foo = ES.getSymbolStringPool().intern("foo");
  114. auto Bar = ES.getSymbolStringPool().intern("bar");
  115. auto Baz = ES.getSymbolStringPool().intern("baz");
  116. SymbolNameSet Symbols({Foo, Bar, Baz});
  117. auto SymbolFlags = lookupFlagsWithLegacyFn(Symbols, LegacyLookup);
  118. EXPECT_TRUE(!!SymbolFlags) << "Expected lookupFlagsWithLegacyFn to succeed";
  119. EXPECT_EQ(SymbolFlags->size(), 2U) << "Wrong number of flags returned";
  120. EXPECT_EQ(SymbolFlags->count(Foo), 1U) << "Flags for foo missing";
  121. EXPECT_EQ(SymbolFlags->count(Bar), 1U) << "Flags for foo missing";
  122. EXPECT_EQ((*SymbolFlags)[Foo], FooFlags) << "Wrong flags for foo";
  123. EXPECT_EQ((*SymbolFlags)[Bar], BarFlags) << "Wrong flags for foo";
  124. EXPECT_FALSE(BarMaterialized)
  125. << "lookupFlags should not have materialized bar";
  126. bool OnResolvedRun = false;
  127. bool OnReadyRun = false;
  128. auto OnResolved =
  129. [&](Expected<AsynchronousSymbolQuery::ResolutionResult> Result) {
  130. OnResolvedRun = true;
  131. EXPECT_TRUE(!!Result) << "lookuWithLegacy failed to resolve";
  132. auto &Resolved = Result->Symbols;
  133. EXPECT_EQ(Resolved.size(), 2U) << "Wrong number of symbols resolved";
  134. EXPECT_EQ(Resolved.count(Foo), 1U) << "Result for foo missing";
  135. EXPECT_EQ(Resolved.count(Bar), 1U) << "Result for bar missing";
  136. EXPECT_EQ(Resolved[Foo].getAddress(), FooAddr)
  137. << "Wrong address for foo";
  138. EXPECT_EQ(Resolved[Foo].getFlags(), FooFlags) << "Wrong flags for foo";
  139. EXPECT_EQ(Resolved[Bar].getAddress(), BarAddr)
  140. << "Wrong address for bar";
  141. EXPECT_EQ(Resolved[Bar].getFlags(), BarFlags) << "Wrong flags for bar";
  142. };
  143. auto OnReady = [&](Error Err) {
  144. EXPECT_FALSE(!!Err) << "Finalization unexpectedly failed";
  145. OnReadyRun = true;
  146. };
  147. AsynchronousSymbolQuery Q({Foo, Bar}, OnResolved, OnReady);
  148. auto Unresolved = lookupWithLegacyFn(ES, Q, Symbols, LegacyLookup);
  149. EXPECT_TRUE(OnResolvedRun) << "OnResolved was not run";
  150. EXPECT_TRUE(OnReadyRun) << "OnReady was not run";
  151. EXPECT_EQ(Unresolved.size(), 1U) << "Expected one unresolved symbol";
  152. EXPECT_EQ(Unresolved.count(Baz), 1U) << "Expected baz to be unresolved";
  153. }
  154. } // namespace