137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===-- HexagonAsmBackend.cpp - Hexagon Assembler Backend -----------------===// 237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// The LLVM Compiler Infrastructure 437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source 637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details. 737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// 837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===// 937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "Hexagon.h" 116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "HexagonFixupKinds.h" 1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "HexagonMCTargetDesc.h" 136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "MCTargetDesc/HexagonBaseInfo.h" 146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "MCTargetDesc/HexagonMCInstrInfo.h" 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCAsmBackend.h" 16cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/MC/MCAsmLayout.h" 176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCAssembler.h" 18cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/MC/MCContext.h" 1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/MC/MCELFObjectWriter.h" 206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCFixupKindInfo.h" 216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCInstrInfo.h" 226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/Debug.h" 236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/TargetRegistry.h" 2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesusing namespace llvm; 266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarusing namespace Hexagon; 276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#define DEBUG_TYPE "hexagon-asm-backend" 2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace { 3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesclass HexagonAsmBackend : public MCAsmBackend { 336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint8_t OSABI; 346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef CPU; 356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar mutable uint64_t relaxedCnt; 366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr <MCInstrInfo> MCII; 376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr <MCInst *> RelaxTarget; 38cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MCInst * Extender; 3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic: 406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar HexagonAsmBackend(Target const &T, uint8_t OSABI, StringRef CPU) : 41cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar OSABI(OSABI), MCII (T.createMCInstrInfo()), RelaxTarget(new MCInst *), 42cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Extender(nullptr) {} 436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCObjectWriter *createObjectWriter(raw_pwrite_stream &OS) const override { 456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return createHexagonELFObjectWriter(OS, OSABI, CPU); 466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 48cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar void setExtender(MCContext &Context) const { 49cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (Extender == nullptr) 50cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const_cast<HexagonAsmBackend *>(this)->Extender = new (Context) MCInst; 51cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 52cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 53cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MCInst *takeExtender() const { 54cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Extender != nullptr); 55cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MCInst * Result = Extender; 56cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const_cast<HexagonAsmBackend *>(this)->Extender = nullptr; 57cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return Result; 58cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 59cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned getNumFixupKinds() const override { 616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Hexagon::NumTargetFixupKinds; 626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override { 656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const static MCFixupKindInfo Infos[Hexagon::NumTargetFixupKinds] = { 666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // This table *must* be in same the order of fixup_* kinds in 676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // HexagonFixupKinds.h. 686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // 696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // namei offset bits flags 706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B22_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B15_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B7_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LO16", 0, 32, 0}, 746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_HI16", 0, 32, 0}, 756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_32", 0, 32, 0}, 766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_16", 0, 32, 0}, 776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_8", 0, 32, 0}, 786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GPREL16_0", 0, 32, 0}, 796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GPREL16_1", 0, 32, 0}, 806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GPREL16_2", 0, 32, 0}, 816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GPREL16_3", 0, 32, 0}, 826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_HL16", 0, 32, 0}, 836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B13_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B9_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B32_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_32_6_X", 0, 32, 0}, 876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B22_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B15_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B13_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B9_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_B7_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_16_X", 0, 32, 0}, 936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_12_X", 0, 32, 0}, 946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_11_X", 0, 32, 0}, 956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_10_X", 0, 32, 0}, 966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_9_X", 0, 32, 0}, 976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_8_X", 0, 32, 0}, 986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_7_X", 0, 32, 0}, 996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_6_X", 0, 32, 0}, 1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_32_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 1016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_COPY", 0, 32, 0}, 1026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GLOB_DAT", 0, 32, 0}, 1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_JMP_SLOT", 0, 32, 0}, 1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_RELATIVE", 0, 32, 0}, 1056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_PLT_B22_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 1066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOTREL_LO16", 0, 32, 0}, 1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOTREL_HI16", 0, 32, 0}, 1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOTREL_32", 0, 32, 0}, 1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_LO16", 0, 32, 0}, 1106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_HI16", 0, 32, 0}, 1116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_32", 0, 32, 0}, 1126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_16", 0, 32, 0}, 1136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPMOD_32", 0, 32, 0}, 1146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_LO16", 0, 32, 0}, 1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_HI16", 0, 32, 0}, 1166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_32", 0, 32, 0}, 1176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_16", 0, 32, 0}, 1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_PLT_B22_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_PLT_B22_PCREL", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_LO16", 0, 32, 0}, 1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_HI16", 0, 32, 0}, 1226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_32", 0, 32, 0}, 1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_16", 0, 32, 0}, 1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_LO16", 0, 32, 0}, 1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_HI16", 0, 32, 0}, 1266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_32", 0, 32, 0}, 1276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_16", 0, 32, 0}, 1286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_LO16", 0, 32, 0}, 1296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_HI16", 0, 32, 0}, 1306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_32", 0, 32, 0}, 1316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_16", 0, 32, 0}, 1326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_LO16", 0, 32, 0}, 1336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_HI16", 0, 32, 0}, 1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_32", 0, 32, 0}, 1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_16", 0, 32, 0}, 1366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_LO16", 0, 32, 0}, 1376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_HI16", 0, 32, 0}, 1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_32", 0, 32, 0}, 1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_16", 0, 32, 0}, 1406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_6_PCREL_X", 0, 32, MCFixupKindInfo::FKF_IsPCRel}, 1416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOTREL_32_6_X", 0, 32, 0}, 1426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOTREL_16_X", 0, 32, 0}, 1436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOTREL_11_X", 0, 32, 0}, 1446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_32_6_X", 0, 32, 0}, 1456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_16_X", 0, 32, 0}, 1466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GOT_11_X", 0, 32, 0}, 1476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_32_6_X", 0, 32, 0}, 1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_16_X", 0, 32, 0}, 1496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_DTPREL_11_X", 0, 32, 0}, 1506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_32_6_X", 0, 32, 0}, 1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_16_X", 0, 32, 0}, 1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_GD_GOT_11_X", 0, 32, 0}, 1536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_32_6_X", 0, 32, 0}, 1546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_16_X", 0, 32, 0}, 1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_LD_GOT_11_X", 0, 32, 0}, 1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_32_6_X", 0, 32, 0}, 1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_16_X", 0, 32, 0}, 1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_32_6_X", 0, 32, 0}, 1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_16_X", 0, 32, 0}, 1606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_IE_GOT_11_X", 0, 32, 0}, 1616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_32_6_X", 0, 32, 0}, 1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_16_X", 0, 32, 0}, 1636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar {"fixup_Hexagon_TPREL_11_X", 0, 32, 0}}; 16437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Kind < FirstTargetFixupKind) { 1666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCAsmBackend::getFixupKindInfo(Kind); 1676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && 1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "Invalid kind!"); 1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Infos[Kind - FirstTargetFixupKind]; 1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines void applyFixup(MCFixup const & /*Fixup*/, char * /*Data*/, 17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned /*DataSize*/, uint64_t /*Value*/, 17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool /*IsPCRel*/) const override { 17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return; 17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool isInstRelaxable(MCInst const &HMI) const { 1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCInstrDesc &MCID = HexagonMCInstrInfo::getDesc(*MCII, HMI); 1826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool Relaxable = false; 1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Branches and loop-setup insns are handled as necessary by relaxation. 1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (llvm::HexagonMCInstrInfo::getType(*MCII, HMI) == HexagonII::TypeJ || 1856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar (llvm::HexagonMCInstrInfo::getType(*MCII, HMI) == HexagonII::TypeNV && 1866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCID.isBranch()) || 1876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar (llvm::HexagonMCInstrInfo::getType(*MCII, HMI) == HexagonII::TypeCR && 1886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar HMI.getOpcode() != Hexagon::C4_addipc)) 1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (HexagonMCInstrInfo::isExtendable(*MCII, HMI)) 1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Relaxable = true; 1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Relaxable; 1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MayNeedRelaxation - Check whether the given instruction may need 1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// relaxation. 1976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 1986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Inst - The instruction to test. 1996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool mayNeedRelaxation(MCInst const &Inst) const override { 2006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(HexagonMCInstrInfo::isBundle(Inst)); 2016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool PreviousIsExtender = false; 2026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (auto const &I : HexagonMCInstrInfo::bundleInstructions(Inst)) { 2036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto const &Inst = *I.getInst(); 2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!PreviousIsExtender) { 2056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isInstRelaxable(Inst)) 2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return true; 2076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar PreviousIsExtender = HexagonMCInstrInfo::isImmext(Inst); 2096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return false; 2116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// fixupNeedsRelaxation - Target specific predicate for whether a given 2146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// fixup requires the associated instruction to be relaxed. 2156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool fixupNeedsRelaxationAdvanced(const MCFixup &Fixup, bool Resolved, 2166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint64_t Value, 2176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRelaxableFragment *DF, 2186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCAsmLayout &Layout) const override { 2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInst const &MCB = DF->getInst(); 2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(HexagonMCInstrInfo::isBundle(MCB)); 2216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar *RelaxTarget = nullptr; 2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInst &MCI = const_cast<MCInst &>(HexagonMCInstrInfo::instruction( 2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCB, Fixup.getOffset() / HEXAGON_INSTR_SIZE)); 2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // If we cannot resolve the fixup value, it requires relaxation. 2266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!Resolved) { 2276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar switch ((unsigned)Fixup.getKind()) { 2286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B22_PCREL: 2296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // GetFixupCount assumes B22 won't relax 2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Fallthrough 2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar default: 2326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return false; 2336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B13_PCREL: 2356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B15_PCREL: 2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B9_PCREL: 2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B7_PCREL: { 2386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (HexagonMCInstrInfo::bundleSize(MCB) < HEXAGON_PACKET_SIZE) { 2396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ++relaxedCnt; 2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar *RelaxTarget = &MCI; 241cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar setExtender(Layout.getAssembler().getContext()); 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return true; 2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } else { 2446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return false; 2456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool Relaxable = isInstRelaxable(MCI); 2516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Relaxable == false) 2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return false; 2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCFixupKind Kind = Fixup.getKind(); 2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t sValue = Value; 2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar int64_t maxValue; 2576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar switch ((unsigned)Kind) { 2596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B7_PCREL: 2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar maxValue = 1 << 8; 2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B9_PCREL: 2636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar maxValue = 1 << 10; 2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B15_PCREL: 2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar maxValue = 1 << 16; 2676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case fixup_Hexagon_B22_PCREL: 2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar maxValue = 1 << 23; 2706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar default: 2726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar maxValue = INT64_MAX; 2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 2746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool isFarAway = -maxValue > sValue || sValue > maxValue - 1; 2776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isFarAway) { 2796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (HexagonMCInstrInfo::bundleSize(MCB) < HEXAGON_PACKET_SIZE) { 2806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ++relaxedCnt; 2816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar *RelaxTarget = &MCI; 282cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar setExtender(Layout.getAssembler().getContext()); 2836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return true; 2846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 28837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 2906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Simple predicate for targets where !Resolved implies requiring relaxation 2916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, 2926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRelaxableFragment *DF, 2936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCAsmLayout &Layout) const override { 2946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar llvm_unreachable("Handled by fixupNeedsRelaxationAdvanced"); 29537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 29637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 297cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar void relaxInstruction(MCInst const & Inst, 298cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MCInst & Res) const override { 299cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(HexagonMCInstrInfo::isBundle(Inst) && 300cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "Hexagon relaxInstruction only works on bundles"); 301cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 302cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Res = HexagonMCInstrInfo::createBundle(); 303cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // Copy the results into the bundle. 304cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool Update = false; 305cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar for (auto &I : HexagonMCInstrInfo::bundleInstructions(Inst)) { 306cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MCInst &CrntHMI = const_cast<MCInst &>(*I.getInst()); 307cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 308cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // if immediate extender needed, add it in 309cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (*RelaxTarget == &CrntHMI) { 310cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Update = true; 311cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert((HexagonMCInstrInfo::bundleSize(Res) < HEXAGON_PACKET_SIZE) && 312cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "No room to insert extender for relaxation"); 313cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 314cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MCInst *HMIx = takeExtender(); 315cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar *HMIx = HexagonMCInstrInfo::deriveExtender( 316cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar *MCII, CrntHMI, 317cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar HexagonMCInstrInfo::getExtendableOperand(*MCII, CrntHMI)); 318cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Res.addOperand(MCOperand::createInst(HMIx)); 319cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar *RelaxTarget = nullptr; 320cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 321cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // now copy over the original instruction(the one we may have extended) 322cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Res.addOperand(MCOperand::createInst(I.getInst())); 323cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 324cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar (void)Update; 325cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(Update && "Didn't find relaxation target"); 32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool writeNopData(uint64_t Count, 3296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCObjectWriter * OW) const override { 3306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const uint32_t Nopcode = 0x7f000000, // Hard-coded NOP. 3316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ParseIn = 0x00004000, // In packet parse-bits. 3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ParseEnd = 0x0000c000; // End of packet parse-bits. 33337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar while(Count % HEXAGON_INSTR_SIZE) { 3356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DEBUG(dbgs() << "Alignment not a multiple of the instruction size:" << 3366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Count % HEXAGON_INSTR_SIZE << "/" << HEXAGON_INSTR_SIZE << "\n"); 3376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar --Count; 3386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OW->write8(0); 3396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 34037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar while(Count) { 3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Count -= HEXAGON_INSTR_SIZE; 3436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Close the packet whenever a multiple of the maximum packet size remains 3446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint32_t ParseBits = (Count % (HEXAGON_PACKET_SIZE * HEXAGON_INSTR_SIZE))? 3456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ParseIn: ParseEnd; 3466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OW->write32(Nopcode | ParseBits); 3476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 3486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return true; 34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 35037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}; 35137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} // end anonymous namespace 35237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 35337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesnamespace llvm { 35437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesMCAsmBackend *createHexagonAsmBackend(Target const &T, 35537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MCRegisterInfo const & /*MRI*/, 3566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TT, StringRef CPU) { 3576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS()); 3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new HexagonAsmBackend(T, OSABI, CPU); 35937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 36037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 361