LLVM: include/llvm/ExecutionEngine/Orc/OrcABISupport.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H
18#define LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H
19
25#include
26
27namespace llvm {
28namespace orc {
29
35
36template
40 (RoundToMultipleOf == 0 || (RoundToMultipleOf % ORCABI::StubSize == 0)) &&
41 "RoundToMultipleOf is not a multiple of stub size");
42 uint64_t StubBytes = MinStubs * ORCABI::StubSize;
43 if (RoundToMultipleOf)
44 StubBytes = alignTo(StubBytes, RoundToMultipleOf);
45 unsigned NumStubs = StubBytes / ORCABI::StubSize;
46 uint64_t PointerBytes = NumStubs * ORCABI::PointerSize;
47 return {StubBytes, PointerBytes, NumStubs};
48}
49
50
51
52
53
54
55
57public:
58 static constexpr unsigned PointerSize = sizeof(uintptr_t);
60 static constexpr unsigned StubSize = 1;
63
68 llvm_unreachable("writeResolverCode is not supported by the generic host "
69 "support class");
70 }
71
75 unsigned NumTrampolines) {
76 llvm_unreachable("writeTrampolines is not supported by the generic host "
77 "support class");
78 }
79
83 unsigned NumStubs) {
85 "writeIndirectStubsBlock is not supported by the generic host "
86 "support class");
87 }
88};
89
91public:
94 static constexpr unsigned StubSize = 8;
97
98
99
100
101
102
103
104
109
110
111
112
116 ExecutorAddr ResolverAddr, unsigned NumTrampolines);
117
118
119
120
121
123 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
124 ExecutorAddr PointersBlockTargetAddress, unsigned MinStubs);
125};
126
127
128
129
131public:
136
137
138
139
143 ExecutorAddr ResolverAddr, unsigned NumTrampolines);
144
145
146
147
148
150 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
151 ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs);
152};
153
154
155
156
158public:
160
161
162
163
164
165
166
167
172};
173
174
175
176
178public:
180
181
182
183
184
185
186
187
192};
193
194
195
196
198public:
204
205
206
207
208
209
210
211
216
217
218
219
223 ExecutorAddr ResolverAddr, unsigned NumTrampolines);
224
225
226
227
228
230 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
231 ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs);
232};
233
234
235
236
238public:
244
245
246
247
251 ExecutorAddr ResolverAddr, unsigned NumTrampolines);
252
253
254
255
256
257
258
259
265
266
267
268
270 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
271 ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs);
272};
273
275public:
281 ReentryFnAddr, ReentryCtxAddr, false);
282 }
283};
284
286public:
292 ReentryFnAddr, ReentryCtxAddr, true);
293 }
294};
295
296
297
298
300public:
306
307
308
309
310
311
312
313
318
319
320
321
325 ExecutorAddr ResolverFnAddr, unsigned NumTrampolines);
326
327
328
329
331 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
332 ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs);
333};
334
335
336
337
339public:
345
346
347
348
349
350
351
352
357
358
359
360
364 ExecutorAddr ResolverFnAddr, unsigned NumTrampolines);
365
366
367
368
370 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
371 ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs);
372};
373
374
375
376
378public:
384
385
386
387
388
389
390
391
396
397
398
399
403 ExecutorAddr ResolverFnAddr, unsigned NumTrampolines);
404
405
406
407
408
410 char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress,
411 ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs);
412};
413
414}
415}
416
417#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
Represents an address in the executor process.
Definition OrcABISupport.h:90
static constexpr unsigned PointerSize
Definition OrcABISupport.h:92
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:95
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:96
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr RentryCtxAddr)
Write the resolver code into the given memory.
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:93
static constexpr unsigned StubSize
Definition OrcABISupport.h:94
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned MinStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
Generic ORC ABI support.
Definition OrcABISupport.h:56
static void writeResolverCode(char *ResolveWorkingMem, ExecutorAddr ResolverTargetAddr, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Definition OrcABISupport.h:64
static constexpr unsigned StubSize
Definition OrcABISupport.h:60
static constexpr unsigned PointerSize
Definition OrcABISupport.h:58
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:61
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:62
static void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Definition OrcABISupport.h:80
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:59
static void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddr, ExecutorAddr ResolverAddr, unsigned NumTrampolines)
Definition OrcABISupport.h:72
I386 support.
Definition OrcABISupport.h:197
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Write the resolver code into the given memory.
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
static constexpr unsigned PointerSize
Definition OrcABISupport.h:199
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:203
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:202
static constexpr unsigned StubSize
Definition OrcABISupport.h:201
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:200
Definition OrcABISupport.h:377
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:383
static constexpr unsigned StubSize
Definition OrcABISupport.h:381
static constexpr unsigned PointerSize
Definition OrcABISupport.h:379
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:380
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Write the resolver code into the given memory.
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverFnAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:382
Definition OrcABISupport.h:285
static void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Definition OrcABISupport.h:287
Definition OrcABISupport.h:274
static void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Definition OrcABISupport.h:276
Definition OrcABISupport.h:237
static constexpr unsigned StubSize
Definition OrcABISupport.h:241
static LLVM_ABI void writeResolverCode(char *ResolverBlockWorkingMem, ExecutorAddr ResolverBlockTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr, bool isBigEndian)
Write the resolver code into the given memory.
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:242
static constexpr unsigned PointerSize
Definition OrcABISupport.h:239
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:240
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:243
Definition OrcABISupport.h:299
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:304
static constexpr unsigned PointerSize
Definition OrcABISupport.h:301
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:305
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverFnAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static constexpr unsigned StubSize
Definition OrcABISupport.h:303
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Write the resolver code into the given memory.
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:302
Definition OrcABISupport.h:338
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:343
static constexpr unsigned StubSize
Definition OrcABISupport.h:342
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:341
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:344
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverFnAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static constexpr unsigned PointerSize
Definition OrcABISupport.h:340
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Write the resolver code into the given memory.
X86_64 code that's common to all ABIs.
Definition OrcABISupport.h:130
static constexpr unsigned PointerSize
Definition OrcABISupport.h:132
static constexpr unsigned StubSize
Definition OrcABISupport.h:134
static LLVM_ABI void writeIndirectStubsBlock(char *StubsBlockWorkingMem, ExecutorAddr StubsBlockTargetAddress, ExecutorAddr PointersBlockTargetAddress, unsigned NumStubs)
Write NumStubs indirect stubs to working memory at StubsBlockWorkingMem.
static LLVM_ABI void writeTrampolines(char *TrampolineBlockWorkingMem, ExecutorAddr TrampolineBlockTargetAddress, ExecutorAddr ResolverAddr, unsigned NumTrampolines)
Write the requested number of trampolines into the given memory, which must be big enough to hold 1 p...
static constexpr unsigned StubToPointerMaxDisplacement
Definition OrcABISupport.h:135
static constexpr unsigned TrampolineSize
Definition OrcABISupport.h:133
X86_64 support for SysV ABI (Linux, MacOSX).
Definition OrcABISupport.h:157
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:159
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Write the resolver code into the given memory.
X86_64 support for Win32.
Definition OrcABISupport.h:177
static constexpr unsigned ResolverCodeSize
Definition OrcABISupport.h:179
static LLVM_ABI void writeResolverCode(char *ResolverWorkingMem, ExecutorAddr ResolverTargetAddress, ExecutorAddr ReentryFnAddr, ExecutorAddr ReentryCtxAddr)
Write the resolver code into the given memory.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
IndirectStubsAllocationSizes getIndirectStubsBlockSizes(unsigned MinStubs, unsigned RoundToMultipleOf=0)
Definition OrcABISupport.h:38
This is an optimization pass for GlobalISel generic memory operations.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition OrcABISupport.h:30
unsigned NumStubs
Definition OrcABISupport.h:33
uint64_t PointerBytes
Definition OrcABISupport.h:32
uint64_t StubBytes
Definition OrcABISupport.h:31