comparison unittests/ExecutionEngine/Orc/LegacyAPIInteropTest.cpp @ 147:c2174574ed3a

LLVM 10
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 16:55:33 +0900
parents 3a76565eade5
children
comparison
equal deleted inserted replaced
134:3a76565eade5 147:c2174574ed3a
1 //===----------- CoreAPIsTest.cpp - Unit tests for Core ORC APIs ----------===// 1 //===----------- CoreAPIsTest.cpp - Unit tests for Core ORC APIs ----------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // 4 // See https://llvm.org/LICENSE.txt for license information.
5 // This file is distributed under the University of Illinois Open Source 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 // License. See LICENSE.TXT for details.
7 // 6 //
8 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
9 8
10 #include "OrcTestCommon.h" 9 #include "OrcTestCommon.h"
11 #include "llvm/ExecutionEngine/Orc/Legacy.h" 10 #include "llvm/ExecutionEngine/Orc/Legacy.h"
12 #include "gtest/gtest.h" 11 #include "gtest/gtest.h"
13 12
14 using namespace llvm; 13 using namespace llvm;
15 using namespace llvm::orc; 14 using namespace llvm::orc;
16 15
16 class LegacyAPIsStandardTest : public CoreAPIsBasedStandardTest {};
17
17 namespace { 18 namespace {
18 19
19 TEST(LegacyAPIInteropTest, QueryAgainstVSO) { 20 TEST_F(LegacyAPIsStandardTest, TestLambdaSymbolResolver) {
21 BarSym.setFlags(BarSym.getFlags() | JITSymbolFlags::Weak);
20 22
21 SymbolStringPool SP; 23 cantFail(JD.define(absoluteSymbols({{Foo, FooSym}, {Bar, BarSym}})));
22 ExecutionSession ES(SP);
23 auto Foo = SP.intern("foo");
24 24
25 VSO V; 25 auto Resolver = createSymbolResolver(
26 SymbolMap Defs; 26 [&](const SymbolNameSet &Symbols) {
27 JITEvaluatedSymbol FooSym(0xdeadbeef, JITSymbolFlags::Exported); 27 auto FlagsMap = cantFail(JD.lookupFlags(Symbols));
28 Defs[Foo] = FooSym; 28 SymbolNameSet Result;
29 cantFail(V.define(std::move(Defs))); 29 for (auto &KV : FlagsMap)
30 if (!KV.second.isStrong())
31 Result.insert(KV.first);
32 return Result;
33 },
34 [&](std::shared_ptr<AsynchronousSymbolQuery> Q, SymbolNameSet Symbols) {
35 return cantFail(JD.legacyLookup(std::move(Q), Symbols));
36 });
30 37
31 auto LookupFlags = [&](SymbolFlagsMap &SymbolFlags, 38 auto RS = Resolver->getResponsibilitySet(SymbolNameSet({Bar, Baz}));
32 const SymbolNameSet &Names) { 39
33 return V.lookupFlags(SymbolFlags, Names); 40 EXPECT_EQ(RS.size(), 1U)
41 << "getResponsibilitySet returned the wrong number of results";
42 EXPECT_EQ(RS.count(Bar), 1U)
43 << "getResponsibilitySet result incorrect. Should be {'bar'}";
44
45 bool OnCompletionRun = false;
46
47 auto OnCompletion = [&](Expected<SymbolMap> Result) {
48 OnCompletionRun = true;
49 EXPECT_TRUE(!!Result) << "Unexpected error";
50 EXPECT_EQ(Result->size(), 2U) << "Unexpected number of resolved symbols";
51 EXPECT_EQ(Result->count(Foo), 1U) << "Missing lookup result for foo";
52 EXPECT_EQ(Result->count(Bar), 1U) << "Missing lookup result for bar";
53 EXPECT_EQ((*Result)[Foo].getAddress(), FooSym.getAddress())
54 << "Incorrect address for foo";
55 EXPECT_EQ((*Result)[Bar].getAddress(), BarSym.getAddress())
56 << "Incorrect address for bar";
34 }; 57 };
35 58
36 auto Lookup = [&](std::shared_ptr<AsynchronousSymbolQuery> Query, 59 auto Q = std::make_shared<AsynchronousSymbolQuery>(
37 SymbolNameSet Symbols) { 60 SymbolNameSet({Foo, Bar}), SymbolState::Resolved, OnCompletion);
38 auto R = V.lookup(std::move(Query), Symbols); 61 auto Unresolved =
39 EXPECT_TRUE(R.MaterializationWork.empty()) 62 Resolver->lookup(std::move(Q), SymbolNameSet({Foo, Bar, Baz}));
40 << "Query resulted in unexpected materialization work";
41 return std::move(R.UnresolvedSymbols);
42 };
43 63
44 auto UnderlyingResolver = 64 EXPECT_EQ(Unresolved.size(), 1U) << "Expected one unresolved symbol";
45 createSymbolResolver(std::move(LookupFlags), std::move(Lookup)); 65 EXPECT_EQ(Unresolved.count(Baz), 1U) << "Expected baz to not be resolved";
46 JITSymbolResolverAdapter Resolver(ES, *UnderlyingResolver); 66 EXPECT_TRUE(OnCompletionRun) << "OnCompletion was never run";
47
48 JITSymbolResolver::LookupSet Names{StringRef("foo")};
49
50 auto LFR = Resolver.lookupFlags(Names);
51 EXPECT_TRUE(!!LFR) << "lookupFlags failed";
52 EXPECT_EQ(LFR->size(), 1U)
53 << "lookupFlags returned the wrong number of results";
54 EXPECT_EQ(LFR->count(*Foo), 1U)
55 << "lookupFlags did not contain a result for 'foo'";
56 EXPECT_EQ((*LFR)[*Foo], FooSym.getFlags())
57 << "lookupFlags contained the wrong result for 'foo'";
58
59 auto LR = Resolver.lookup(Names);
60 EXPECT_TRUE(!!LR) << "lookup failed";
61 EXPECT_EQ(LR->size(), 1U) << "lookup returned the wrong number of results";
62 EXPECT_EQ(LR->count(*Foo), 1U) << "lookup did not contain a result for 'foo'";
63 EXPECT_EQ((*LR)[*Foo].getFlags(), FooSym.getFlags())
64 << "lookup returned the wrong result for flags of 'foo'";
65 EXPECT_EQ((*LR)[*Foo].getAddress(), FooSym.getAddress())
66 << "lookup returned the wrong result for address of 'foo'";
67 } 67 }
68 68
69 TEST(LegacyAPIInteropTset, LegacyLookupHelpersFn) { 69 TEST_F(LegacyAPIsStandardTest, LegacyLookupHelpersFn) {
70 constexpr JITTargetAddress FooAddr = 0xdeadbeef;
71 JITSymbolFlags FooFlags = JITSymbolFlags::Exported;
72
73 bool BarMaterialized = false; 70 bool BarMaterialized = false;
74 constexpr JITTargetAddress BarAddr = 0xcafef00d; 71 BarSym.setFlags(BarSym.getFlags() | JITSymbolFlags::Weak);
75 JITSymbolFlags BarFlags = static_cast<JITSymbolFlags::FlagNames>(
76 JITSymbolFlags::Exported | JITSymbolFlags::Weak);
77 72
78 auto LegacyLookup = [&](const std::string &Name) -> JITSymbol { 73 auto LegacyLookup = [&](const std::string &Name) -> JITSymbol {
79 if (Name == "foo") 74 if (Name == "foo")
80 return {FooAddr, FooFlags}; 75 return FooSym;
81 76
82 if (Name == "bar") { 77 if (Name == "bar") {
83 auto BarMaterializer = [&]() -> Expected<JITTargetAddress> { 78 auto BarMaterializer = [&]() -> Expected<JITTargetAddress> {
84 BarMaterialized = true; 79 BarMaterialized = true;
85 return BarAddr; 80 return BarAddr;
86 }; 81 };
87 82
88 return {BarMaterializer, BarFlags}; 83 return {BarMaterializer, BarSym.getFlags()};
89 } 84 }
90 85
91 return nullptr; 86 return nullptr;
92 }; 87 };
93 88
94 SymbolStringPool SP; 89 auto RS =
95 auto Foo = SP.intern("foo"); 90 getResponsibilitySetWithLegacyFn(SymbolNameSet({Bar, Baz}), LegacyLookup);
96 auto Bar = SP.intern("bar");
97 auto Baz = SP.intern("baz");
98 91
99 SymbolNameSet Symbols({Foo, Bar, Baz}); 92 EXPECT_TRUE(!!RS) << "Expected getResponsibilitySetWithLegacyFn to succeed";
100 93 EXPECT_EQ(RS->size(), 1U) << "Wrong number of symbols returned";
101 SymbolFlagsMap SymbolFlags; 94 EXPECT_EQ(RS->count(Bar), 1U) << "Incorrect responsibility set returned";
102 auto SymbolsNotFound =
103 lookupFlagsWithLegacyFn(SymbolFlags, Symbols, LegacyLookup);
104
105 EXPECT_TRUE(!!SymbolsNotFound) << "lookupFlagsWithLegacy failed unexpectedly";
106 EXPECT_EQ(SymbolFlags.size(), 2U) << "Wrong number of flags returned";
107 EXPECT_EQ(SymbolFlags.count(Foo), 1U) << "Flags for foo missing";
108 EXPECT_EQ(SymbolFlags.count(Bar), 1U) << "Flags for foo missing";
109 EXPECT_EQ(SymbolFlags[Foo], FooFlags) << "Wrong flags for foo";
110 EXPECT_EQ(SymbolFlags[Bar], BarFlags) << "Wrong flags for foo";
111 EXPECT_EQ(SymbolsNotFound->size(), 1U) << "Expected one symbol not found";
112 EXPECT_EQ(SymbolsNotFound->count(Baz), 1U)
113 << "Expected symbol baz to be not found";
114 EXPECT_FALSE(BarMaterialized) 95 EXPECT_FALSE(BarMaterialized)
115 << "lookupFlags should not have materialized bar"; 96 << "lookupFlags should not have materialized bar";
116 97
117 bool OnResolvedRun = false; 98 bool OnCompletionRun = false;
118 bool OnReadyRun = false; 99 auto OnCompletion = [&](Expected<SymbolMap> Result) {
119 auto OnResolved = [&](Expected<SymbolMap> Result) { 100 OnCompletionRun = true;
120 OnResolvedRun = true;
121 EXPECT_TRUE(!!Result) << "lookuWithLegacy failed to resolve"; 101 EXPECT_TRUE(!!Result) << "lookuWithLegacy failed to resolve";
102
122 EXPECT_EQ(Result->size(), 2U) << "Wrong number of symbols resolved"; 103 EXPECT_EQ(Result->size(), 2U) << "Wrong number of symbols resolved";
123 EXPECT_EQ(Result->count(Foo), 1U) << "Result for foo missing"; 104 EXPECT_EQ(Result->count(Foo), 1U) << "Result for foo missing";
124 EXPECT_EQ(Result->count(Bar), 1U) << "Result for bar missing"; 105 EXPECT_EQ(Result->count(Bar), 1U) << "Result for bar missing";
125 EXPECT_EQ((*Result)[Foo].getAddress(), FooAddr) << "Wrong address for foo"; 106 EXPECT_EQ((*Result)[Foo].getAddress(), FooAddr) << "Wrong address for foo";
126 EXPECT_EQ((*Result)[Foo].getFlags(), FooFlags) << "Wrong flags for foo"; 107 EXPECT_EQ((*Result)[Foo].getFlags(), FooSym.getFlags())
108 << "Wrong flags for foo";
127 EXPECT_EQ((*Result)[Bar].getAddress(), BarAddr) << "Wrong address for bar"; 109 EXPECT_EQ((*Result)[Bar].getAddress(), BarAddr) << "Wrong address for bar";
128 EXPECT_EQ((*Result)[Bar].getFlags(), BarFlags) << "Wrong flags for bar"; 110 EXPECT_EQ((*Result)[Bar].getFlags(), BarSym.getFlags())
129 }; 111 << "Wrong flags for bar";
130 auto OnReady = [&](Error Err) {
131 EXPECT_FALSE(!!Err) << "Finalization unexpectedly failed";
132 OnReadyRun = true;
133 }; 112 };
134 113
135 AsynchronousSymbolQuery Q({Foo, Bar}, OnResolved, OnReady); 114 AsynchronousSymbolQuery Q({Foo, Bar}, SymbolState::Resolved, OnCompletion);
136 auto Unresolved = lookupWithLegacyFn(Q, Symbols, LegacyLookup); 115 auto Unresolved =
116 lookupWithLegacyFn(ES, Q, SymbolNameSet({Foo, Bar, Baz}), LegacyLookup);
137 117
138 EXPECT_TRUE(OnResolvedRun) << "OnResolved was not run"; 118 EXPECT_TRUE(OnCompletionRun) << "OnCompletion was not run";
139 EXPECT_TRUE(OnReadyRun) << "OnReady was not run";
140 EXPECT_EQ(Unresolved.size(), 1U) << "Expected one unresolved symbol"; 119 EXPECT_EQ(Unresolved.size(), 1U) << "Expected one unresolved symbol";
141 EXPECT_EQ(Unresolved.count(Baz), 1U) << "Expected baz to be unresolved"; 120 EXPECT_EQ(Unresolved.count(Baz), 1U) << "Expected baz to be unresolved";
142 } 121 }
143 122
144 } // namespace 123 } // namespace