LLVM: lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

33

34using namespace llvm;

35

36#define GET_REGINFO_MC_DESC

37#include "ARMGenRegisterInfo.inc"

38

40 std::string &Info) {

41 if (STI.hasFeature(llvm::ARM::HasV7Ops) &&

42 (MI.getOperand(0).isImm() && MI.getOperand(0).getImm() == 15) &&

43 (MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 0) &&

44

45

46 (MI.getOperand(3).isImm() && MI.getOperand(3).getImm() == 7)) {

47 if ((MI.getOperand(5).isImm() && MI.getOperand(5).getImm() == 4)) {

48 if (MI.getOperand(4).isImm() && MI.getOperand(4).getImm() == 5) {

49 Info = "deprecated since v7, use 'isb'";

50 return true;

51 }

52

53

54

55 if (MI.getOperand(4).isImm() && MI.getOperand(4).getImm() == 10) {

56 Info = "deprecated since v7, use 'dsb'";

57 return true;

58 }

59 }

60

61

62 if (MI.getOperand(4).isImm() && MI.getOperand(4).getImm() == 10 &&

63 (MI.getOperand(5).isImm() && MI.getOperand(5).getImm() == 5)) {

64 Info = "deprecated since v7, use 'dmb'";

65 return true;

66 }

67 }

68 if (STI.hasFeature(llvm::ARM::HasV7Ops) &&

69 ((MI.getOperand(0).isImm() && MI.getOperand(0).getImm() == 10) ||

70 (MI.getOperand(0).isImm() && MI.getOperand(0).getImm() == 11))) {

71 Info = "since v7, cp10 and cp11 are reserved for advanced SIMD or floating "

72 "point instructions";

73 return true;

74 }

75 return false;

76}

77

79 std::string &Info) {

80 if (STI.hasFeature(llvm::ARM::HasV7Ops) &&

81 ((MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 10) ||

82 (MI.getOperand(1).isImm() && MI.getOperand(1).getImm() == 11))) {

83 Info = "since v7, cp10 and cp11 are reserved for advanced SIMD or floating "

84 "point instructions";

85 return true;

86 }

87 return false;

88}

89

91 std::string &Info) {

93 "cannot predicate thumb instructions");

94

95 assert(MI.getNumOperands() >= 4 && "expected >= 4 arguments");

96 for (unsigned OI = 4, OE = MI.getNumOperands(); OI < OE; ++OI) {

97 assert(MI.getOperand(OI).isReg() && "expected register");

98 if (MI.getOperand(OI).getReg() == ARM::PC) {

99 Info = "use of PC in the list is deprecated";

100 return true;

101 }

102 }

103 return false;

104}

105

107 std::string &Info) {

109 "cannot predicate thumb instructions");

110

111 assert(MI.getNumOperands() >= 4 && "expected >= 4 arguments");

112 bool ListContainsPC = false, ListContainsLR = false;

113 for (unsigned OI = 4, OE = MI.getNumOperands(); OI < OE; ++OI) {

114 assert(MI.getOperand(OI).isReg() && "expected register");

115 switch (MI.getOperand(OI).getReg().id()) {

116 default:

117 break;

118 case ARM::LR:

119 ListContainsLR = true;

120 break;

121 case ARM::PC:

122 ListContainsPC = true;

123 break;

124 }

125 }

126

127 if (ListContainsPC && ListContainsLR) {

128 Info = "use of LR and PC simultaneously in the list is deprecated";

129 return true;

130 }

131

132 return false;

133}

134

135#define GET_INSTRINFO_MC_DESC

136#define ENABLE_INSTR_PREDICATE_VERIFIER

137#include "ARMGenInstrInfo.inc"

138

139#define GET_SUBTARGETINFO_MC_DESC

140#include "ARMGenSubtargetInfo.inc"

141

143 std::string ARMArchFeature;

144

146 if (ArchID != ARM::ArchKind::INVALID && (CPU.empty() || CPU == "generic"))

