File indexing completed on 2026-05-10 08:43:54
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H
0018 #define LLVM_EXECUTIONENGINE_ORC_ORCABISUPPORT_H
0019
0020 #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
0021 #include "llvm/Support/Error.h"
0022 #include "llvm/Support/ErrorHandling.h"
0023 #include "llvm/Support/MathExtras.h"
0024 #include <cstdint>
0025
0026 namespace llvm {
0027 namespace orc {
0028
0029 struct IndirectStubsAllocationSizes {
0030 uint64_t StubBytes = 0;
0031 uint64_t PointerBytes = 0;
0032 unsigned NumStubs = 0;
0033 };
0034
0035 template <typename ORCABI>
0036 IndirectStubsAllocationSizes
0037 getIndirectStubsBlockSizes(unsigned MinStubs, unsigned RoundToMultipleOf = 0) {
0038 assert(
0039 (RoundToMultipleOf == 0 || (RoundToMultipleOf % ORCABI::StubSize == 0)) &&
0040 "RoundToMultipleOf is not a multiple of stub size");
0041 uint64_t StubBytes = MinStubs * ORCABI::StubSize;
0042 if (RoundToMultipleOf)
0043 StubBytes = alignTo(StubBytes, RoundToMultipleOf);
0044 unsigned NumStubs = StubBytes / ORCABI::StubSize;
0045 uint64_t PointerBytes = NumStubs * ORCABI::PointerSize;
0046 return {StubBytes, PointerBytes, NumStubs};
0047 }
0048
0049
0050
0051
0052
0053
0054
0055 class OrcGenericABI {
0056 public:
0057 static constexpr unsigned PointerSize = sizeof(uintptr_t);
0058 static constexpr unsigned TrampolineSize = 1;
0059 static constexpr unsigned StubSize = 1;
0060 static constexpr unsigned StubToPointerMaxDisplacement = 1;
0061 static constexpr unsigned ResolverCodeSize = 1;
0062
0063 static void writeResolverCode(char *ResolveWorkingMem,
0064 ExecutorAddr ResolverTargetAddr,
0065 ExecutorAddr ReentryFnAddr,
0066 ExecutorAddr ReentryCtxAddr) {
0067 llvm_unreachable("writeResolverCode is not supported by the generic host "
0068 "support class");
0069 }
0070
0071 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0072 ExecutorAddr TrampolineBlockTargetAddr,
0073 ExecutorAddr ResolverAddr,
0074 unsigned NumTrampolines) {
0075 llvm_unreachable("writeTrampolines is not supported by the generic host "
0076 "support class");
0077 }
0078
0079 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0080 ExecutorAddr StubsBlockTargetAddress,
0081 ExecutorAddr PointersBlockTargetAddress,
0082 unsigned NumStubs) {
0083 llvm_unreachable(
0084 "writeIndirectStubsBlock is not supported by the generic host "
0085 "support class");
0086 }
0087 };
0088
0089 class OrcAArch64 {
0090 public:
0091 static constexpr unsigned PointerSize = 8;
0092 static constexpr unsigned TrampolineSize = 12;
0093 static constexpr unsigned StubSize = 8;
0094 static constexpr unsigned StubToPointerMaxDisplacement = 1U << 27;
0095 static constexpr unsigned ResolverCodeSize = 0x120;
0096
0097
0098
0099
0100
0101
0102
0103
0104 static void writeResolverCode(char *ResolverWorkingMem,
0105 ExecutorAddr ResolverTargetAddress,
0106 ExecutorAddr ReentryFnAddr,
0107 ExecutorAddr RentryCtxAddr);
0108
0109
0110
0111
0112 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0113 ExecutorAddr TrampolineBlockTargetAddress,
0114 ExecutorAddr ResolverAddr,
0115 unsigned NumTrampolines);
0116
0117
0118
0119
0120
0121 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0122 ExecutorAddr StubsBlockTargetAddress,
0123 ExecutorAddr PointersBlockTargetAddress,
0124 unsigned MinStubs);
0125 };
0126
0127
0128
0129
0130 class OrcX86_64_Base {
0131 public:
0132 static constexpr unsigned PointerSize = 8;
0133 static constexpr unsigned TrampolineSize = 8;
0134 static constexpr unsigned StubSize = 8;
0135 static constexpr unsigned StubToPointerMaxDisplacement = 1 << 31;
0136
0137
0138
0139
0140 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0141 ExecutorAddr TrampolineBlockTargetAddress,
0142 ExecutorAddr ResolverAddr,
0143 unsigned NumTrampolines);
0144
0145
0146
0147
0148
0149 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0150 ExecutorAddr StubsBlockTargetAddress,
0151 ExecutorAddr PointersBlockTargetAddress,
0152 unsigned NumStubs);
0153 };
0154
0155
0156
0157
0158 class OrcX86_64_SysV : public OrcX86_64_Base {
0159 public:
0160 static constexpr unsigned ResolverCodeSize = 0x6C;
0161
0162
0163
0164
0165
0166
0167
0168
0169 static void writeResolverCode(char *ResolverWorkingMem,
0170 ExecutorAddr ResolverTargetAddress,
0171 ExecutorAddr ReentryFnAddr,
0172 ExecutorAddr ReentryCtxAddr);
0173 };
0174
0175
0176
0177
0178 class OrcX86_64_Win32 : public OrcX86_64_Base {
0179 public:
0180 static constexpr unsigned ResolverCodeSize = 0x74;
0181
0182
0183
0184
0185
0186
0187
0188
0189 static void writeResolverCode(char *ResolverWorkingMem,
0190 ExecutorAddr ResolverTargetAddress,
0191 ExecutorAddr ReentryFnAddr,
0192 ExecutorAddr ReentryCtxAddr);
0193 };
0194
0195
0196
0197
0198 class OrcI386 {
0199 public:
0200 static constexpr unsigned PointerSize = 4;
0201 static constexpr unsigned TrampolineSize = 8;
0202 static constexpr unsigned StubSize = 8;
0203 static constexpr unsigned StubToPointerMaxDisplacement = 1 << 31;
0204 static constexpr unsigned ResolverCodeSize = 0x4a;
0205
0206
0207
0208
0209
0210
0211
0212
0213 static void writeResolverCode(char *ResolverWorkingMem,
0214 ExecutorAddr ResolverTargetAddress,
0215 ExecutorAddr ReentryFnAddr,
0216 ExecutorAddr ReentryCtxAddr);
0217
0218
0219
0220
0221 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0222 ExecutorAddr TrampolineBlockTargetAddress,
0223 ExecutorAddr ResolverAddr,
0224 unsigned NumTrampolines);
0225
0226
0227
0228
0229
0230 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0231 ExecutorAddr StubsBlockTargetAddress,
0232 ExecutorAddr PointersBlockTargetAddress,
0233 unsigned NumStubs);
0234 };
0235
0236
0237
0238
0239 class OrcMips32_Base {
0240 public:
0241 static constexpr unsigned PointerSize = 4;
0242 static constexpr unsigned TrampolineSize = 20;
0243 static constexpr unsigned StubSize = 8;
0244 static constexpr unsigned StubToPointerMaxDisplacement = 1 << 31;
0245 static constexpr unsigned ResolverCodeSize = 0xfc;
0246
0247
0248
0249
0250 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0251 ExecutorAddr TrampolineBlockTargetAddress,
0252 ExecutorAddr ResolverAddr,
0253 unsigned NumTrampolines);
0254
0255
0256
0257
0258
0259
0260
0261
0262 static void writeResolverCode(char *ResolverBlockWorkingMem,
0263 ExecutorAddr ResolverBlockTargetAddress,
0264 ExecutorAddr ReentryFnAddr,
0265 ExecutorAddr ReentryCtxAddr, bool isBigEndian);
0266
0267
0268
0269
0270 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0271 ExecutorAddr StubsBlockTargetAddress,
0272 ExecutorAddr PointersBlockTargetAddress,
0273 unsigned NumStubs);
0274 };
0275
0276 class OrcMips32Le : public OrcMips32_Base {
0277 public:
0278 static void writeResolverCode(char *ResolverWorkingMem,
0279 ExecutorAddr ResolverTargetAddress,
0280 ExecutorAddr ReentryFnAddr,
0281 ExecutorAddr ReentryCtxAddr) {
0282 OrcMips32_Base::writeResolverCode(ResolverWorkingMem, ResolverTargetAddress,
0283 ReentryFnAddr, ReentryCtxAddr, false);
0284 }
0285 };
0286
0287 class OrcMips32Be : public OrcMips32_Base {
0288 public:
0289 static void writeResolverCode(char *ResolverWorkingMem,
0290 ExecutorAddr ResolverTargetAddress,
0291 ExecutorAddr ReentryFnAddr,
0292 ExecutorAddr ReentryCtxAddr) {
0293 OrcMips32_Base::writeResolverCode(ResolverWorkingMem, ResolverTargetAddress,
0294 ReentryFnAddr, ReentryCtxAddr, true);
0295 }
0296 };
0297
0298
0299
0300
0301 class OrcMips64 {
0302 public:
0303 static constexpr unsigned PointerSize = 8;
0304 static constexpr unsigned TrampolineSize = 40;
0305 static constexpr unsigned StubSize = 32;
0306 static constexpr unsigned StubToPointerMaxDisplacement = 1 << 31;
0307 static constexpr unsigned ResolverCodeSize = 0x120;
0308
0309
0310
0311
0312
0313
0314
0315
0316 static void writeResolverCode(char *ResolverWorkingMem,
0317 ExecutorAddr ResolverTargetAddress,
0318 ExecutorAddr ReentryFnAddr,
0319 ExecutorAddr ReentryCtxAddr);
0320
0321
0322
0323
0324 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0325 ExecutorAddr TrampolineBlockTargetAddress,
0326 ExecutorAddr ResolverFnAddr,
0327 unsigned NumTrampolines);
0328
0329
0330
0331
0332 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0333 ExecutorAddr StubsBlockTargetAddress,
0334 ExecutorAddr PointersBlockTargetAddress,
0335 unsigned NumStubs);
0336 };
0337
0338
0339
0340
0341 class OrcRiscv64 {
0342 public:
0343 static constexpr unsigned PointerSize = 8;
0344 static constexpr unsigned TrampolineSize = 16;
0345 static constexpr unsigned StubSize = 16;
0346 static constexpr unsigned StubToPointerMaxDisplacement = 1 << 31;
0347 static constexpr unsigned ResolverCodeSize = 0x148;
0348
0349
0350
0351
0352
0353
0354
0355
0356 static void writeResolverCode(char *ResolverWorkingMem,
0357 ExecutorAddr ResolverTargetAddress,
0358 ExecutorAddr ReentryFnAddr,
0359 ExecutorAddr ReentryCtxAddr);
0360
0361
0362
0363
0364 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0365 ExecutorAddr TrampolineBlockTargetAddress,
0366 ExecutorAddr ResolverFnAddr,
0367 unsigned NumTrampolines);
0368
0369
0370
0371
0372 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0373 ExecutorAddr StubsBlockTargetAddress,
0374 ExecutorAddr PointersBlockTargetAddress,
0375 unsigned NumStubs);
0376 };
0377
0378
0379
0380
0381 class OrcLoongArch64 {
0382 public:
0383 static constexpr unsigned PointerSize = 8;
0384 static constexpr unsigned TrampolineSize = 16;
0385 static constexpr unsigned StubSize = 16;
0386 static constexpr unsigned StubToPointerMaxDisplacement = 1 << 31;
0387 static constexpr unsigned ResolverCodeSize = 0xc8;
0388
0389
0390
0391
0392
0393
0394
0395
0396 static void writeResolverCode(char *ResolverWorkingMem,
0397 ExecutorAddr ResolverTargetAddress,
0398 ExecutorAddr ReentryFnAddr,
0399 ExecutorAddr ReentryCtxAddr);
0400
0401
0402
0403
0404 static void writeTrampolines(char *TrampolineBlockWorkingMem,
0405 ExecutorAddr TrampolineBlockTargetAddress,
0406 ExecutorAddr ResolverFnAddr,
0407 unsigned NumTrampolines);
0408
0409
0410
0411
0412
0413 static void writeIndirectStubsBlock(char *StubsBlockWorkingMem,
0414 ExecutorAddr StubsBlockTargetAddress,
0415 ExecutorAddr PointersBlockTargetAddress,
0416 unsigned NumStubs);
0417 };
0418
0419 }
0420 }
0421
0422 #endif