LLVM: lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

27using namespace llvm;

28

29namespace {

30

31class AArch64AsmBackend : public MCAsmBackend {

32protected:

33 Triple TheTriple;

34

35public:

36 AArch64AsmBackend(const Target &T, const Triple &TT, bool IsLittleEndian)

39 TheTriple(TT) {}

40

41

42 std::optional getFixupKind(StringRef Name) const override;

43

44 MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const override {

46

47

48

49

50 {"fixup_aarch64_pcrel_adr_imm21", 0, 32, 0},

51 {"fixup_aarch64_pcrel_adrp_imm21", 0, 32, 0},

52 {"fixup_aarch64_add_imm12", 10, 12, 0},

53 {"fixup_aarch64_ldst_imm12_scale1", 10, 12, 0},

54 {"fixup_aarch64_ldst_imm12_scale2", 10, 12, 0},

55 {"fixup_aarch64_ldst_imm12_scale4", 10, 12, 0},

56 {"fixup_aarch64_ldst_imm12_scale8", 10, 12, 0},

57 {"fixup_aarch64_ldst_imm12_scale16", 10, 12, 0},

58 {"fixup_aarch64_ldr_pcrel_imm19", 5, 19, 0},

59 {"fixup_aarch64_movw", 5, 16, 0},

60 {"fixup_aarch64_pcrel_branch9", 5, 9, 0},

61 {"fixup_aarch64_pcrel_branch14", 5, 14, 0},

62 {"fixup_aarch64_pcrel_branch16", 5, 16, 0},

63 {"fixup_aarch64_pcrel_branch19", 5, 19, 0},

64 {"fixup_aarch64_pcrel_branch26", 0, 26, 0},

65 {"fixup_aarch64_pcrel_call26", 0, 26, 0}};

66

67

68

70 return {};

71

74

77 "Invalid kind!");

79 }

80

81 void applyFixup(const MCFragment &, const MCFixup &, const MCValue &Target,

82 uint8_t *Data, uint64_t Value, bool IsResolved) override;

83

84 bool fixupNeedsRelaxation(const MCFixup &Fixup,

85 uint64_t Value) const override;

86 bool writeNopData(raw_ostream &OS, uint64_t Count,

87 const MCSubtargetInfo *STI) const override;

88

89 unsigned getFixupKindContainereSizeInBytes(unsigned Kind) const;

90};

91

92}

93

94

96 switch (Kind) {

97 default:

99

101 return 1;

102

105 return 2;

106

119 return 3;

120

127 return 4;

128

130 return 8;

131 }

132}

133

135 unsigned lo2 = Value & 0x3;

136 unsigned hi19 = (Value & 0x1ffffc) >> 2;

137 return (hi19 << 5) | (lo2 << 29);

138}

139

142 const Triple &TheTriple, bool IsResolved) {

143 int64_t SignedValue = static_cast<int64_t>(Value);

144 switch (Fixup.getKind()) {

145 default:

149 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

155 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

157 }

161

163 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

165 Ctx.reportError(Fixup.getLoc(), "fixup not sufficiently aligned");

166

167 return (Value >> 2) & 0x7ffff;

172

174 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

179

181 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

183 Ctx.reportError(Fixup.getLoc(), "fixup must be 2-byte aligned");

184 return Value >> 1;

188

190 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

192 Ctx.reportError(Fixup.getLoc(), "fixup must be 4-byte aligned");

193 return Value >> 2;

197

199 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

201 Ctx.reportError(Fixup.getLoc(), "fixup must be 8-byte aligned");

202 return Value >> 3;

206

208 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

210 Ctx.reportError(Fixup.getLoc(), "fixup must be 16-byte aligned");

211 return Value >> 4;

217 if (!RefKind) {

218

219 if (SignedValue > 0xFFFF || SignedValue < -0xFFFF)

220 Ctx.reportError(Fixup.getLoc(),

221 "fixup value out of range [-0xFFFF, 0xFFFF]");

222

223

224 if (SignedValue < 0)

225 SignedValue = ~SignedValue;

227 } else

228

229

230 Ctx.reportError(Fixup.getLoc(),

231 "relocation for a thread-local variable points to an "

232 "absolute symbol");

234 }