147 ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();

148

149 if (TT.isThumb()) {

150 if (!ARMArchFeature.empty())

151 ARMArchFeature += ",";

152 ARMArchFeature += "+thumb-mode,+v4t";

153 }

154

155 if (TT.isOSWindows()) {

156 if (!ARMArchFeature.empty())

157 ARMArchFeature += ",";

158 ARMArchFeature += "+noarm";

159 }

160

161 return ARMArchFeature;

162}

163

166 int PredOpIdx = Desc.findFirstPredOperandIdx();

167 return PredOpIdx != -1 && MI.getOperand(PredOpIdx).getImm() != ARMCC::AL;

168}

169

172 for (unsigned I = 0; I < MI.getNumOperands(); ++I) {

174 if (MO.isReg() && MO.getReg() == ARM::CPSR &&

175 Desc.operands()[I].isOptionalDef())

176 return true;

177 }

178 return false;

179}

180

182 uint64_t Addr, int64_t Imm) {

183

184

187

188

189

190

191

192

193 if (InstDesc.getOpcode() == ARM::tBLXi)

194 Addr &= ~0x3;

195

196 return Addr + Imm + Offset;

197}

198

202 if (!FS.empty()) {

203 if (!ArchFS.empty())

204 ArchFS = (Twine(ArchFS) + "," + FS).str();

205 else

206 ArchFS = std::string(FS);

207 }

208

209 return createARMMCSubtargetInfoImpl(TT, CPU, CPU, ArchFS);

210}

211

214 InitARMMCInstrInfo(X);

215 return X;

216}

217

219

