LLVM: lib/ExecutionEngine/JITLink/MachO_arm64.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

17

21

22#define DEBUG_TYPE "jitlink"

23

24using namespace llvm;

26

27namespace {

28

30public:

32 std::shared_ptrorc::SymbolStringPool SSP,

36 NumSymbols(Obj.getSymtabLoadCommand().nsyms) {}

37

38private:

39 enum MachOARM64RelocationKind : Edge::Kind {

40 MachOBranch26 = Edge::FirstRelocation,

41 MachOPointer32,

42 MachOPointer64,

43 MachOPointer64Anon,

44 MachOPointer64Authenticated,

45 MachOPage21,

46 MachOPageOffset12,

47 MachOGOTPage21,

48 MachOGOTPageOffset12,

49 MachOTLVPage21,

50 MachOTLVPageOffset12,

51 MachOPointerToGOT,

52 MachOPairedAddend,

53 MachOLDRLiteral19,

54 MachODelta32,

55 MachODelta64,

56 MachONegDelta32,

57 MachONegDelta64,

58 };

59

61

62

63

66 CPUSubType &= ~MachO::CPU_SUBTYPE_MASK;

68 return Triple("arm64e-apple-darwin");

69 return Triple("arm64-apple-darwin");

70 }

71

78 return RI.r_extern ? MachOPointer64 : MachOPointer64Anon;

80 return MachOPointer32;

81 }

82 break;

84

85

86

89 return MachODelta32;

91 return MachODelta64;

92 }

93 break;

96 return MachOBranch26;

97 break;

100 return MachOPage21;

101 break;

104 return MachOPageOffset12;

105 break;

108 return MachOGOTPage21;

109 break;

112 return MachOGOTPageOffset12;

113 break;

116 return MachOPointerToGOT;

117 break;

120 return MachOPairedAddend;

121 break;

124 return MachOPointer64Authenticated;

125 break;

128 return MachOTLVPage21;

129 break;

132 return MachOTLVPageOffset12;

133 break;

134 }

135

137 "Unsupported arm64 relocation: address=" +

141 ", pc_rel=" + (RI.r_pcrel ? "true" : "false") +

142 ", extern=" + (RI.r_extern ? "true" : "false") +

144 }

145

146 using PairRelocInfo = std::tuple<Edge::Kind, Symbol *, uint64_t>;

147

148

149

151 parsePairRelocation(Block &BlockToFix, Edge::Kind SubtractorKind,

157

158 assert(((SubtractorKind == MachODelta32 && SubRI.r_length == 2) ||

159 (SubtractorKind == MachODelta64 && SubRI.r_length == 3)) &&

160 "Subtractor kind should match length");

161 assert(SubRI.r_extern && "SUBTRACTOR reloc symbol should be extern");

162 assert(!SubRI.r_pcrel && "SUBTRACTOR reloc should not be PCRel");

163

164 if (UnsignedRelItr == RelEnd)

166 "UNSIGNED relocation");

167

168 auto UnsignedRI = getRelocationInfo(UnsignedRelItr);

169

170 if (SubRI.r_address != UnsignedRI.r_address)

172 "point to different addresses");

173

174 if (SubRI.r_length != UnsignedRI.r_length)

176 "UNSIGNED reloc must match");

177

179 if (auto FromSymbolOrErr = findSymbolByIndex(SubRI.r_symbolnum))

180 FromSymbol = FromSymbolOrErr->GraphSymbol;

181 else

182 return FromSymbolOrErr.takeError();

183

184

187 FixupValue = *(const little64_t *)FixupContent;

188 else

189 FixupValue = *(const little32_t *)FixupContent;

190

191

192

193 Symbol *ToSymbol = nullptr;

194 if (UnsignedRI.r_extern) {

195

196 if (auto ToSymbolOrErr = findSymbolByIndex(UnsignedRI.r_symbolnum))

197 ToSymbol = ToSymbolOrErr->GraphSymbol;

198 else

199 return ToSymbolOrErr.takeError();

200 } else {

201 auto ToSymbolSec = findSectionByIndex(UnsignedRI.r_symbolnum - 1);

202 if (!ToSymbolSec)

203 return ToSymbolSec.takeError();

204 ToSymbol = getSymbolByAddress(*ToSymbolSec, ToSymbolSec->Address);

205 assert(ToSymbol && "No symbol for section");

207 }

