@@ -18,6 +18,8 @@ using namespace llvm::orc;
18
18
namespace llvm {
19
19
namespace orc {
20
20
21
+ class InProgressLookupState ;
22
+
21
23
class OrcV2CAPIHelper {
22
24
public:
23
25
using PoolEntry = SymbolStringPtr::PoolEntry;
@@ -33,14 +35,27 @@ class OrcV2CAPIHelper {
33
35
return S.S ;
34
36
}
35
37
38
+ static void retainPoolEntry (PoolEntryPtr P) {
39
+ SymbolStringPtr S (P);
40
+ S.S = nullptr ;
41
+ }
42
+
36
43
static void releasePoolEntry (PoolEntryPtr P) {
37
44
SymbolStringPtr S;
38
45
S.S = P;
39
46
}
47
+
48
+ static InProgressLookupState *extractLookupState (LookupState &LS) {
49
+ return LS.IPLS .release ();
50
+ }
51
+
52
+ static void resetLookupState (LookupState &LS, InProgressLookupState *IPLS) {
53
+ return LS.reset (IPLS);
54
+ }
40
55
};
41
56
42
- } // end namespace orc
43
- } // end namespace llvm
57
+ } // namespace orc
58
+ } // namespace llvm
44
59
45
60
DEFINE_SIMPLE_CONVERSION_FUNCTIONS (ExecutionSession, LLVMOrcExecutionSessionRef)
46
61
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(SymbolStringPool, LLVMOrcSymbolStringPoolRef)
@@ -50,6 +65,7 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(JITDylib, LLVMOrcJITDylibRef)
50
65
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ResourceTracker, LLVMOrcResourceTrackerRef)
51
66
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DefinitionGenerator,
52
67
LLVMOrcDefinitionGeneratorRef)
68
+ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(InProgressLookupState, LLVMOrcLookupStateRef)
53
69
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeContext,
54
70
LLVMOrcThreadSafeContextRef)
55
71
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ThreadSafeModule, LLVMOrcThreadSafeModuleRef)
@@ -60,6 +76,83 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLJIT, LLVMOrcLLJITRef)
60
76
61
77
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
62
78
79
+ namespace llvm {
80
+ namespace orc {
81
+
82
+ class CAPIDefinitionGenerator final : public DefinitionGenerator {
83
+ public:
84
+ CAPIDefinitionGenerator (
85
+ void *Ctx,
86
+ LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate)
87
+ : Ctx(Ctx), TryToGenerate(TryToGenerate) {}
88
+
89
+ Error tryToGenerate (LookupState &LS, LookupKind K, JITDylib &JD,
90
+ JITDylibLookupFlags JDLookupFlags,
91
+ const SymbolLookupSet &LookupSet) override {
92
+
93
+ // Take the lookup state.
94
+ LLVMOrcLookupStateRef LSR = ::wrap (OrcV2CAPIHelper::extractLookupState (LS));
95
+
96
+ // Translate the lookup kind.
97
+ LLVMOrcLookupKind CLookupKind;
98
+ switch (K) {
99
+ case LookupKind::Static:
100
+ CLookupKind = LLVMOrcLookupKindStatic;
101
+ break ;
102
+ case LookupKind::DLSym:
103
+ CLookupKind = LLVMOrcLookupKindDLSym;
104
+ break ;
105
+ }
106
+
107
+ // Translate the JITDylibSearchFlags.
108
+ LLVMOrcJITDylibLookupFlags CJDLookupFlags;
109
+ switch (JDLookupFlags) {
110
+ case JITDylibLookupFlags::MatchExportedSymbolsOnly:
111
+ CJDLookupFlags = LLVMOrcJITDylibLookupFlagsMatchExportedSymbolsOnly;
112
+ break ;
113
+ case JITDylibLookupFlags::MatchAllSymbols:
114
+ CJDLookupFlags = LLVMOrcJITDylibLookupFlagsMatchAllSymbols;
115
+ break ;
116
+ }
117
+
118
+ // Translate the lookup set.
119
+ std::vector<LLVMOrcCLookupSetElement> CLookupSet;
120
+ CLookupSet.reserve (LookupSet.size ());
121
+ for (auto &KV : LookupSet) {
122
+ LLVMOrcSymbolLookupFlags SLF;
123
+ switch (KV.second ) {
124
+ case SymbolLookupFlags::RequiredSymbol:
125
+ SLF = LLVMOrcSymbolLookupFlagsRequiredSymbol;
126
+ break ;
127
+ case SymbolLookupFlags::WeaklyReferencedSymbol:
128
+ SLF = LLVMOrcSymbolLookupFlagsWeaklyReferencedSymbol;
129
+ break ;
130
+ }
131
+
132
+ CLookupSet.push_back (
133
+ {::wrap (OrcV2CAPIHelper::getRawPoolEntryPtr (KV.first )), SLF});
134
+ }
135
+ CLookupSet.push_back ({nullptr , LLVMOrcSymbolLookupFlagsRequiredSymbol});
136
+
137
+ // Run the C TryToGenerate function.
138
+ auto Err =
139
+ unwrap (TryToGenerate (::wrap (this ), Ctx, &LSR, CLookupKind, ::wrap (&JD),
140
+ CJDLookupFlags, CLookupSet.data ()));
141
+
142
+ // Restore the lookup state.
143
+ OrcV2CAPIHelper::resetLookupState (LS, ::unwrap (LSR));
144
+
145
+ return Err;
146
+ }
147
+
148
+ private:
149
+ void *Ctx;
150
+ LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction TryToGenerate;
151
+ };
152
+
153
+ } // end namespace orc
154
+ } // end namespace llvm
155
+
63
156
void LLVMOrcExecutionSessionSetErrorReporter (
64
157
LLVMOrcExecutionSessionRef ES, LLVMOrcErrorReporterFunction ReportError,
65
158
void *Ctx) {
@@ -82,6 +175,10 @@ LLVMOrcExecutionSessionIntern(LLVMOrcExecutionSessionRef ES, const char *Name) {
82
175
OrcV2CAPIHelper::releaseSymbolStringPtr (unwrap (ES)->intern (Name)));
83
176
}
84
177
178
+ void LLVMOrcRetainSymbolStringPoolEntry (LLVMOrcSymbolStringPoolEntryRef S) {
179
+ OrcV2CAPIHelper::retainPoolEntry (unwrap (S));
180
+ }
181
+
85
182
void LLVMOrcReleaseSymbolStringPoolEntry (LLVMOrcSymbolStringPoolEntryRef S) {
86
183
OrcV2CAPIHelper::releasePoolEntry (unwrap (S));
87
184
}
@@ -117,6 +214,11 @@ LLVMErrorRef LLVMOrcResourceTrackerRemove(LLVMOrcResourceTrackerRef RT) {
117
214
return wrap (TmpRT->remove ());
118
215
}
119
216
217
+ void LLVMOrcDisposeDefinitionGenerator (
218
+ LLVMOrcDefinitionGeneratorRef DG) {
219
+ delete unwrap (DG);
220
+ }
221
+
120
222
LLVMOrcJITDylibRef
121
223
LLVMOrcExecutionSessionCreateBareJITDylib (LLVMOrcExecutionSessionRef ES,
122
224
const char *Name) {
@@ -140,11 +242,6 @@ LLVMOrcExecutionSessionGetJITDylibByName(LLVMOrcExecutionSessionRef ES,
140
242
return wrap (unwrap (ES)->getJITDylibByName (Name));
141
243
}
142
244
143
- void LLVMOrcDisposeDefinitionGenerator (
144
- LLVMOrcDefinitionGeneratorRef DG) {
145
- delete unwrap (DG);
146
- }
147
-
148
245
LLVMErrorRef LLVMOrcJITDylibClear (LLVMOrcJITDylibRef JD) {
149
246
return wrap (unwrap (JD)->clear ());
150
247
}
@@ -154,6 +251,16 @@ void LLVMOrcJITDylibAddGenerator(LLVMOrcJITDylibRef JD,
154
251
unwrap (JD)->addGenerator (std::unique_ptr<DefinitionGenerator>(unwrap (DG)));
155
252
}
156
253
254
+ void LLVMOrcDisposeDefinitionGenerator (LLVMOrcDefinitionGeneratorRef DG) {
255
+ std::unique_ptr<DefinitionGenerator> TmpDG (unwrap (DG));
256
+ }
257
+
258
+ LLVMOrcDefinitionGeneratorRef LLVMOrcCreateCustomCAPIDefinitionGenerator (
259
+ void *Ctx, LLVMOrcCAPIDefinitionGeneratorTryToGenerateFunction F) {
260
+ auto DG = std::make_unique<CAPIDefinitionGenerator>(Ctx, F);
261
+ return wrap (DG.release ());
262
+ }
263
+
157
264
LLVMErrorRef LLVMOrcCreateDynamicLibrarySearchGeneratorForProcess (
158
265
LLVMOrcDefinitionGeneratorRef *Result, char GlobalPrefix,
159
266
LLVMOrcSymbolPredicate Filter, void *FilterCtx) {
0 commit comments