220 static const struct {

223 } RegMap[] = {

224 {codeview::RegisterId::ARM_R0, ARM::R0},

225 {codeview::RegisterId::ARM_R1, ARM::R1},

226 {codeview::RegisterId::ARM_R2, ARM::R2},

227 {codeview::RegisterId::ARM_R3, ARM::R3},

228 {codeview::RegisterId::ARM_R4, ARM::R4},

229 {codeview::RegisterId::ARM_R5, ARM::R5},

230 {codeview::RegisterId::ARM_R6, ARM::R6},

231 {codeview::RegisterId::ARM_R7, ARM::R7},

232 {codeview::RegisterId::ARM_R8, ARM::R8},

233 {codeview::RegisterId::ARM_R9, ARM::R9},

234 {codeview::RegisterId::ARM_R10, ARM::R10},

235 {codeview::RegisterId::ARM_R11, ARM::R11},

236 {codeview::RegisterId::ARM_R12, ARM::R12},

237 {codeview::RegisterId::ARM_SP, ARM::SP},

238 {codeview::RegisterId::ARM_LR, ARM::LR},

239 {codeview::RegisterId::ARM_PC, ARM::PC},

240 {codeview::RegisterId::ARM_CPSR, ARM::CPSR},

241 {codeview::RegisterId::ARM_FPSCR, ARM::FPSCR},

242 {codeview::RegisterId::ARM_FPEXC, ARM::FPEXC},

243 {codeview::RegisterId::ARM_FS0, ARM::S0},

244 {codeview::RegisterId::ARM_FS1, ARM::S1},

245 {codeview::RegisterId::ARM_FS2, ARM::S2},

246 {codeview::RegisterId::ARM_FS3, ARM::S3},

247 {codeview::RegisterId::ARM_FS4, ARM::S4},

248 {codeview::RegisterId::ARM_FS5, ARM::S5},

249 {codeview::RegisterId::ARM_FS6, ARM::S6},

250 {codeview::RegisterId::ARM_FS7, ARM::S7},

251 {codeview::RegisterId::ARM_FS8, ARM::S8},

252 {codeview::RegisterId::ARM_FS9, ARM::S9},

253 {codeview::RegisterId::ARM_FS10, ARM::S10},

254 {codeview::RegisterId::ARM_FS11, ARM::S11},

255 {codeview::RegisterId::ARM_FS12, ARM::S12},

256 {codeview::RegisterId::ARM_FS13, ARM::S13},

257 {codeview::RegisterId::ARM_FS14, ARM::S14},

258 {codeview::RegisterId::ARM_FS15, ARM::S15},

259 {codeview::RegisterId::ARM_FS16, ARM::S16},

260 {codeview::RegisterId::ARM_FS17, ARM::S17},

261 {codeview::RegisterId::ARM_FS18, ARM::S18},

262 {codeview::RegisterId::ARM_FS19, ARM::S19},

263 {codeview::RegisterId::ARM_FS20, ARM::S20},

264 {codeview::RegisterId::ARM_FS21, ARM::S21},

265 {codeview::RegisterId::ARM_FS22, ARM::S22},

266 {codeview::RegisterId::ARM_FS23, ARM::S23},

267 {codeview::RegisterId::ARM_FS24, ARM::S24},

268 {codeview::RegisterId::ARM_FS25, ARM::S25},

269 {codeview::RegisterId::ARM_FS26, ARM::S26},

270 {codeview::RegisterId::ARM_FS27, ARM::S27},

271 {codeview::RegisterId::ARM_FS28, ARM::S28},

272 {codeview::RegisterId::ARM_FS29, ARM::S29},

273 {codeview::RegisterId::ARM_FS30, ARM::S30},

274 {codeview::RegisterId::ARM_FS31, ARM::S31},

275 {codeview::RegisterId::ARM_ND0, ARM::D0},

276 {codeview::RegisterId::ARM_ND1, ARM::D1},

277 {codeview::RegisterId::ARM_ND2, ARM::D2},

278 {codeview::RegisterId::ARM_ND3, ARM::D3},

279 {codeview::RegisterId::ARM_ND4, ARM::D4},

280 {codeview::RegisterId::ARM_ND5, ARM::D5},

281 {codeview::RegisterId::ARM_ND6, ARM::D6},

282 {codeview::RegisterId::ARM_ND7, ARM::D7},

283 {codeview::RegisterId::ARM_ND8, ARM::D8},

284 {codeview::RegisterId::ARM_ND9, ARM::D9},

285 {codeview::RegisterId::ARM_ND10, ARM::D10},

286 {codeview::RegisterId::ARM_ND11, ARM::D11},

287 {codeview::RegisterId::ARM_ND12, ARM::D12},

288 {codeview::RegisterId::ARM_ND13, ARM::D13},

289 {codeview::RegisterId::ARM_ND14, ARM::D14},

290 {codeview::RegisterId::ARM_ND15, ARM::D15},

291 {codeview::RegisterId::ARM_ND16, ARM::D16},

292 {codeview::RegisterId::ARM_ND17, ARM::D17},

293 {codeview::RegisterId::ARM_ND18, ARM::D18},

294 {codeview::RegisterId::ARM_ND19, ARM::D19},

295 {codeview::RegisterId::ARM_ND20, ARM::D20},

296 {codeview::RegisterId::ARM_ND21, ARM::D21},

297 {codeview::RegisterId::ARM_ND22, ARM::D22},

298 {codeview::RegisterId::ARM_ND23, ARM::D23},

299 {codeview::RegisterId::ARM_ND24, ARM::D24},

300 {codeview::RegisterId::ARM_ND25, ARM::D25},

301 {codeview::RegisterId::ARM_ND26, ARM::D26},

302 {codeview::RegisterId::ARM_ND27, ARM::D27},

303 {codeview::RegisterId::ARM_ND28, ARM::D28},

304 {codeview::RegisterId::ARM_ND29, ARM::D29},

305 {codeview::RegisterId::ARM_ND30, ARM::D30},

306 {codeview::RegisterId::ARM_ND31, ARM::D31},

307 {codeview::RegisterId::ARM_NQ0, ARM::Q0},

308 {codeview::RegisterId::ARM_NQ1, ARM::Q1},

309 {codeview::RegisterId::ARM_NQ2, ARM::Q2},

310 {codeview::RegisterId::ARM_NQ3, ARM::Q3},

311 {codeview::RegisterId::ARM_NQ4, ARM::Q4},

312 {codeview::RegisterId::ARM_NQ5, ARM::Q5},

313 {codeview::RegisterId::ARM_NQ6, ARM::Q6},

314 {codeview::RegisterId::ARM_NQ7, ARM::Q7},

315 {codeview::RegisterId::ARM_NQ8, ARM::Q8},

316 {codeview::RegisterId::ARM_NQ9, ARM::Q9},

317 {codeview::RegisterId::ARM_NQ10, ARM::Q10},

318 {codeview::RegisterId::ARM_NQ11, ARM::Q11},

319 {codeview::RegisterId::ARM_NQ12, ARM::Q12},

320 {codeview::RegisterId::ARM_NQ13, ARM::Q13},

321 {codeview::RegisterId::ARM_NQ14, ARM::Q14},

322 {codeview::RegisterId::ARM_NQ15, ARM::Q15},

323 };

