1//===- LambdaResolverMM - Redirect symbol lookup via a functor --*- C++ -*-===//
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//   Defines a RuntimeDyld::SymbolResolver subclass that uses a user-supplied
11// functor for symbol resolution.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_EXECUTIONENGINE_ORC_LAMBDARESOLVER_H
16#define LLVM_EXECUTIONENGINE_ORC_LAMBDARESOLVER_H
17
18#include "llvm/ADT/STLExtras.h"
19#include "llvm/ExecutionEngine/JITSymbol.h"
20#include <memory>
21
22namespace llvm {
23namespace orc {
24
25template <typename DylibLookupFtorT, typename ExternalLookupFtorT>
26class LambdaResolver : public JITSymbolResolver {
27public:
28  LambdaResolver(DylibLookupFtorT DylibLookupFtor,
29                 ExternalLookupFtorT ExternalLookupFtor)
30      : DylibLookupFtor(DylibLookupFtor),
31        ExternalLookupFtor(ExternalLookupFtor) {}
32
33  JITSymbol findSymbolInLogicalDylib(const std::string &Name) final {
34    return DylibLookupFtor(Name);
35  }
36
37  JITSymbol findSymbol(const std::string &Name) final {
38    return ExternalLookupFtor(Name);
39  }
40
41private:
42  DylibLookupFtorT DylibLookupFtor;
43  ExternalLookupFtorT ExternalLookupFtor;
44};
45
46template <typename DylibLookupFtorT,
47          typename ExternalLookupFtorT>
48std::shared_ptr<LambdaResolver<DylibLookupFtorT, ExternalLookupFtorT>>
49createLambdaResolver(DylibLookupFtorT DylibLookupFtor,
50                     ExternalLookupFtorT ExternalLookupFtor) {
51  using LR = LambdaResolver<DylibLookupFtorT, ExternalLookupFtorT>;
52  return make_unique<LR>(std::move(DylibLookupFtor),
53                         std::move(ExternalLookupFtor));
54}
55
56} // end namespace orc
57} // end namespace llvm
58
59#endif // LLVM_EXECUTIONENGINE_ORC_LAMBDARESOLVER_H
60