235

236 if (!IsResolved) {

237

238

239 Ctx.reportError(Fixup.getLoc(), "unresolved movw fixup not yet "

240 "implemented");

242 }

243

247 break;

249 SignedValue = SignedValue >> 16;

250 break;

252 SignedValue = SignedValue >> 32;

253 break;

255 SignedValue = SignedValue >> 48;

256 break;

257 default:

258 llvm_unreachable("Variant kind doesn't correspond to fixup");

259 }

260

261 } else {

264 break;

267 break;

270 break;

273 break;

274 default:

275 llvm_unreachable("Variant kind doesn't correspond to fixup");

276 }

277 }

278

282 if (SignedValue > 0xFFFF || SignedValue < -0xFFFF)

283 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

284

285

286 if (SignedValue < 0)

287 SignedValue = ~SignedValue;

289 } else if (Value > 0xFFFF) {

290 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

291 }

293 }

295

297 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

298

299 if (Value & 0b11)

300 Ctx.reportError(Fixup.getLoc(), "fixup not sufficiently aligned");

301 return (Value >> 2) & 0x1ff;

303

305 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

306

308 Ctx.reportError(Fixup.getLoc(), "fixup not sufficiently aligned");

309 return (Value >> 2) & 0x3fff;

311

312 SignedValue = -SignedValue;

314

315 if (SignedValue < 0 || SignedValue > ((1 << 18) - 1))

316 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

317

318 if (Value & 0b11)

319 Ctx.reportError(Fixup.getLoc(), "fixup not sufficiently aligned");

320 return (Value >> 2) & 0xffff;

323 if (TheTriple.isOSBinFormatCOFF() && !IsResolved && SignedValue != 0) {

324

325

326 Ctx.reportError(Fixup.getLoc(),

327 "cannot perform a PC-relative fixup with a non-zero "

328 "symbol offset");

329 }

330

332 Ctx.reportError(Fixup.getLoc(), "fixup value out of range");

333

335 Ctx.reportError(Fixup.getLoc(), "fixup not sufficiently aligned");

336 return (Value >> 2) & 0x3ffffff;

344 }

345}

346

347std::optional

348AArch64AsmBackend::getFixupKind(StringRef Name) const {

350 return std::nullopt;

351

352 unsigned Type = llvm::StringSwitch(Name)

353#define ELF_RELOC(X, Y) .Case(#X, Y)

354#include "llvm/BinaryFormat/ELFRelocs/AArch64.def"

355#undef ELF_RELOC

356 .Case("BFD_RELOC_NONE", ELF::R_AARCH64_NONE)

357 .Case("BFD_RELOC_16", ELF::R_AARCH64_ABS16)

358 .Case("BFD_RELOC_32", ELF::R_AARCH64_ABS32)

359 .Case("BFD_RELOC_64", ELF::R_AARCH64_ABS64)

360 .Default(-1u);

361 if (Type == -1u)

362 return std::nullopt;

364}

365

366

367

368unsigned AArch64AsmBackend::getFixupKindContainereSizeInBytes(unsigned Kind) const {

370 return 0;

371

372 switch (Kind) {

373 default:

375

377 return 1;

379 return 2;

381 return 4;

383 return 8;

384

401

402 return 0;

403 }

404}

405

407

408

409

410

411

412

413

414

415

416

417

418

420}

421

422void AArch64AsmBackend::applyFixup(const MCFragment &F, const MCFixup &Fixup,

423 const MCValue &Target, uint8_t *Data,

424 uint64_t Value, bool IsResolved) {

426 IsResolved = false;

427 maybeAddReloc(F, Fixup, Target, Value, IsResolved);

430 return;

431

437 if (!Expr) {

439 "expected relocatable expression");

440 return;

441 }