324 for (const auto &I : RegMap)

325 MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg));

326}

327

330 InitARMMCRegisterInfo(X, ARM::LR, 0, 0, ARM::PC);

332 return X;

333}

334

336 const Triple &TheTriple,

345 else

347

348 unsigned Reg = MRI.getDwarfRegNum(ARM::SP, true);

350

351 return MAI;

352}

353

355 std::unique_ptr &&MAB,

356 std::unique_ptr &&OW,

357 std::unique_ptr &&Emitter) {

359 Ctx, std::move(MAB), std::move(OW), std::move(Emitter),

361 T.isAndroid());

362}

363

366 std::unique_ptr &&OW,

367 std::unique_ptr &&Emitter) {

369 std::move(Emitter), false);

370}

371

373 unsigned SyntaxVariant,

377 if (SyntaxVariant == 0)

379 return nullptr;

380}

381

384 if (TT.isOSBinFormatMachO())

386

388}

389

390namespace {

391

393public:

394 ARMMCInstrAnalysis(const MCInstrInfo *Info) : MCInstrAnalysis(Info) {}

395

397

399 return true;

401 }

402

403 bool isConditionalBranch(const MCInst &Inst) const override {

404

406 return false;

408 }

409

410 bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,

411 uint64_t &Target) const override {

413

414

415 for (unsigned OpNum = 0; OpNum < Desc.getNumOperands(); ++OpNum) {

420 return true;

421 }

422 }

423 return false;

424 }

425

426 std::optional<uint64_t>

427 evaluateMemoryOperandAddress(const MCInst &Inst, const MCSubtargetInfo *STI,

428 uint64_t Addr, uint64_t Size) const override;

429

430 std::vector<std::pair<uint64_t, uint64_t>>

431 findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents,

432 const MCSubtargetInfo &STI) const override;

433};

434

435}

436

437static std::optional<uint64_t>

438

440 unsigned MemOpIndex, uint64_t Addr) {

441 if (MemOpIndex + 1 >= Desc.getNumOperands())

442 return std::nullopt;

443

447 return std::nullopt;

448

449 int32_t OffImm = (int32_t)MO2.getImm();

450

451 if (OffImm == INT32_MIN)

452 OffImm = 0;

453 return Addr + OffImm;

454}

455

456static std::optional<uint64_t>

458 unsigned MemOpIndex, uint64_t Addr) {

459 if (MemOpIndex + 2 >= Desc.getNumOperands())

460 return std::nullopt;

461

466 return std::nullopt;

467

470

472 return Addr - ImmOffs;

473 return Addr + ImmOffs;

474}

475

476static std::optional<uint64_t>