208

209 Edge::Kind DeltaKind;

210 Symbol *TargetSymbol;

212

213 bool FixingFromSymbol = true;

216

217

218 if (ToSymbol->getAddress() > FixupAddress)

219 FixingFromSymbol = true;

220 else if (FromSymbol->getAddress() > FixupAddress)

221 FixingFromSymbol = false;

222 else

224 } else

225 FixingFromSymbol = true;

226 } else {

228 FixingFromSymbol = false;

229 else {

230

232 "either 'A' or 'B' (or a symbol in one "

233 "of their alt-entry groups)");

234 }

235 }

236

237 if (FixingFromSymbol) {

238 TargetSymbol = ToSymbol;

240 Addend = FixupValue + (FixupAddress - FromSymbol->getAddress());

241

242 } else {

243 TargetSymbol = &*FromSymbol;

244 DeltaKind =

246 Addend = FixupValue - (FixupAddress - ToSymbol->getAddress());

247 }

248

249 return PairRelocInfo(DeltaKind, TargetSymbol, Addend);

250 }

251

252 Error addRelocations() override {

255

257

258 for (auto &S : Obj.sections()) {

259

261

262

263 if (S.isVirtual()) {

264 if (!S.relocations().empty())

266 "relocations");

267 continue;

268 }

269

270 auto NSec =

271 findSectionByIndex(Obj.getSectionIndex(S.getRawDataRefImpl()));

272 if (!NSec)

273 return NSec.takeError();

274

275

276

277 {

278 if (!NSec->GraphSection) {

280 dbgs() << " Skipping relocations for MachO section "

281 << NSec->SegName << "/" << NSec->SectName

282 << " which has no associated graph section\n";

283 });

284 continue;

285 }

286 }

287

288 for (auto RelItr = S.relocation_begin(), RelEnd = S.relocation_end();

289 RelItr != RelEnd; ++RelItr) {

290

292

293

294 auto MachORelocKind = getRelocationKind(RI);

295 if (!MachORelocKind)

296 return MachORelocKind.takeError();

297

298

302 dbgs() << " " << NSec->SectName << " + "

304 });

305

306

307 Block *BlockToFix = nullptr;

308 {

309 auto SymbolToFixOrErr = findSymbolByAddress(*NSec, FixupAddress);

310 if (!SymbolToFixOrErr)

311 return SymbolToFixOrErr.takeError();

312 BlockToFix = &SymbolToFixOrErr->getBlock();

313 }

314

316 BlockToFix->getAddress() + BlockToFix->getContent().size())

318 "Relocation content extends past end of fixup block");

319

320 Edge::Kind Kind = Edge::Invalid;

321

322

323 const char *FixupContent = BlockToFix->getContent().data() +

324 (FixupAddress - BlockToFix->getAddress());

325

326

327 Symbol *TargetSymbol = nullptr;

329

330 if (*MachORelocKind == MachOPairedAddend) {

331

332

333

335

336 ++RelItr;

337 if (RelItr == RelEnd)

339 formatv("{0:x16}", FixupAddress));

340 RI = getRelocationInfo(RelItr);

341

342 MachORelocKind = getRelocationKind(RI);

343 if (!MachORelocKind)

344 return MachORelocKind.takeError();

345

346 if (*MachORelocKind != MachOBranch26 &&

347 *MachORelocKind != MachOPage21 &&

348 *MachORelocKind != MachOPageOffset12)

350 "Invalid relocation pair: Addend + " +

351 StringRef(getMachOARM64RelocationKindName(*MachORelocKind)));

352

354 dbgs() << " Addend: value = " << formatv("{0:x6}", Addend)

355 << ", pair is "

356 << getMachOARM64RelocationKindName(*MachORelocKind) << "\n";

357 });

358

359

362 if (PairedFixupAddress != FixupAddress)

364 "different target");

365 }

366