443 Value = (uint64_t(Expr->getDiscriminator()) << 32) |

444 (uint64_t(Expr->getKey()) << 60) |

445 (uint64_t(Expr->hasAddressDiversity()) << 63);

446 }

447 }

448

450 return;

452 MCFixupKindInfo Info = getFixupKindInfo(Fixup.getKind());

454 int64_t SignedValue = static_cast<int64_t>(Value);

455

457

458

460

461 assert(Fixup.getOffset() + NumBytes <= F.getSize() &&

462 "Invalid fixup offset!");

463

464

465 unsigned FulleSizeInBytes = getFixupKindContainereSizeInBytes(Fixup.getKind());

466

467

468

469 if (FulleSizeInBytes == 0) {

470

471 for (unsigned i = 0; i != NumBytes; ++i) {

472 Data[i] |= uint8_t((Value >> (i * 8)) & 0xff);

473 }

474 } else {

475

476 assert(Fixup.getOffset() + FulleSizeInBytes <= F.getSize() &&

477 "Invalid fixup size!");

478 assert(NumBytes <= FulleSizeInBytes && "Invalid fixup size!");

479 for (unsigned i = 0; i != NumBytes; ++i) {

480 unsigned Idx = FulleSizeInBytes - 1 - i;

481 Data[Idx] |= uint8_t((Value >> (i * 8)) & 0xff);

482 }

483 }

484

485

486

491

492

493 if (SignedValue < 0)

494 Data[3] &= ~(1 << 6);

495 else

496 Data[3] |= (1 << 6);

497 }

498}

499

500bool AArch64AsmBackend::fixupNeedsRelaxation(const MCFixup &Fixup,

501 uint64_t Value) const {

502

503

504

505

506 return int64_t(Value) != int64_t(int8_t(Value));

507}

508

509bool AArch64AsmBackend::writeNopData(raw_ostream &OS, uint64_t Count,

510 const MCSubtargetInfo *STI) const {

511

512

513

515

516

518 for (uint64_t i = 0; i != Count; ++i)

519 OS.write("\x1f\x20\x03\xd5", 4);

520 return true;

521}

522

523namespace {

524

526

527

529

530

531 UNWIND_ARM64_MODE_FRAMELESS = 0x02000000,

532

533

534

535

536

537

538 UNWIND_ARM64_MODE_DWARF = 0x03000000,

539

540

541

542

543

544

545

546 UNWIND_ARM64_MODE_FRAME = 0x04000000,

547

548

549 UNWIND_ARM64_FRAME_X19_X20_PAIR = 0x00000001,

550 UNWIND_ARM64_FRAME_X21_X22_PAIR = 0x00000002,

551 UNWIND_ARM64_FRAME_X23_X24_PAIR = 0x00000004,

552 UNWIND_ARM64_FRAME_X25_X26_PAIR = 0x00000008,

553 UNWIND_ARM64_FRAME_X27_X28_PAIR = 0x00000010,

554 UNWIND_ARM64_FRAME_D8_D9_PAIR = 0x00000100,

555 UNWIND_ARM64_FRAME_D10_D11_PAIR = 0x00000200,

556 UNWIND_ARM64_FRAME_D12_D13_PAIR = 0x00000400,

557 UNWIND_ARM64_FRAME_D14_D15_PAIR = 0x00000800

558};

559

560}

561

562

563class DarwinAArch64AsmBackend : public AArch64AsmBackend {

565

566

567

568

570 return (StackSize / 16) << 12;

571 }

572

573public:

574 DarwinAArch64AsmBackend(const Target &T, const Triple &TT,

575 const MCRegisterInfo &MRI)

576 : AArch64AsmBackend(T, TT, true), MRI(MRI) {}

577

578 std::unique_ptr

579 createObjectTargetWriter() const override {

584 }

585

586

