17609785d2b9b79b9aafc3b3afabcb691cfc8afa5Rafael Espindola//===-- ARMELFObjectWriter.cpp - ARM ELF Writer ---------------------------===//
269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola//
369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola//                     The LLVM Compiler Infrastructure
469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola//
569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola// This file is distributed under the University of Illinois Open Source
669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola// License. See LICENSE.TXT for details.
769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola//
869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola//===----------------------------------------------------------------------===//
969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
1069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "MCTargetDesc/ARMMCTargetDesc.h"
11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MCTargetDesc/ARMFixupKinds.h"
1269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "llvm/ADT/Statistic.h"
1369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "llvm/ADT/StringSwitch.h"
1469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "llvm/MC/MCELFObjectWriter.h"
1569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "llvm/MC/MCExpr.h"
1669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "llvm/MC/MCSectionELF.h"
1769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola#include "llvm/MC/MCValue.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/Debug.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h"
2169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
2269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindolausing namespace llvm;
2369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
2469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindolanamespace {
2569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  class ARMELFObjectWriter : public MCELFObjectTargetWriter {
2669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    enum { DefaultEABIVersion = 0x05000000U };
2769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    unsigned GetRelocTypeInner(const MCValue &Target,
2869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                               const MCFixup &Fixup,
2969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                               bool IsPCRel) const;
3069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
3169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
3269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  public:
3369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    ARMELFObjectWriter(uint8_t OSABI);
3469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
3569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    virtual ~ARMELFObjectWriter();
366db2d926033a5b35ca01293167353a15637ac7f2Rafael Espindola
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          bool IsPCRel) const override;
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool needsRelocateWithSymbol(unsigned Type) const override;
4169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  };
4269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola}
4369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
4469bbda03918a18bd4477bb254d51346ee3033567Rafael EspindolaARMELFObjectWriter::ARMELFObjectWriter(uint8_t OSABI)
4569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  : MCELFObjectTargetWriter(/*Is64Bit*/ false, OSABI,
4669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                            ELF::EM_ARM,
4769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                            /*HasRelocationAddend*/ false) {}
4869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
4969bbda03918a18bd4477bb254d51346ee3033567Rafael EspindolaARMELFObjectWriter::~ARMELFObjectWriter() {}
5069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool ARMELFObjectWriter::needsRelocateWithSymbol(unsigned Type) const {
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: This is extremelly conservative. This really needs to use a
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // whitelist with a clear explanation for why each realocation needs to
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // point to the symbol, not to the section.
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  switch (Type) {
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  default:
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return true;
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case ELF::R_ARM_PREL31:
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case ELF::R_ARM_ABS32:
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
6269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  }
6369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola}
6469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
6569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola// Need to examine the Fixup when determining whether to
6669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola// emit the relocation as an explicit symbol or as a section relative
6769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola// offset
6869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindolaunsigned ARMELFObjectWriter::GetRelocType(const MCValue &Target,
6969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                                          const MCFixup &Fixup,
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          bool IsPCRel) const {
7169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  return GetRelocTypeInner(Target, Fixup, IsPCRel);
7269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola}
7369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
7469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindolaunsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target,
7569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                                               const MCFixup &Fixup,
7669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola                                               bool IsPCRel) const  {
77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
7869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
7969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  unsigned Type = 0;
8069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  if (IsPCRel) {
8169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    switch ((unsigned)Fixup.getKind()) {
82bc2198133a1836598b54b943420748e75d5dea94Craig Topper    default: llvm_unreachable("Unimplemented");
8369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case FK_Data_4:
8469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      switch (Modifier) {
8569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      default: llvm_unreachable("Unsupported Modifier");
8669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      case MCSymbolRefExpr::VK_None:
8769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_REL32;
8869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_TLSGD:
90bc2198133a1836598b54b943420748e75d5dea94Craig Topper        llvm_unreachable("unimplemented");
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_GOTTPOFF:
9269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_TLS_IE32;
9369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      case MCSymbolRefExpr::VK_GOTPCREL:
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        Type = ELF::R_ARM_GOT_PREL;
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        break;
9769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      }
9869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
997b25ecf6adbf3c4709c48033acfeb6ebbb4452abJim Grosbach    case ARM::fixup_arm_blx:
100c9a4e269d00dc9e2ba0c7b77721fa54cfb5a59faJan Wen Voung    case ARM::fixup_arm_uncondbl:
10169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      switch (Modifier) {
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_PLT:
10369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_PLT32;
10469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_ARM_TLSCALL:
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_TLS_CALL;
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
10869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      default:
10969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_CALL;
11069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
11169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      }
11269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
113cb0809b82b126e79b99755ae4fc3d9733faea038James Molloy    case ARM::fixup_arm_condbl:
11469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_condbranch:
115c9a4e269d00dc9e2ba0c7b77721fa54cfb5a59faJan Wen Voung    case ARM::fixup_arm_uncondbranch:
11669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_JUMP24;
11769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
1188fccd013d87c4b12edb4c9982fd9f3517917d2f7Logan Chien    case ARM::fixup_t2_condbranch:
1198fccd013d87c4b12edb4c9982fd9f3517917d2f7Logan Chien    case ARM::fixup_t2_uncondbranch:
1208fccd013d87c4b12edb4c9982fd9f3517917d2f7Logan Chien      Type = ELF::R_ARM_THM_JUMP24;
1218fccd013d87c4b12edb4c9982fd9f3517917d2f7Logan Chien      break;
12269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_movt_hi16:
12369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_MOVT_PREL;
12469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
12569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_movw_lo16:
12669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_MOVW_PREL_NC;
12769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
12869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_t2_movt_hi16:
12969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_THM_MOVT_PREL;
13069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
13169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_t2_movw_lo16:
13269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_THM_MOVW_PREL_NC;
13369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
13469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_thumb_bl:
13569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_thumb_blx:
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      switch (Modifier) {
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_ARM_TLSCALL:
13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_THM_TLS_CALL;
13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      default:
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_THM_CALL;
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      }
14469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
14569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    }
14669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  } else {
14769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    switch ((unsigned)Fixup.getKind()) {
14869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    default: llvm_unreachable("invalid fixup kind!");
14969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case FK_Data_4:
15069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      switch (Modifier) {
1514d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie      default: llvm_unreachable("Unsupported Modifier");
15237c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien      case MCSymbolRefExpr::VK_ARM_NONE:
15337c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien        Type = ELF::R_ARM_NONE;
15437c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien        break;
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_GOT:
15669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_GOT_BREL;
15769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_TLSGD:
15969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_TLS_GD32;
16069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_TPOFF:
16269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_TLS_LE32;
16369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_GOTTPOFF:
16569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_TLS_IE32;
16669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
16769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      case MCSymbolRefExpr::VK_None:
16869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_ABS32;
16969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_GOTOFF:
17169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        Type = ELF::R_ARM_GOTOFF32;
17269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola        break;
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      case MCSymbolRefExpr::VK_GOTPCREL:
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        Type = ELF::R_ARM_GOT_PREL;
175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        break;
17634982576a43887e7f062ed0a3571af2cbab003f3James Molloy      case MCSymbolRefExpr::VK_ARM_TARGET1:
17734982576a43887e7f062ed0a3571af2cbab003f3James Molloy        Type = ELF::R_ARM_TARGET1;
17834982576a43887e7f062ed0a3571af2cbab003f3James Molloy        break;
17912cfa119600418d31ceb748d077b3e6f7057a22aAnton Korobeynikov      case MCSymbolRefExpr::VK_ARM_TARGET2:
18012cfa119600418d31ceb748d077b3e6f7057a22aAnton Korobeynikov        Type = ELF::R_ARM_TARGET2;
18112cfa119600418d31ceb748d077b3e6f7057a22aAnton Korobeynikov        break;
18237c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien      case MCSymbolRefExpr::VK_ARM_PREL31:
18337c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien        Type = ELF::R_ARM_PREL31;
18437c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien        break;
18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_ARM_TLSLDO:
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_TLS_LDO32;
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_ARM_TLSCALL:
18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_TLS_CALL;
19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_ARM_TLSDESC:
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_TLS_GOTDESC;
19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      case MCSymbolRefExpr::VK_ARM_TLSDESCSEQ:
19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Type = ELF::R_ARM_TLS_DESCSEQ;
19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        break;
19737c7461fc3f1983a81bfe934855d707fd6572e78Logan Chien      }
19869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
19969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_ldst_pcrel_12:
20069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_pcrel_10:
20169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_adr_pcrel_12:
20269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_thumb_bl:
20369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_thumb_cb:
20469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_thumb_cp:
20569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_thumb_br:
206bc2198133a1836598b54b943420748e75d5dea94Craig Topper      llvm_unreachable("Unimplemented");
20769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_condbranch:
208c9a4e269d00dc9e2ba0c7b77721fa54cfb5a59faJan Wen Voung    case ARM::fixup_arm_uncondbranch:
20969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_JUMP24;
21069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
21169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_movt_hi16:
21269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_MOVT_ABS;
21369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
21469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_arm_movw_lo16:
21569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_MOVW_ABS_NC;
21669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
21769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_t2_movt_hi16:
21869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_THM_MOVT_ABS;
21969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
22069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    case ARM::fixup_t2_movw_lo16:
22169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      Type = ELF::R_ARM_THM_MOVW_ABS_NC;
22269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola      break;
22369bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola    }
22469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  }
22569bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
22669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  return Type;
22769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola}
22869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola
22969bbda03918a18bd4477bb254d51346ee3033567Rafael EspindolaMCObjectWriter *llvm::createARMELFObjectWriter(raw_ostream &OS,
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                               uint8_t OSABI,
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                               bool IsLittleEndian) {
23269bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola  MCELFObjectTargetWriter *MOTW = new ARMELFObjectWriter(OSABI);
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return createELFObjectWriter(MOTW, OS, IsLittleEndian);
23469bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola}
235