blob: a2413703f130a6bc155d6f02e54a70dc1cc221e1 [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
15JITSymbolResolverAdapter::JITSymbolResolverAdapter(ExecutionSession &ES,
16 SymbolResolver &R)
17 : ES(ES), R(R) {}
18
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
28 auto OnResolve = [&](Expected<SymbolMap> R) {
29 if (R) {
30 for (auto &KV : *R) {
31 ResolvedStrings.insert(KV.first);
32 Result[*KV.first] = KV.second;
33 }
34 } else
35 Err = joinErrors(std::move(Err), R.takeError());
36 };
37
38 auto OnReady = [](Error Err) {
39 // FIXME: Report error to ExecutionSession.
40 logAllUnhandledErrors(std::move(Err), errs(),
41 "legacy resolver received on-ready error:\n");
42 };
43
Lang Hamese833fe82018-02-14 22:12:56 +000044 auto Query = std::make_shared<AsynchronousSymbolQuery>(InternedSymbols,
45 OnResolve, OnReady);
Lang Hames635fd902018-01-22 03:00:31 +000046
Lang Hamese833fe82018-02-14 22:12:56 +000047 auto UnresolvedSymbols = R.lookup(std::move(Query), InternedSymbols);
Lang Hames635fd902018-01-22 03:00:31 +000048
Lang Hames4b546c92018-02-06 21:25:11 +000049 if (!UnresolvedSymbols.empty()) {
50 std::string ErrorMsg = "Unresolved symbols: ";
51
52 ErrorMsg += **UnresolvedSymbols.begin();
53 for (auto I = std::next(UnresolvedSymbols.begin()),
54 E = UnresolvedSymbols.end();
55 I != E; ++I) {
56 ErrorMsg += ", ";
57 ErrorMsg += **I;
58 }
59
60 Err =
61 joinErrors(std::move(Err),
62 make_error<StringError>(ErrorMsg, inconvertibleErrorCode()));
63 }
Lang Hames635fd902018-01-22 03:00:31 +000064
65 if (Err)
66 return std::move(Err);
67
68 return Result;
69}
70
71Expected<JITSymbolResolverAdapter::LookupFlagsResult>
72JITSymbolResolverAdapter::lookupFlags(const LookupSet &Symbols) {
73 SymbolNameSet InternedSymbols;
74 for (auto &S : Symbols)
75 InternedSymbols.insert(ES.getSymbolStringPool().intern(S));
76
Lang Hamesc8a74a02018-01-25 01:43:00 +000077 SymbolFlagsMap SymbolFlags;
78 R.lookupFlags(SymbolFlags, InternedSymbols);
Lang Hames635fd902018-01-22 03:00:31 +000079 LookupFlagsResult Result;
Lang Hamesc8a74a02018-01-25 01:43:00 +000080 for (auto &KV : SymbolFlags) {
Lang Hames635fd902018-01-22 03:00:31 +000081 ResolvedStrings.insert(KV.first);
82 Result[*KV.first] = KV.second;
83 }
84
85 return Result;
86}
87
88} // End namespace orc.
89} // End namespace llvm.