587 uint64_t generateCompactUnwindEncoding(const MCDwarfFrameInfo *FI,

588 const MCContext *Ctxt) const override {

589

590

592 return CU::UNWIND_ARM64_MODE_DWARF;

593

595 if (Instrs.empty())

596 return CU::UNWIND_ARM64_MODE_FRAMELESS;

597 if (!isDarwinCanonicalPersonality(FI->Personality) &&

599 return CU::UNWIND_ARM64_MODE_DWARF;

600

601 bool HasFP = false;

602 uint64_t StackSize = 0;

603

604 uint64_t CompactUnwindEncoding = 0;

605 int64_t CurOffset = 0;

606 for (size_t i = 0, e = Instrs.size(); i != e; ++i) {

607 const MCCFIInstruction &Inst = Instrs[i];

608

610 default:

611

612 return CU::UNWIND_ARM64_MODE_DWARF;

614

615 MCRegister XReg =

617

618

619

620

621

622 if (XReg != AArch64::FP)

623 return CU::UNWIND_ARM64_MODE_DWARF;

624

625 if (i + 2 >= e)

626 return CU::UNWIND_ARM64_MODE_DWARF;

627

628 const MCCFIInstruction &LRPush = Instrs[++i];

630 return CU::UNWIND_ARM64_MODE_DWARF;

631 const MCCFIInstruction &FPPush = Instrs[++i];

633 return CU::UNWIND_ARM64_MODE_DWARF;

634

636 return CU::UNWIND_ARM64_MODE_DWARF;

638

639 MCRegister LRReg = *MRI.getLLVMRegNum(LRPush.getRegister(), true);

641

644

645 if (LRReg != AArch64::LR || FPReg != AArch64::FP)

646 return CU::UNWIND_ARM64_MODE_DWARF;

647

648

649 CompactUnwindEncoding |= CU::UNWIND_ARM64_MODE_FRAME;

651 break;

652 }

654 if (StackSize != 0)

655 return CU::UNWIND_ARM64_MODE_DWARF;

656 StackSize = std::abs(Inst.getOffset());

657 break;

658 }

660

661

662 MCRegister Reg1 = *MRI.getLLVMRegNum(Inst.getRegister(), true);

663 if (i + 1 == e)

664 return CU::UNWIND_ARM64_MODE_DWARF;

665

666 if (CurOffset != 0 && Inst.getOffset() != CurOffset - 8)

667 return CU::UNWIND_ARM64_MODE_DWARF;

669

670 const MCCFIInstruction &Inst2 = Instrs[++i];

672 return CU::UNWIND_ARM64_MODE_DWARF;

673 MCRegister Reg2 = *MRI.getLLVMRegNum(Inst2.getRegister(), true);

674

675 if (Inst2.getOffset() != CurOffset - 8)

676 return CU::UNWIND_ARM64_MODE_DWARF;

678

679

680

681

682

683

684

685

686

689

690 if (Reg1 == AArch64::X19 && Reg2 == AArch64::X20 &&

691 (CompactUnwindEncoding & 0xF1E) == 0)

692 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X19_X20_PAIR;

693 else if (Reg1 == AArch64::X21 && Reg2 == AArch64::X22 &&

694 (CompactUnwindEncoding & 0xF1C) == 0)

695 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X21_X22_PAIR;

696 else if (Reg1 == AArch64::X23 && Reg2 == AArch64::X24 &&

697 (CompactUnwindEncoding & 0xF18) == 0)

698 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X23_X24_PAIR;

699 else if (Reg1 == AArch64::X25 && Reg2 == AArch64::X26 &&

700 (CompactUnwindEncoding & 0xF10) == 0)

701 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X25_X26_PAIR;

702 else if (Reg1 == AArch64::X27 && Reg2 == AArch64::X28 &&

703 (CompactUnwindEncoding & 0xF00) == 0)

704 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_X27_X28_PAIR;

705 else {

708

709

710

711

712

713 if (Reg1 == AArch64::D8 && Reg2 == AArch64::D9 &&

714 (CompactUnwindEncoding & 0xE00) == 0)

715 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D8_D9_PAIR;

716 else if (Reg1 == AArch64::D10 && Reg2 == AArch64::D11 &&

717 (CompactUnwindEncoding & 0xC00) == 0)

718 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D10_D11_PAIR;

719 else if (Reg1 == AArch64::D12 && Reg2 == AArch64::D13 &&

720 (CompactUnwindEncoding & 0x800) == 0)

721 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D12_D13_PAIR;

722 else if (Reg1 == AArch64::D14 && Reg2 == AArch64::D15)

723 CompactUnwindEncoding |= CU::UNWIND_ARM64_FRAME_D14_D15_PAIR;

724 else

725

726 return CU::UNWIND_ARM64_MODE_DWARF;

727 }

728

729 break;

730 }