367 switch (*MachORelocKind) {

368 case MachOBranch26: {

369 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

370 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

371 else

372 return TargetSymbolOrErr.takeError();

373 uint32_t Instr = *(const ulittle32_t *)FixupContent;

374 if ((Instr & 0x7fffffff) != 0x14000000)

376 "instruction with a zero addend");

378 break;

379 }

380 case MachOPointer32:

381 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

382 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

383 else

384 return TargetSymbolOrErr.takeError();

385 Addend = *(const ulittle32_t *)FixupContent;

387 break;

388 case MachOPointer64:

389 case MachOPointer64Authenticated:

390 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

391 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

392 else

393 return TargetSymbolOrErr.takeError();

394 Addend = *(const ulittle64_t *)FixupContent;

395 Kind = *MachORelocKind == MachOPointer64

398 break;

399 case MachOPointer64Anon: {

400 orc::ExecutorAddr TargetAddress(*(const ulittle64_t *)FixupContent);

401 auto TargetNSec = findSectionByIndex(RI.r_symbolnum - 1);

402 if (!TargetNSec)

403 return TargetNSec.takeError();

404 if (auto TargetSymbolOrErr =

405 findSymbolByAddress(*TargetNSec, TargetAddress))

406 TargetSymbol = &*TargetSymbolOrErr;

407 else

408 return TargetSymbolOrErr.takeError();

409 Addend = TargetAddress - TargetSymbol->getAddress();

411 break;

412 }

413 case MachOPage21:

414 case MachOGOTPage21:

415 case MachOTLVPage21: {

416 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

417 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

418 else

419 return TargetSymbolOrErr.takeError();

420 uint32_t Instr = *(const ulittle32_t *)FixupContent;

421 if ((Instr & 0xffffffe0) != 0x90000000)

423 "ADRP instruction with a zero "

424 "addend");

425

426 if (*MachORelocKind == MachOPage21) {

428 } else if (*MachORelocKind == MachOGOTPage21) {

430 } else if (*MachORelocKind == MachOTLVPage21) {

432 }

433 break;

434 }

435 case MachOPageOffset12: {

436 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

437 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

438 else

439 return TargetSymbolOrErr.takeError();

440 uint32_t Instr = *(const ulittle32_t *)FixupContent;

441 uint32_t EncodedAddend = (Instr & 0x003FFC00) >> 10;

442 if (EncodedAddend != 0)

444 "encoded addend");

446 break;

447 }

448 case MachOGOTPageOffset12:

449 case MachOTLVPageOffset12: {

450 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

451 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

452 else

453 return TargetSymbolOrErr.takeError();

454 uint32_t Instr = *(const ulittle32_t *)FixupContent;

455 if ((Instr & 0xfffffc00) != 0xf9400000)

457 "immediate instruction with a zero "

458 "addend");

459

460 if (*MachORelocKind == MachOGOTPageOffset12) {

462 } else if (*MachORelocKind == MachOTLVPageOffset12) {

464 }

465 break;

466 }

467 case MachOPointerToGOT:

468 if (auto TargetSymbolOrErr = findSymbolByIndex(RI.r_symbolnum))

469 TargetSymbol = TargetSymbolOrErr->GraphSymbol;

470 else

471 return TargetSymbolOrErr.takeError();

472

474 break;

475 case MachODelta32:

476 case MachODelta64: {

477

478

479

480

481

482 auto PairInfo =

483 parsePairRelocation(*BlockToFix, *MachORelocKind, RI,

484 FixupAddress, FixupContent, ++RelItr, RelEnd);

485 if (!PairInfo)

486 return PairInfo.takeError();

487 std::tie(Kind, TargetSymbol, Addend) = *PairInfo;

488 assert(TargetSymbol && "No target symbol from parsePairRelocation?");

489 break;

490 }

491 default:

492 llvm_unreachable("Special relocation kind should not appear in "

493 "mach-o file");

494 }

495

497 dbgs() << " ";

498 Edge GE(Kind, FixupAddress - BlockToFix->getAddress(), *TargetSymbol,

499 Addend);

501 dbgs() << "\n";

502 });

