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