731 }

732 }

733

734 if (!HasFP) {

735

736

737 if (StackSize > 65520)

738 return CU::UNWIND_ARM64_MODE_DWARF;

739

740 CompactUnwindEncoding |= CU::UNWIND_ARM64_MODE_FRAMELESS;

741 CompactUnwindEncoding |= encodeStackAdjustment(StackSize);

742 }

743

744 return CompactUnwindEncoding;

745 }

746};

747

748}

749

750namespace {

751

752class ELFAArch64AsmBackend : public AArch64AsmBackend {

753public:

754 uint8_t OSABI;

755 bool IsILP32;

756

757 ELFAArch64AsmBackend(const Target &T, const Triple &TT, uint8_t OSABI,

758 bool IsLittleEndian, bool IsILP32)

759 : AArch64AsmBackend(T, TT, IsLittleEndian), OSABI(OSABI),

760 IsILP32(IsILP32) {}

761

762 std::unique_ptr

763 createObjectTargetWriter() const override {

765 }

766};

767

768}

769

770namespace {

771class COFFAArch64AsmBackend : public AArch64AsmBackend {

772public:

773 COFFAArch64AsmBackend(const Target &T, const Triple &TheTriple)

774 : AArch64AsmBackend(T, TheTriple, true) {}

775

776 std::unique_ptr

777 createObjectTargetWriter() const override {

779 }

780};

781}

782

789 return new DarwinAArch64AsmBackend(T, TheTriple, MRI);

790 }

791

793 return new COFFAArch64AsmBackend(T, TheTriple);

794

796

799 return new ELFAArch64AsmBackend(T, TheTriple, OSABI, true,

800 IsILP32);

801}

802

809 "Big endian is only supported for ELF targets!");

812 return new ELFAArch64AsmBackend(T, TheTriple, OSABI, false,

813 IsILP32);

814}

unsigned const MachineRegisterInfo * MRI

static unsigned AdrImmBits(unsigned Value)

Definition AArch64AsmBackend.cpp:134

static unsigned getFixupKindNumBytes(unsigned Kind)

The number of bytes the fixup may change.

Definition AArch64AsmBackend.cpp:95

static uint64_t adjustFixupValue(const MCFixup &Fixup, const MCValue &Target, uint64_t Value, MCContext &Ctx, const Triple &TheTriple, bool IsResolved)

Definition AArch64AsmBackend.cpp:140

static bool shouldForceRelocation(const MCFixup &Fixup)

Definition AArch64AsmBackend.cpp:406

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

Analysis containing CSE Info

PowerPC TLS Dynamic Call Fixup

static constexpr MCPhysReg FPReg

size_t size() const

size - Get the array size.

bool empty() const

empty - Check if the array is empty.

Generic interface to target specific assembler backends.

virtual MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const

Get information on a fixup kind.

unsigned getRegister() const

OpType getOperation() const

int64_t getOffset() const

Context object for machine code objects.

LLVM_ABI bool emitCompactUnwindNonCanonical() const

Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...

MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...

Generic base class for all target subtargets.

const Triple & getTargetTriple() const

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

Target - Wrapper for Target specific information.

Triple - Helper class for working with autoconf configuration names.

bool isOSBinFormatMachO() const

Tests whether the environment is MachO.

OSType getOS() const

Get the parsed operating system type of this triple.