478 unsigned MemOpIndex, uint64_t Addr) {

479 if (MemOpIndex + 1 >= Desc.getNumOperands())

480 return std::nullopt;

481

485 return std::nullopt;

486

489

491 return Addr - ImmOffs * 4;

492 return Addr + ImmOffs * 4;

493}

494

495static std::optional<uint64_t>

497 unsigned MemOpIndex, uint64_t Addr) {

498 if (MemOpIndex + 1 >= Desc.getNumOperands())

499 return std::nullopt;

500

504 return std::nullopt;

505

508

510 return Addr - ImmOffs * 2;

511 return Addr + ImmOffs * 2;

512}

513

514static std::optional<uint64_t>

515

517 unsigned MemOpIndex, uint64_t Addr) {

518 if (MemOpIndex + 1 >= Desc.getNumOperands())

519 return std::nullopt;

520

524 return std::nullopt;

525

526 int32_t OffImm = (int32_t)MO2.getImm();

527 assert(((OffImm & 0x3) == 0) && "Not a valid immediate!");

528

529

530 if (OffImm == INT32_MIN)

531 OffImm = 0;

532 return Addr + OffImm;

533}

534

535static std::optional<uint64_t>

536

538 unsigned MemOpIndex, uint64_t Addr) {

540 if (!MO1.isImm())

541 return std::nullopt;

542

543 int32_t OffImm = (int32_t)MO1.getImm();

544

545

546 if (OffImm == INT32_MIN)

547 OffImm = 0;

548 return Addr + OffImm;

549}

550

551static std::optional<uint64_t>

552

554 unsigned MemOpIndex, uint64_t Addr) {

556}

557

558std::optional<uint64_t> ARMMCInstrAnalysis::evaluateMemoryOperandAddress(

562

563

564 if (Desc.mayLoad())

565 return std::nullopt;

566

567

568 uint64_t TSFlags = Desc.TSFlags;

572 return std::nullopt;

573

574

576 while (OpIndex < Desc.getNumOperands() &&

580 return std::nullopt;

581

582

583 Addr &= ~0x3;

584

585

586

588 default:

589 Addr += 8;

590 break;

592 Addr += 4;

593 break;

594

595

597 Addr += STI->hasFeature(ARM::ModeThumb) ? 4 : 8;

598 break;

599 }

600

601

604 default:

605 return std::nullopt;

620 }

621}

622

623template <typename T, size_t N>

626 for (size_t I = 0; I < N; ++I) {

628 if (Val != Insns[I])

629 return false;

630 }

631 return true;

632}

633

634std::vector<std::pair<uint64_t, uint64_t>>

635ARMMCInstrAnalysis::findPltEntries(uint64_t PltSectionVA,

636 ArrayRef<uint8_t> PltContents,

637 const MCSubtargetInfo &STI) const {

639 ? endianness::little

640 : endianness::big;

642 STI.checkFeatures("+big-endian-instructions") ? endianness::big

643 : endianness::little;

644

645

646 std::vector<std::pair<uint64_t, uint64_t>> Result;

648 for (uint64_t Byte = 0, End = PltContents.size(); Byte + 12 < End;

649 Byte += 16) {

650

651

652

653

654

655

656

657

658 uint32_t MovwPart1 =

660 if ((MovwPart1 & 0xffb0) != 0xf200)

661 continue;

662

664 PltContents.data() + Byte + 2, InstrEndianness);

665 if ((MovwPart2 & 0x8f00) != 0xc00)

666 continue;

667

668 uint64_t OffsetLower = (MovwPart2 & 0xff) + ((MovwPart2 & 0x7000) >> 4) +

669 ((MovwPart1 & 0x400) << 1) +

670 ((MovwPart1 & 0xf) << 12);

671

673 PltContents.data() + Byte + 4, InstrEndianness);

674 if ((MovtPart1 & 0xfbf0) != 0xf2c0)

675 continue;

676

678 PltContents.data() + Byte + 6, InstrEndianness);

