blob: f7487b3a737074fba6ae57f8bef7b1f6687df2e4 [file] [log] [blame]
Lang Hames635fd902018-01-22 03:00:31 +00001//===------- Legacy.cpp - Adapters for ExecutionEngine API interop --------===//
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
10#include "llvm/ExecutionEngine/Orc/Legacy.h"
11
12namespace llvm {
13namespace orc {
14
Lang Hamesd261e122018-05-16 22:24:30 +000015JITSymbolResolverAdapter::JITSymbolResolverAdapter(
16 ExecutionSession &ES, SymbolResolver &R, MaterializationResponsibility *MR)
17 : ES(ES), R(R), MR(MR) {}
Lang Hames635fd902018-01-22 03:00:31 +000018
19Expected<JITSymbolResolverAdapter::LookupResult>
20JITSymbolResolverAdapter::lookup(const LookupSet &Symbols) {
21 Error Err = Error::success();
22 JITSymbolResolver::LookupResult Result;
23
24 SymbolNameSet InternedSymbols;
25 for (auto &S : Symbols)
26 InternedSymbols.insert(ES.getSymbolStringPool().intern(S));
27
Lang Hamesd261e122018-05-16 22:24:30 +000028 auto OnResolve =
29 [&, this](Expected<AsynchronousSymbolQuery::ResolutionResult> RR) {
30 if (RR) {
31 // If this lookup was attached to a MaterializationResponsibility then
32 // record the dependencies.
33 if (MR)
34 MR->addDependencies(RR->Dependencies);
Lang Hames635fd902018-01-22 03:00:31 +000035
Lang Hamesd261e122018-05-16 22:24:30 +000036 for (auto &KV : RR->Symbols) {
37 ResolvedStrings.insert(KV.first);
38 Result[*KV.first] = KV.second;
39 }
40 } else
41 Err = joinErrors(std::move(Err), RR.takeError());
42 };
43
44 auto OnReady = [this](Error Err) { ES.reportError(std::move(Err)); };
Lang Hames635fd902018-01-22 03:00:31 +000045
Lang Hamese833fe82018-02-14 22:12:56 +000046 auto Query = std::make_shared<AsynchronousSymbolQuery>(InternedSymbols,
47 OnResolve, OnReady);
Lang Hames635fd902018-01-22 03:00:31 +000048
Lang Hamesd261e122018-05-16 22:24:30 +000049 auto UnresolvedSymbols = R.lookup(Query, InternedSymbols);
Lang Hames635fd902018-01-22 03:00:31 +000050
Lang Hames4b546c92018-02-06 21:25:11 +000051 if (!UnresolvedSymbols.empty()) {
52 std::string ErrorMsg = "Unresolved symbols: ";
53
54 ErrorMsg += **UnresolvedSymbols.begin();
55 for (auto I = std::next(UnresolvedSymbols.begin()),
56 E = UnresolvedSymbols.end();
57 I != E; ++I) {
58 ErrorMsg += ", ";
59 ErrorMsg += **I;
60 }
61
62 Err =
63 joinErrors(std::move(Err),
64 make_error<StringError>(ErrorMsg, inconvertibleErrorCode()));
65 }
Lang Hames635fd902018-01-22 03:00:31 +000066
67 if (Err)
68 return std::move(Err);
69
70 return Result;
71}
72
73Expected<JITSymbolResolverAdapter::LookupFlagsResult>
74JITSymbolResolverAdapter::lookupFlags(const LookupSet &Symbols) {
75 SymbolNameSet InternedSymbols;
76 for (auto &S : Symbols)
77 InternedSymbols.insert(ES.getSymbolStringPool().intern(S));
78
Lang Hamesc8a74a02018-01-25 01:43:00 +000079 SymbolFlagsMap SymbolFlags;
80 R.lookupFlags(SymbolFlags, InternedSymbols);
Lang Hames635fd902018-01-22 03:00:31 +000081 LookupFlagsResult Result;
Lang Hamesc8a74a02018-01-25 01:43:00 +000082 for (auto &KV : SymbolFlags) {
Lang Hames635fd902018-01-22 03:00:31 +000083 ResolvedStrings.insert(KV.first);
84 Result[*KV.first] = KV.second;
85 }
86
87 return Result;
88}
89
90} // End namespace orc.
91} // End namespace llvm.