503 BlockToFix->addEdge(Kind, FixupAddress - BlockToFix->getAddress(),

504 *TargetSymbol, Addend);

505 }

506 }

508 }

509

510

511 const char *getMachOARM64RelocationKindName(Edge::Kind R) {

512 switch (R) {

513 case MachOBranch26:

514 return "MachOBranch26";

515 case MachOPointer64:

516 return "MachOPointer64";

517 case MachOPointer64Anon:

518 return "MachOPointer64Anon";

519 case MachOPointer64Authenticated:

520 return "MachOPointer64Authenticated";

521 case MachOPage21:

522 return "MachOPage21";

523 case MachOPageOffset12:

524 return "MachOPageOffset12";

525 case MachOGOTPage21:

526 return "MachOGOTPage21";

527 case MachOGOTPageOffset12:

528 return "MachOGOTPageOffset12";

529 case MachOTLVPage21:

530 return "MachOTLVPage21";

531 case MachOTLVPageOffset12:

532 return "MachOTLVPageOffset12";

533 case MachOPointerToGOT:

534 return "MachOPointerToGOT";

535 case MachOPairedAddend:

536 return "MachOPairedAddend";

537 case MachOLDRLiteral19:

538 return "MachOLDRLiteral19";

539 case MachODelta32:

540 return "MachODelta32";

541 case MachODelta64:

542 return "MachODelta64";

543 case MachONegDelta32:

544 return "MachONegDelta32";

545 case MachONegDelta64:

546 return "MachONegDelta64";

547 default:

549 }

550 }

551

552 unsigned NumSymbols = 0;

553};

554

555}

556

557namespace llvm {

559

568

571

572public:

574 std::unique_ptr G,

577

578private:

581 }

582

584};

585

587 MemoryBufferRef ObjectBuffer, std::shared_ptrorc::SymbolStringPool SSP) {

589 if (!MachOObj)

590 return MachOObj.takeError();

591

592 auto Features = (*MachOObj)->getFeatures();

593 if (!Features)

594 return Features.takeError();

595

596 return MachOLinkGraphBuilder_arm64(**MachOObj, std::move(SSP),

597 std::move(*Features))

598 .buildGraph();

599}

600

602 assert(G.getTargetTriple().isArm64e() && "PAC signing only valid for arm64e");

603

604 if (auto *ModInitSec = G.findSectionByName("__DATA,__mod_init_func")) {

605 for (auto *B : ModInitSec->blocks()) {

606 for (auto &E : B->edges()) {

608

609

610 if (E.getAddend() >> 32)

612 "In " + G.getName() + ", __mod_init_func pointer at " +

613 formatv("{0:x}", B->getFixupAddress(E).getValue()) +

614 " has data in high bits of addend (addend >= 2^32)");

615

616

617

618 Edge::AddendT SigningBits = 0x1ULL << 63;

620 E.setAddend(E.getAddend() | SigningBits);

621 }

622 }

623 }

624 }

625

627}

628

631 8> {

632

633

634

635

637

640

642

644 constexpr uint32_t DWARFMode = 0x03000000;

646 }

647

649};

650

652 std::unique_ptr Ctx) {

653

655

656 if (Ctx->shouldAddDefaultTargetPasses(G->getTargetTriple())) {

657

658 if (auto MarkLive = Ctx->getMarkLivePass(G->getTargetTriple()))

659 Config.PrePrunePasses.push_back(std::move(MarkLive));

660 else

662

663

666

667

668 auto CompactUnwindMgr =

669 std::make_shared<CompactUnwindManager<CompactUnwindTraits_MachO_arm64>>(

672

673

675 return CompactUnwindMgr->prepareForPrune(G);

676 });

677

678

682

683

685

686

687 if (G->getTargetTriple().isArm64e()) {

693 }

694

695

697 return CompactUnwindMgr->processAndReserveUnwindInfo(G);

698 });

699

700

702 return CompactUnwindMgr->writeUnwindInfo(G);

703 });

704 }

705

706 if (auto Err = Ctx->modifyPassConfig(*G, Config))

707 return Ctx->notifyFailed(std::move(Err));

708

709

711}

