12c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//===-- LambdaResolverMM - Redirect symbol lookup via a functor -*- C++ -*-===//
22c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//
32c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
42c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//
52c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
62c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
72c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//
82c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
92c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//
102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//   Defines a RuntimeDyld::SymbolResolver subclass that uses a user-supplied
112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar// functor for symbol resolution.
122c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//
132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
152c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#ifndef LLVM_EXECUTIONENGINE_ORC_LAMBDARESOLVER_H
162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#define LLVM_EXECUTIONENGINE_ORC_LAMBDARESOLVER_H
172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
182c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
192c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/ExecutionEngine/RuntimeDyld.h"
202c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include <memory>
212c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include <vector>
222c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
232c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarnamespace llvm {
242c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarnamespace orc {
252c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainartemplate <typename ExternalLookupFtorT, typename DylibLookupFtorT>
272c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarclass LambdaResolver : public RuntimeDyld::SymbolResolver {
282c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarpublic:
292c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
302c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  LambdaResolver(ExternalLookupFtorT ExternalLookupFtor,
312c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                 DylibLookupFtorT DylibLookupFtor)
322c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar      : ExternalLookupFtor(ExternalLookupFtor),
332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar        DylibLookupFtor(DylibLookupFtor) {}
342c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
352c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  RuntimeDyld::SymbolInfo findSymbol(const std::string &Name) final {
362c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return ExternalLookupFtor(Name);
372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  }
382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  RuntimeDyld::SymbolInfo
402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  findSymbolInLogicalDylib(const std::string &Name) final {
412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return DylibLookupFtor(Name);
422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  }
432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarprivate:
452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  ExternalLookupFtorT ExternalLookupFtor;
462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  DylibLookupFtorT DylibLookupFtor;
472c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar};
482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainartemplate <typename ExternalLookupFtorT,
502c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar          typename DylibLookupFtorT>
512c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstd::unique_ptr<LambdaResolver<ExternalLookupFtorT, DylibLookupFtorT>>
522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga NainarcreateLambdaResolver(ExternalLookupFtorT ExternalLookupFtor,
532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                     DylibLookupFtorT DylibLookupFtor) {
542c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  typedef LambdaResolver<ExternalLookupFtorT, DylibLookupFtorT> LR;
552c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  return make_unique<LR>(std::move(ExternalLookupFtor),
562c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                         std::move(DylibLookupFtor));
572c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar}
582c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
592c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar} // End namespace orc.
602c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar} // End namespace llvm.
612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#endif // LLVM_EXECUTIONENGINE_ORC_LAMBDARESOLVER_H
63