679 if ((MovtPart2 & 0x8f00) != 0xc00)

680 continue;

681

682 uint64_t OffsetHigher =

683 ((MovtPart2 & 0xff) << 16) + ((MovtPart2 & 0x7000) << 12) +

684 ((MovtPart1 & 0x400) << 17) + ((MovtPart1 & 0xf) << 28);

685

686 const uint16_t Insns[] = {

687 0x44fc,

688 0xf8dc, 0xf000,

689 0xe7fc,

690 };

691

693 InstrEndianness))

694 continue;

695

696

697 uint64_t Offset = (PltSectionVA + Byte + 12) + OffsetLower + OffsetHigher;

698 Result.emplace_back(PltSectionVA + Byte, Offset);

699 }

700 } else {

701 const uint32_t LongEntryInsns[] = {

702 0xe59fc004,

703 0xe08cc00f,

704 0xe59cf000,

705 };

706

707 for (uint64_t Byte = 0, End = PltContents.size(); Byte + 12 < End;

708 Byte += 4) {

709

711 InstrEndianness)) {

712

713

714

715

716

717

718

719 uint64_t Offset = (PltSectionVA + Byte + 12) +

721 PltContents.data() + Byte + 12, DataEndianness);

722 Result.emplace_back(PltSectionVA + Byte, Offset);

724 } else {

725

726

727

728

729

730

731 uint32_t Add1 =

733 if ((Add1 & 0xe28fc600) != 0xe28fc600)

734 continue;

736 InstrEndianness);

737 if ((Add2 & 0xe28cca00) != 0xe28cca00)

738 continue;

740 InstrEndianness);

741 if ((Ldr & 0xe5bcf000) != 0xe5bcf000)

742 continue;

743

744

745 uint64_t Offset = (PltSectionVA + Byte + 8) + ((Add1 & 0xff) << 20) +

746 ((Add2 & 0xff) << 12) + (Ldr & 0xfff);

747 Result.emplace_back(PltSectionVA + Byte, Offset);

749 }

750 }

751 }

753}

754

756 return new ARMMCInstrAnalysis(Info);

757}

758

760

761

762 if (Coproc >= 8)

763 return false;

764 return STI.getFeatureBits()[ARM::FeatureCoprocCDE0 + Coproc];

765}

766

767

771

773

774

776

777

779

780

783

787

788

791

792

794

795

797

798

800

801

803 }

804

805

809

813 }

817 }

818}

unsigned const MachineRegisterInfo * MRI

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

static bool isUnconditionalBranch(Instruction *Term)