712

716

722}

723

724}

725}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

static Error getObject(const T *&Obj, MemoryBufferRef M, const void *Ptr, const uint64_t Size=sizeof(T))

#define LLVM_UNLIKELY(EXPR)

Lightweight error class with error context and mandatory checking.

static ErrorSuccess success()

Create a success value.

Tagged union holding either a T or a Error.

StringRef - Represent a constant reference to a string, i.e.

Manages the enabling and disabling of subtarget specific features.

Triple - Helper class for working with autoconf configuration names.

An Addressable with content and edges.

A LinkGraph pass that splits blocks in a section that follows the DWARF Record format into sub-blocks...

A LinkGraph pass that adds missing FDE-to-CIE, FDE-to-PC and FDE-to-LSDA edges.

Represents fixups and constraints in the LinkGraph.

static void link(ArgTs &&... Args)

MachOJITLinker_arm64(std::unique_ptr< JITLinkContext > Ctx, std::unique_ptr< LinkGraph > G, PassConfiguration PassConfig)

Definition MachO_arm64.cpp:573

Addressable & getAddressable()

Return the addressable that this symbol points to.

orc::ExecutorAddr getAddress() const

Returns the address of this symbol.

Global Offset Table Builder.

Procedure Linkage Table Builder.

static Expected< std::unique_ptr< MachOObjectFile > > createMachOObjectFile(MemoryBufferRef Object, uint32_t UniversalCputype=0, uint32_t UniversalIndex=0, size_t MachOFilesetEntryOffset=0)

Create a MachOObjectFile instance from a given buffer.

Represents an address in the executor process.

uint64_t getValue() const

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

@ ARM64_RELOC_POINTER_TO_GOT

@ ARM64_RELOC_AUTHENTICATED_POINTER

@ ARM64_RELOC_GOT_LOAD_PAGE21

@ ARM64_RELOC_TLVP_LOAD_PAGEOFF12

@ ARM64_RELOC_GOT_LOAD_PAGEOFF12

@ ARM64_RELOC_TLVP_LOAD_PAGE21

constexpr uint64_t PointerSize

aarch64 pointer size.

Error applyFixup(LinkGraph &G, Block &B, const Edge &E, const Symbol *GOTSymbol)

Apply fixup expression for edge to block content.

LLVM_ABI Error createEmptyPointerSigningFunction(LinkGraph &G)

Creates a pointer signing function section, block, and symbol to reserve space for a signing function...

LLVM_ABI Error lowerPointer64AuthEdgesToSigningFunction(LinkGraph &G)

Given a LinkGraph containing Pointer64Authenticated edges, transform those edges to Pointer64 and add...

LLVM_ABI const char * getEdgeKindName(Edge::Kind K)

Returns a string name for the given aarch64 edge.

@ Pointer64Authenticated

An arm64e authenticated pointer relocation.

@ RequestTLVPAndTransformToPageOffset12

A TLVP entry getter/constructor, transformed to PageOffset12.

@ Page21

The signed 21-bit delta from the fixup page to the page containing the target.

@ Branch26PCRel

A 26-bit PC-relative branch.

@ Pointer64

A plain 64-bit pointer value relocation.

@ Pointer32

A plain 32-bit pointer value relocation.

@ RequestTLVPAndTransformToPage21

A TLVP entry getter/constructor, transformed to Page21.

@ RequestGOTAndTransformToPage21

A GOT entry getter/constructor, transformed to Page21 pointing at the GOT entry for the original targ...

@ RequestGOTAndTransformToPageOffset12

A GOT entry getter/constructor, transformed to Pageoffset12 pointing at the GOT entry for the origina...

@ NegDelta32

A 32-bit negative delta.

@ NegDelta64

A 64-bit negative delta.

@ RequestGOTAndTransformToDelta32

A GOT entry getter/constructor, transformed to Delta32 pointing at the GOT entry for the original tar...

@ PageOffset12

The 12-bit (potentially shifted) offset of the target within its page.

unique_function< Error(LinkGraph &)> LinkGraphPassFunction

A function for mutating LinkGraphs.