bool isOSBinFormatCOFF() const

Tests whether the OS uses the COFF binary format.

EnvironmentType getEnvironment() const

Get the parsed environment type of this triple.

LLVM_ABI bool isArch32Bit() const

Test whether the architecture is 32-bit.

bool isOSBinFormatELF() const

Tests whether the OS uses the ELF binary format.

LLVM Value Representation.

raw_ostream & write_zeros(unsigned NumZeros)

write_zeros - Insert 'NumZeros' nulls.

raw_ostream & write(unsigned char C)

#define llvm_unreachable(msg)

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

CompactUnwindEncodings

Compact unwind encoding values.

Specifier getSymbolLoc(Specifier S)

@ fixup_aarch64_pcrel_branch9

@ fixup_aarch64_pcrel_branch16

@ fixup_aarch64_ldst_imm12_scale4

@ fixup_aarch64_pcrel_call26

@ fixup_aarch64_pcrel_branch26

@ fixup_aarch64_pcrel_branch19

@ fixup_aarch64_ldr_pcrel_imm19

@ fixup_aarch64_pcrel_adr_imm21

@ fixup_aarch64_pcrel_branch14

@ fixup_aarch64_ldst_imm12_scale2

@ fixup_aarch64_ldst_imm12_scale16

@ fixup_aarch64_pcrel_adrp_imm21

@ fixup_aarch64_add_imm12

@ fixup_aarch64_ldst_imm12_scale8

@ fixup_aarch64_ldst_imm12_scale1

Specifier getAddressFrag(Specifier S)

LLVM_ABI Expected< uint32_t > getCPUSubType(const Triple &T)

LLVM_ABI Expected< uint32_t > getCPUType(const Triple &T)

VE::Fixups getFixupKind(uint8_t S)

Error applyFixup(LinkGraph &G, Block &B, const Edge &E, const ArmConfig &ArmCfg)

Apply fixup expression for edge to block content.

bool isRelocation(MCFixupKind FixupKind)

Context & getContext() const

This is an optimization pass for GlobalISel generic memory operations.

FunctionAddr VTableAddr Value

constexpr bool isInt(int64_t x)

Checks if an integer fits into the given bit width.

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

std::unique_ptr< MCObjectTargetWriter > createAArch64WinCOFFObjectWriter(const Triple &TheTriple)

uint16_t MCFixupKind

Extensible enumeration to represent the type of a fixup.

MCAsmBackend * createAArch64leAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)

Definition AArch64AsmBackend.cpp:783

FunctionAddr VTableAddr Count

constexpr bool isUInt(uint64_t x)

Checks if an unsigned integer fits into the given bit width.

@ FK_SecRel_2

A two-byte section relative fixup.

@ FirstLiteralRelocationKind

@ FK_Data_8

A eight-byte fixup.

@ FK_Data_1

A one-byte fixup.

@ FK_Data_4

A four-byte fixup.

@ FK_SecRel_4

A four-byte section relative fixup.

@ FK_Data_2

A two-byte fixup.

void cantFail(Error Err, const char *Msg=nullptr)

Report a fatal error if Err is a failure value.

FunctionAddr VTableAddr uintptr_t uintptr_t Data

static MCRegister getXRegFromWReg(MCRegister Reg)

ArrayRef(const T &OneElt) -> ArrayRef< T >

std::unique_ptr< MCObjectTargetWriter > createAArch64MachObjectWriter(uint32_t CPUType, uint32_t CPUSubtype, bool IsILP32)

MCAsmBackend * createAArch64beAsmBackend(const Target &T, const MCSubtargetInfo &STI, const MCRegisterInfo &MRI, const MCTargetOptions &Options)

Definition AArch64AsmBackend.cpp:803

static MCRegister getDRegFromBReg(MCRegister Reg)

std::unique_ptr< MCObjectTargetWriter > createAArch64ELFObjectWriter(uint8_t OSABI, bool IsILP32)

const MCSymbol * Personality

std::vector< MCCFIInstruction > Instructions