136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===-- SparcAsmBackend.cpp - Sparc Assembler Backend ---------------------===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCAsmBackend.h" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/SparcFixupKinds.h" 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/SparcMCTargetDesc.h" 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCELFObjectWriter.h" 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCExpr.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCFixupKindInfo.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCObjectWriter.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/MC/MCValue.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/TargetRegistry.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic unsigned adjustFixupValue(unsigned Kind, uint64_t Value) { 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (Kind) { 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines llvm_unreachable("Unknown fixup kind!"); 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case FK_Data_1: 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case FK_Data_2: 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case FK_Data_4: 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case FK_Data_8: 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Value; 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_wplt30: 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_call30: 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 2) & 0x3fffffff; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_br22: 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 2) & 0x3fffff; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_br19: 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 2) & 0x7ffff; 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_br16_2: 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 2) & 0xc000; 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_br16_14: 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 2) & 0x3fff; 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_pc22: 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_got22: 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_hi22: 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_hi22: 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_hi22: 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_hi22: 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 10) & 0x3fffff; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_pc10: 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_got10: 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_lo10: 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_lo10: 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_lo10: 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_lo10: 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Value & 0x3ff; 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldo_hix22: 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_le_hix22: 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (~Value >> 10) & 0x3fffff; 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldo_lox10: 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_le_lox10: 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (~(~Value & 0x3ff)) & 0x1fff; 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_h44: 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 22) & 0x3fffff; 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_m44: 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 12) & 0x3ff; 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_l44: 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Value & 0xfff; 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_hh: 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 42) & 0x3fffff; 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_hm: 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (Value >> 32) & 0x3ff; 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_add: 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_call: 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_add: 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_call: 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldo_add: 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_ld: 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_ldx: 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_add: 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return 0; 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace { 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class SparcAsmBackend : public MCAsmBackend { 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const Target &TheTarget; 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines public: 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SparcAsmBackend(const Target &T) : MCAsmBackend(), TheTarget(T) {} 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getNumFixupKinds() const override { 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Sparc::NumTargetFixupKinds; 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override { 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const static MCFixupKindInfo Infos[Sparc::NumTargetFixupKinds] = { 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // name offset bits flags 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_call30", 2, 30, MCFixupKindInfo::FKF_IsPCRel }, 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_br22", 10, 22, MCFixupKindInfo::FKF_IsPCRel }, 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_br19", 13, 19, MCFixupKindInfo::FKF_IsPCRel }, 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_br16_2", 10, 2, MCFixupKindInfo::FKF_IsPCRel }, 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_br16_14", 18, 14, MCFixupKindInfo::FKF_IsPCRel }, 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_hi22", 10, 22, 0 }, 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_lo10", 22, 10, 0 }, 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_h44", 10, 22, 0 }, 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_m44", 22, 10, 0 }, 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_l44", 20, 12, 0 }, 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_hh", 10, 22, 0 }, 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_hm", 22, 10, 0 }, 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_pc22", 10, 22, MCFixupKindInfo::FKF_IsPCRel }, 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_pc10", 22, 10, MCFixupKindInfo::FKF_IsPCRel }, 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_got22", 10, 22, 0 }, 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_got10", 22, 10, 0 }, 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_wplt30", 2, 30, MCFixupKindInfo::FKF_IsPCRel }, 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_gd_hi22", 10, 22, 0 }, 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_gd_lo10", 22, 10, 0 }, 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_gd_add", 0, 0, 0 }, 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_gd_call", 0, 0, 0 }, 13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldm_hi22", 10, 22, 0 }, 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldm_lo10", 22, 10, 0 }, 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldm_add", 0, 0, 0 }, 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldm_call", 0, 0, 0 }, 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldo_hix22", 10, 22, 0 }, 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldo_lox10", 22, 10, 0 }, 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ldo_add", 0, 0, 0 }, 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ie_hi22", 10, 22, 0 }, 14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ie_lo10", 22, 10, 0 }, 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ie_ld", 0, 0, 0 }, 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ie_ldx", 0, 0, 0 }, 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_ie_add", 0, 0, 0 }, 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_le_hix22", 0, 0, 0 }, 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines { "fixup_sparc_tls_le_lox10", 0, 0, 0 } 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Kind < FirstTargetFixupKind) 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MCAsmBackend::getFixupKindInfo(Kind); 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Invalid kind!"); 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Infos[Kind - FirstTargetFixupKind]; 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout, 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCFixup &Fixup, const MCFragment *DF, 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCValue &Target, uint64_t &Value, 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool &IsResolved) override { 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch ((Sparc::Fixups)Fixup.getKind()) { 16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: break; 16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_wplt30: 16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Target.getSymA()->getSymbol().isTemporary()) 16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return; 16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_hi22: 16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_lo10: 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_add: 16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_gd_call: 17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_hi22: 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_lo10: 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_add: 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldm_call: 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldo_hix22: 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldo_lox10: 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ldo_add: 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_hi22: 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_lo10: 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_ld: 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_ldx: 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_ie_add: 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_le_hix22: 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines case Sparc::fixup_sparc_tls_le_lox10: IsResolved = false; break; 18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool mayNeedRelaxation(const MCInst &Inst) const override { 18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME. 18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// fixupNeedsRelaxation - Target specific predicate for whether a given 19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// fixup requires the associated instruction to be relaxed. 19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool fixupNeedsRelaxation(const MCFixup &Fixup, 19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Value, 19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCRelaxableFragment *DF, 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCAsmLayout &Layout) const override { 19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME. 199cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines llvm_unreachable("fixupNeedsRelaxation() unimplemented"); 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void relaxInstruction(const MCInst &Inst, MCInst &Res) const override { 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME. 204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines llvm_unreachable("relaxInstruction() unimplemented"); 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override { 20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Cannot emit NOP with size not multiple of 32 bits. 20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Count % 4 != 0) 21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t NumNops = Count / 4; 21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (uint64_t i = 0; i != NumNops; ++i) 21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OW->Write32(0x01000000); 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool is64Bit() const { 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef name = TheTarget.getName(); 22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return name == "sparcv9"; 22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines class ELFSparcAsmBackend : public SparcAsmBackend { 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Triple::OSType OSType; 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines public: 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ELFSparcAsmBackend(const Target &T, Triple::OSType OSType) : 22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SparcAsmBackend(T), OSType(OSType) { } 23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, 232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines uint64_t Value, bool IsPCRel) const override { 23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Value = adjustFixupValue(Fixup.getKind(), Value); 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!Value) return; // Doesn't change encoding. 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned Offset = Fixup.getOffset(); 23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // For each byte of the fragment that the fixup touches, mask in the bits 24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // from the fixup value. The Value has been "split up" into the 24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // appropriate bitfields above. 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (unsigned i = 0; i != 4; ++i) 24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Data[Offset + i] |= uint8_t((Value >> ((4 - i - 1)*8)) & 0xff); 24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 247dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCObjectWriter *createObjectWriter(raw_ostream &OS) const override { 24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(OSType); 24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return createSparcELFObjectWriter(OS, is64Bit(), OSABI); 25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines }; 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end anonymous namespace 25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCAsmBackend *llvm::createSparcAsmBackend(const Target &T, 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCRegisterInfo &MRI, 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef TT, 25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines StringRef CPU) { 26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new ELFSparcAsmBackend(T, Triple(TT).getOS()); 26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 262