LLVM_ABI const char * getGenericEdgeKindName(Edge::Kind K)

Returns the string name of the given generic edge kind, or "unknown" otherwise.

LLVM_ABI void link_MachO_arm64(std::unique_ptr< LinkGraph > G, std::unique_ptr< JITLinkContext > Ctx)

jit-link the given object buffer, which must be a MachO arm64 object file.

Definition MachO_arm64.cpp:651

LLVM_ABI LinkGraphPassFunction createEHFrameEdgeFixerPass_MachO_arm64()

Returns a pass suitable for fixing missing edges in an __eh_frame section in a MachO/x86-64 object.

Definition MachO_arm64.cpp:717

LLVM_ABI LinkGraphPassFunction createEHFrameSplitterPass_MachO_arm64()

Returns a pass suitable for splitting __eh_frame sections in MachO/x86-64 objects.

Definition MachO_arm64.cpp:713

void visitExistingEdges(LinkGraph &G, VisitorTs &&...Vs)

For each edge in the given graph, apply a list of visitors to the edge, stopping when the first visit...

LLVM_ABI Error markAllSymbolsLive(LinkGraph &G)

Marks all symbols in a graph live.

Error buildTables_MachO_arm64(LinkGraph &G)

Definition MachO_arm64.cpp:560

LLVM_ABI void printEdge(raw_ostream &OS, const Block &B, const Edge &E, StringRef EdgeKindName)

LLVM_ABI Expected< std::unique_ptr< LinkGraph > > createLinkGraphFromMachOObject_arm64(MemoryBufferRef ObjectBuffer, std::shared_ptr< orc::SymbolStringPool > SSP)

Create a LinkGraph from a MachO/arm64 relocatable object.

Definition MachO_arm64.cpp:586

DefineExternalSectionStartAndEndSymbols< SymbolIdentifierFunction > createDefineExternalSectionStartAndEndSymbolsPass(SymbolIdentifierFunction &&F)

Returns a JITLink pass (as a function class) that uses the given symbol identification function to id...

SectionRangeSymbolDesc identifyMachOSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym)

MachO section start/end symbol detection.

static Error applyPACSigningToModInitPointers(LinkGraph &G)

Definition MachO_arm64.cpp:601

content_iterator< RelocationRef > relocation_iterator

LLVM_ABI StringRef MachOEHFrameSectionName

uint64_t ExecutorAddrDiff

LLVM_ABI StringRef MachOCompactUnwindSectionName

LLVM_ABI StringRef MachOUnwindInfoSectionName

detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, unaligned > ulittle32_t

This is an optimization pass for GlobalISel generic memory operations.

auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)

LLVM_ABI raw_ostream & dbgs()

dbgs() - This returns a reference to a raw_ostream for debugging messages.

Error make_error(ArgTs &&... Args)

Make a Error instance representing failure using the given error info type.

OutputIt move(R &&Range, OutputIt Out)

Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.

constexpr int64_t SignExtend64(uint64_t x)

Sign-extend the number in the bottom B bits of X to a 64-bit integer.

Implement std::hash so that hash_code can be used in STL containers.

Definition MachO_arm64.cpp:631

static bool encodingSpecifiesDWARF(uint32_t Encoding)

Definition MachO_arm64.cpp:643

static bool encodingCannotBeMerged(uint32_t Encoding)

Definition MachO_arm64.cpp:648

static constexpr uint32_t EncodingModeMask

Definition MachO_arm64.cpp:638

static constexpr uint32_t DWARFSectionOffsetMask

Definition MachO_arm64.cpp:639

static constexpr endianness Endianness

Definition MachO_arm64.cpp:636

aarch64::GOTTableManager GOTManager

Definition MachO_arm64.cpp:641

CRTP base for compact unwind traits classes.

An LinkGraph pass configuration, consisting of a list of pre-prune, post-prune, and post-fixup passes...

LinkGraphPassList PostAllocationPasses

Post-allocation passes.

LinkGraphPassList PreFixupPasses

Pre-fixup passes.

LinkGraphPassList PostPrunePasses

Post-prune passes.

LinkGraphPassList PrePrunePasses

Pre-prune passes.