1//===------------ TPCDynamicLibrarySearchGenerator.h ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Support loading and searching of dynamic libraries in a target process via
10// the TargetProcessControl class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_EXECUTIONENGINE_ORC_TPCDYNAMICLIBRARYSEARCHGENERATOR_H
15#define LLVM_EXECUTIONENGINE_ORC_TPCDYNAMICLIBRARYSEARCHGENERATOR_H
16
17#include "llvm/ADT/FunctionExtras.h"
18#include "llvm/ExecutionEngine/Orc/TargetProcessControl.h"
19
20namespace llvm {
21namespace orc {
22
23class TPCDynamicLibrarySearchGenerator : public DefinitionGenerator {
24public:
25 using SymbolPredicate = unique_function<bool(const SymbolStringPtr &)>;
26
27 /// Create a DynamicLibrarySearchGenerator that searches for symbols in the
28 /// library with the given handle.
29 ///
30 /// If the Allow predicate is given then only symbols matching the predicate
31 /// will be searched for. If the predicate is not given then all symbols will
32 /// be searched for.
33 TPCDynamicLibrarySearchGenerator(TargetProcessControl &TPC,
34 tpctypes::DylibHandle H,
35 SymbolPredicate Allow = SymbolPredicate())
36 : TPC(TPC), H(H), Allow(std::move(Allow)) {}
37
38 /// Permanently loads the library at the given path and, on success, returns
39 /// a DynamicLibrarySearchGenerator that will search it for symbol definitions
40 /// in the library. On failure returns the reason the library failed to load.
41 static Expected<std::unique_ptr<TPCDynamicLibrarySearchGenerator>>
42 Load(TargetProcessControl &TPC, const char *LibraryPath,
43 SymbolPredicate Allow = SymbolPredicate());
44
45 /// Creates a TPCDynamicLibrarySearchGenerator that searches for symbols in
46 /// the target process.
47 static Expected<std::unique_ptr<TPCDynamicLibrarySearchGenerator>>
48 GetForTargetProcess(TargetProcessControl &TPC,
49 SymbolPredicate Allow = SymbolPredicate()) {
50 return Load(TPC, nullptr, std::move(Allow));
51 }
52
53 Error tryToGenerate(LookupState &LS, LookupKind K, JITDylib &JD,
54 JITDylibLookupFlags JDLookupFlags,
55 const SymbolLookupSet &Symbols) override;
56
57private:
58 TargetProcessControl &TPC;
59 tpctypes::DylibHandle H;
60 SymbolPredicate Allow;
61};
62
63} // end namespace orc
64} // end namespace llvm
65
66#endif // LLVM_EXECUTIONENGINE_ORC_TPCDYNAMICLIBRARYSEARCHGENERATOR_H
67