static std::optional< uint64_t > evaluateMemOpAddrForAddrMode_i12(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:439

static bool getARMStoreDeprecationInfo(MCInst &MI, const MCSubtargetInfo &STI, std::string &Info)

Definition ARMMCTargetDesc.cpp:90

static bool getARMLoadDeprecationInfo(MCInst &MI, const MCSubtargetInfo &STI, std::string &Info)

Definition ARMMCTargetDesc.cpp:106

static std::optional< uint64_t > evaluateMemOpAddrForAddrModeT1_s(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:553

static MCStreamer * createARMMachOStreamer(MCContext &Ctx, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)

Definition ARMMCTargetDesc.cpp:365

static std::optional< uint64_t > evaluateMemOpAddrForAddrMode3(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:457

static MCInstrAnalysis * createARMMCInstrAnalysis(const MCInstrInfo *Info)

Definition ARMMCTargetDesc.cpp:755

static std::optional< uint64_t > evaluateMemOpAddrForAddrMode5FP16(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:496

static bool instructionsMatch(const T(&Insns)[N], const uint8_t *Buf, llvm::endianness E)

Definition ARMMCTargetDesc.cpp:624

static std::optional< uint64_t > evaluateMemOpAddrForAddrModeT2_pc(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:537

static bool getMCRDeprecationInfo(MCInst &MI, const MCSubtargetInfo &STI, std::string &Info)

Definition ARMMCTargetDesc.cpp:39

static std::optional< uint64_t > evaluateMemOpAddrForAddrMode5(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:477

static MCInstrInfo * createARMMCInstrInfo()

Definition ARMMCTargetDesc.cpp:212

static MCRelocationInfo * createARMMCRelocationInfo(const Triple &TT, MCContext &Ctx)

Definition ARMMCTargetDesc.cpp:382

static MCInstPrinter * createARMMCInstPrinter(const Triple &T, unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)

Definition ARMMCTargetDesc.cpp:372

static MCRegisterInfo * createARMMCRegisterInfo(const Triple &Triple)

Definition ARMMCTargetDesc.cpp:328

static bool getMRCDeprecationInfo(MCInst &MI, const MCSubtargetInfo &STI, std::string &Info)

Definition ARMMCTargetDesc.cpp:78

static std::optional< uint64_t > evaluateMemOpAddrForAddrModeT2_i8s4(const MCInst &Inst, const MCInstrDesc &Desc, unsigned MemOpIndex, uint64_t Addr)

Definition ARMMCTargetDesc.cpp:516

LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARMTargetMC()

Definition ARMMCTargetDesc.cpp:768

static MCAsmInfo * createARMMCAsmInfo(const MCRegisterInfo &MRI, const Triple &TheTriple, const MCTargetOptions &Options)

Definition ARMMCTargetDesc.cpp:335

static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")

Analysis containing CSE Info

#define LLVM_EXTERNAL_VISIBILITY

dxil DXContainer Global Emitter

static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")

size_t size() const

size - Get the array size.

This class is intended to be used as a base class for asm properties and features specific to the tar...

void addInitialFrameState(const MCCFIInstruction &Inst)

static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})

.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.

Context object for machine code objects.

This is an instance of a target assembly language printer that converts an MCInst to valid target ass...

Instances of this class represent a single low-level machine instruction.

unsigned getOpcode() const

const MCOperand & getOperand(unsigned i) const

virtual bool isUnconditionalBranch(const MCInst &Inst) const

virtual bool isConditionalBranch(const MCInst &Inst) const

Describe properties that are true of each instruction in the target description file.

unsigned getOpcode() const

Return the opcode number for this descriptor.

Interface to description of machine instruction set.

const MCInstrDesc & get(unsigned Opcode) const

Return the machine instruction descriptor that corresponds to the specified instruction opcode.

Instances of this class represent operands of the MCInst class.

MCRegister getReg() const

Returns the register number.

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

Create MCExprs from relocations found in an object file.

Streaming machine code generation interface.

Generic base class for all target subtargets.

bool checkFeatures(StringRef FS) const

Check whether the subtarget features are enabled/disabled as per the provided string,...

bool hasFeature(unsigned Feature) const

const Triple & getTargetTriple() const

const FeatureBitset & getFeatureBits() 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.

LLVM_ABI bool isLittleEndian() const

Tests whether the target triple is little endian.

bool isOSWindows() const

Tests whether the OS is Windows.

bool isOSDarwin() const

Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).

bool isWindowsMSVCEnvironment() const

Checks if the environment could be MSVC.

Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...

IndexMode

ARM Index Modes.

unsigned char getAM3Offset(unsigned AM3Opc)

unsigned char getAM5FP16Offset(unsigned AM5Opc)

AddrOpc getAM5Op(unsigned AM5Opc)

AddrOpc getAM5FP16Op(unsigned AM5Opc)

unsigned char getAM5Offset(unsigned AM5Opc)

AddrOpc getAM3Op(unsigned AM3Opc)

MCSubtargetInfo * createARMMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS)

Create a ARM MCSubtargetInfo instance.

Definition ARMMCTargetDesc.cpp:199

std::string ParseARMTriple(const Triple &TT, StringRef CPU)

Definition ARMMCTargetDesc.cpp:142

bool isCPSRDefined(const MCInst &MI, const MCInstrInfo *MCII)

Definition ARMMCTargetDesc.cpp:170

void initLLVMToCVRegMapping(MCRegisterInfo *MRI)

Definition ARMMCTargetDesc.cpp:218

bool isPredicated(const MCInst &MI, const MCInstrInfo *MCII)

Definition ARMMCTargetDesc.cpp:164

uint64_t evaluateBranchTarget(const MCInstrDesc &InstDesc, uint64_t Addr, int64_t Imm)

Definition ARMMCTargetDesc.cpp:181

LLVM_ABI StringRef getArchName(ArchKind AK)

LLVM_ABI ArchKind parseArch(StringRef Arch)

bool isCDECoproc(size_t Coproc, const MCSubtargetInfo &STI)

Definition ARMMCTargetDesc.cpp:759

@ D16

Only 16 D registers.

uint32_t read32(const void *P, endianness E)

value_type read(const void *memory, endianness endian)

Read a value of a particular endianness from memory.

uint16_t read16(const void *P, endianness E)

This is an optimization pass for GlobalISel generic memory operations.

MCELFStreamer * createARMELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter, bool IsThumb, bool IsAndroid)

Target & getTheThumbBETarget()

MCCodeEmitter * createARMLEMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)

