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