LLVM_ABI MCStreamer * createELFStreamer(MCContext &Ctx, std::unique_ptr< MCAsmBackend > &&TAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&CE)

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

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

MCRelocationInfo * createARMMachORelocationInfo(MCContext &Ctx)

Construct ARM Mach-O relocation info.

LLVM_ABI MCStreamer * createMachOStreamer(MCContext &Ctx, std::unique_ptr< MCAsmBackend > &&TAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&CE, bool DWARFMustBeAtTheEnd, bool LabelSections=false)

LLVM_ABI MCRelocationInfo * createMCRelocationInfo(const Triple &TT, MCContext &Ctx)

uint16_t MCPhysReg

An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...

DWARFExpression::Operation Op

MCTargetStreamer * createARMObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI)

Target & getTheARMLETarget()

MCTargetStreamer * createARMNullTargetStreamer(MCStreamer &S)

MCCodeEmitter * createARMBEMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)

MCStreamer * createARMWinCOFFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)

MCTargetStreamer * createARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)

Target & getTheARMBETarget()

Target & getTheThumbLETarget()

RegisterMCAsmInfoFn - Helper template for registering a target assembly info implementation.

static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn)

RegisterMCRegInfo - Register a MCRegisterInfo implementation for the given target.

static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn)

RegisterMCAsmBackend - Register a MCAsmBackend implementation for the given target.

static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn)

RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the given target.

static void RegisterMCSubtargetInfo(Target &T, Target::MCSubtargetInfoCtorFnTy Fn)

RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for the given target.

static void RegisterObjectTargetStreamer(Target &T, Target::ObjectTargetStreamerCtorTy Fn)

static void RegisterMCInstrAnalysis(Target &T, Target::MCInstrAnalysisCtorFnTy Fn)

RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for the given target.

static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn)

static void RegisterNullTargetStreamer(Target &T, Target::NullTargetStreamerCtorTy Fn)

static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn)

RegisterMCInstPrinter - Register a MCInstPrinter implementation for the given target.

static void RegisterCOFFStreamer(Target &T, Target::COFFStreamerCtorTy Fn)

static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn)

RegisterMCInstrInfo - Register a MCInstrInfo implementation for the given target.

static void RegisterMachOStreamer(Target &T, Target::MachOStreamerCtorTy Fn)

static void RegisterAsmTargetStreamer(Target &T, Target::AsmTargetStreamerCtorTy Fn)

static void RegisterMCRelocationInfo(Target &T, Target::MCRelocationInfoCtorTy Fn)

RegisterMCRelocationInfo - Register an MCRelocationInfo implementation for the given target.