1f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola//===-- PPCELFObjectWriter.cpp - PPC ELF Writer ---------------------------===//
2f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola//
3f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola//                     The LLVM Compiler Infrastructure
4f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola//
5f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola// This file is distributed under the University of Illinois Open Source
6f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola// License. See LICENSE.TXT for details.
7f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola//
8f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola//===----------------------------------------------------------------------===//
9f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
10f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola#include "MCTargetDesc/PPCMCTargetDesc.h"
11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "MCTargetDesc/PPCFixupKinds.h"
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/PPCMCExpr.h"
13d3eb4f46f011f5880e09862559c17f03e38bef39Bill Schmidt#include "llvm/ADT/STLExtras.h"
14f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola#include "llvm/MC/MCELFObjectWriter.h"
15aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella#include "llvm/MC/MCExpr.h"
16aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella#include "llvm/MC/MCValue.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
18f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
19f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindolausing namespace llvm;
20f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
21f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindolanamespace {
22f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  class PPCELFObjectWriter : public MCELFObjectTargetWriter {
23f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  public:
24f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    PPCELFObjectWriter(bool Is64Bit, uint8_t OSABI);
25f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
26f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    virtual ~PPCELFObjectWriter();
27f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  protected:
28aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella    virtual unsigned getRelocTypeInner(const MCValue &Target,
29aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella                                       const MCFixup &Fixup,
30aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella                                       bool IsPCRel) const;
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          bool IsPCRel) const override;
33f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  };
34f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola}
35f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
36f3a86fb03d196994dc7923351f15d8ed9343013eRafael EspindolaPPCELFObjectWriter::PPCELFObjectWriter(bool Is64Bit, uint8_t OSABI)
37f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  : MCELFObjectTargetWriter(Is64Bit, OSABI,
38f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola                            Is64Bit ?  ELF::EM_PPC64 : ELF::EM_PPC,
39f51e95a9f2ce10ca0eb8a353e1fc1d9d49ec130cRafael Espindola                            /*HasRelocationAddend*/ true) {}
40f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
41f3a86fb03d196994dc7923351f15d8ed9343013eRafael EspindolaPPCELFObjectWriter::~PPCELFObjectWriter() {
42f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola}
43f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic MCSymbolRefExpr::VariantKind getAccessVariant(const MCValue &Target,
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                                     const MCFixup &Fixup) {
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const MCExpr *Expr = Fixup.getValue();
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Expr->getKind() != MCExpr::Target)
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return Target.getAccessVariant();
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  switch (cast<PPCMCExpr>(Expr)->getKind()) {
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_None:
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_None;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_LO:
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_LO;
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_HI:
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_HI;
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_HA:
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_HA;
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_HIGHERA:
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_HIGHERA;
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_HIGHER:
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_HIGHER;
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_HIGHEST:
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_HIGHEST;
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case PPCMCExpr::VK_PPC_HIGHESTA:
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return MCSymbolRefExpr::VK_PPC_HIGHESTA;
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  llvm_unreachable("unknown PPCMCExpr kind");
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
72aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanellaunsigned PPCELFObjectWriter::getRelocTypeInner(const MCValue &Target,
73aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella                                               const MCFixup &Fixup,
74aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella                                               bool IsPCRel) const
75aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella{
76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbolRefExpr::VariantKind Modifier = getAccessVariant(Target, Fixup);
77aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella
78f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  // determine the type of the relocation
79f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  unsigned Type;
80f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  if (IsPCRel) {
81f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    switch ((unsigned)Fixup.getKind()) {
82f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    default:
83f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      llvm_unreachable("Unimplemented");
84f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    case PPC::fixup_ppc_br24:
859679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand    case PPC::fixup_ppc_br24abs:
86f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      Type = ELF::R_PPC_REL24;
87f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
888ade90930863acf94fbb2ccd91acefcf114c1f3eUlrich Weigand    case PPC::fixup_ppc_brcond14:
899679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand    case PPC::fixup_ppc_brcond14abs:
908ade90930863acf94fbb2ccd91acefcf114c1f3eUlrich Weigand      Type = ELF::R_PPC_REL14;
918ade90930863acf94fbb2ccd91acefcf114c1f3eUlrich Weigand      break;
9284569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand    case PPC::fixup_ppc_half16:
9384569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      switch (Modifier) {
9484569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      default: llvm_unreachable("Unsupported Modifier");
9584569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      case MCSymbolRefExpr::VK_None:
9684569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        Type = ELF::R_PPC_REL16;
9784569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        break;
9884569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      case MCSymbolRefExpr::VK_PPC_LO:
9984569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        Type = ELF::R_PPC_REL16_LO;
10084569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        break;
10184569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      case MCSymbolRefExpr::VK_PPC_HI:
10284569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        Type = ELF::R_PPC_REL16_HI;
10384569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        break;
10484569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      case MCSymbolRefExpr::VK_PPC_HA:
10584569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        Type = ELF::R_PPC_REL16_HA;
10684569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand        break;
10784569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      }
10884569698f01bcb49afe5b6140bf0d61cf4f3cf5aUlrich Weigand      break;
1097b449889e7886b263718b5103538970f287bc37eAdhemerval Zanella    case FK_Data_4:
110f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    case FK_PCRel_4:
111f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      Type = ELF::R_PPC_REL32;
112f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
1137b449889e7886b263718b5103538970f287bc37eAdhemerval Zanella    case FK_Data_8:
1147b449889e7886b263718b5103538970f287bc37eAdhemerval Zanella    case FK_PCRel_8:
1157b449889e7886b263718b5103538970f287bc37eAdhemerval Zanella      Type = ELF::R_PPC64_REL64;
1167b449889e7886b263718b5103538970f287bc37eAdhemerval Zanella      break;
117f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    }
118f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  } else {
119f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    switch ((unsigned)Fixup.getKind()) {
120f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      default: llvm_unreachable("invalid fixup kind!");
1219679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand    case PPC::fixup_ppc_br24abs:
122f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      Type = ELF::R_PPC_ADDR24;
123f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
1249679c47a07386cbf3547a0927609c7ee080b2aabUlrich Weigand    case PPC::fixup_ppc_brcond14abs:
125aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      Type = ELF::R_PPC_ADDR14; // XXX: or BRNTAKEN?_
126f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
127e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand    case PPC::fixup_ppc_half16:
128ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand      switch (Modifier) {
129ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand      default: llvm_unreachable("Unsupported Modifier");
130769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand      case MCSymbolRefExpr::VK_None:
131769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC_ADDR16;
132ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand        break;
13392cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_LO:
134769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC_ADDR16_LO;
135349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        break;
136d2849572463da994c685b3bd7a60d5a7566c01e3Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_HI:
137d2849572463da994c685b3bd7a60d5a7566c01e3Ulrich Weigand        Type = ELF::R_PPC_ADDR16_HI;
138d2849572463da994c685b3bd7a60d5a7566c01e3Ulrich Weigand        break;
13992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_HA:
140ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand        Type = ELF::R_PPC_ADDR16_HA;
14134a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt        break;
142f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_HIGHER:
143f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        Type = ELF::R_PPC64_ADDR16_HIGHER;
144f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        break;
145f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_HIGHERA:
146f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        Type = ELF::R_PPC64_ADDR16_HIGHERA;
147f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        break;
148f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_HIGHEST:
149f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        Type = ELF::R_PPC64_ADDR16_HIGHEST;
150f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        break;
151f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_HIGHESTA:
152f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        Type = ELF::R_PPC64_ADDR16_HIGHESTA;
153f7c1ee79fe90353fcd3f545f9d45a01a837bbf4bUlrich Weigand        break;
1545de735a962a255676cf3a9bc255579d465670633Ulrich Weigand      case MCSymbolRefExpr::VK_GOT:
1555de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        Type = ELF::R_PPC_GOT16;
1565de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        break;
1575de735a962a255676cf3a9bc255579d465670633Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_LO:
1585de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        Type = ELF::R_PPC_GOT16_LO;
1595de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        break;
1605de735a962a255676cf3a9bc255579d465670633Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_HI:
1615de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        Type = ELF::R_PPC_GOT16_HI;
1625de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        break;
1635de735a962a255676cf3a9bc255579d465670633Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_HA:
1645de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        Type = ELF::R_PPC_GOT16_HA;
1655de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        break;
16692cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TOC:
167769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_TOC16;
168b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt        break;
16992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TOC_LO:
170769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_TOC16_LO;
17157ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt        break;
172f8f87dcfceadd1b842d130303a7091ad7d7d67d0Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TOC_HI:
173f8f87dcfceadd1b842d130303a7091ad7d7d67d0Ulrich Weigand        Type = ELF::R_PPC64_TOC16_HI;
174f8f87dcfceadd1b842d130303a7091ad7d7d67d0Ulrich Weigand        break;
17592cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TOC_HA:
176769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_TOC16_HA;
177349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        break;
178cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL:
179cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC_TPREL16;
180cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
18192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_LO:
182ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand        Type = ELF::R_PPC_TPREL16_LO;
183ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand        break;
184cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_HI:
185cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC_TPREL16_HI;
186cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
18792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_HA:
188769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC_TPREL16_HA;
189769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        break;
190cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
191cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_TPREL16_HIGHER;
192cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
193cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
194cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_TPREL16_HIGHERA;
195cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
196cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
197cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_TPREL16_HIGHEST;
198cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
199cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
200cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_TPREL16_HIGHESTA;
201cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
202cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL:
203cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16;
204cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
20592cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
206349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        Type = ELF::R_PPC64_DTPREL16_LO;
207349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        break;
208cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
209cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_HI;
210cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
21192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
212769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_HA;
21334a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt        break;
214cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
215cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_HIGHER;
216cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
217cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
218cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_HIGHERA;
219cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
220cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
221cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_HIGHEST;
222cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
223cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
224cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_HIGHESTA;
225cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
226cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
227cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_TLSGD16;
228cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
22992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
23057ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt        Type = ELF::R_PPC64_GOT_TLSGD16_LO;
23157ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt        break;
232cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
233cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_TLSGD16_HI;
234cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
23592cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
236769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_GOT_TLSGD16_HA;
237769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        break;
238cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
239cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_TLSLD16;
240cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
24192cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
242349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        Type = ELF::R_PPC64_GOT_TLSLD16_LO;
243349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        break;
244cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
245cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_TLSLD16_HI;
246cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
24792cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
248769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_GOT_TLSLD16_HA;
249769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        break;
250457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
251457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        /* We don't have R_PPC64_GOT_TPREL16, but since GOT offsets
252457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand           are always 4-aligned, we can use R_PPC64_GOT_TPREL16_DS.  */
253457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        Type = ELF::R_PPC64_GOT_TPREL16_DS;
254457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        break;
255457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
256457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        /* We don't have R_PPC64_GOT_TPREL16_LO, but since GOT offsets
257457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand           are always 4-aligned, we can use R_PPC64_GOT_TPREL16_LO_DS.  */
258457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        Type = ELF::R_PPC64_GOT_TPREL16_LO_DS;
259457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        break;
260cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
261cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_TPREL16_HI;
262cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
263457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
264457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        /* We don't have R_PPC64_GOT_DTPREL16, but since GOT offsets
265457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand           are always 4-aligned, we can use R_PPC64_GOT_DTPREL16_DS.  */
266457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        Type = ELF::R_PPC64_GOT_DTPREL16_DS;
267457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        break;
268457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
269457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        /* We don't have R_PPC64_GOT_DTPREL16_LO, but since GOT offsets
270457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand           are always 4-aligned, we can use R_PPC64_GOT_DTPREL16_LO_DS.  */
271457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        Type = ELF::R_PPC64_GOT_DTPREL16_LO_DS;
272457571ed6977f78ca8d30b993fa7e86e2d7ad8d5Ulrich Weigand        break;
27392cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
274769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        Type = ELF::R_PPC64_GOT_TPREL16_HA;
275769accfb4d71caff9152309eaa5e704e065b5846Ulrich Weigand        break;
276cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
277cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_DTPREL16_HI;
278cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
279cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
280cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_DTPREL16_HA;
281cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
282ba6086818d9c5070061f74ac9944666b4312c6f0Ulrich Weigand      }
283f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
284e152eac63efa836cbb109d79e4307516fa16f1a6Ulrich Weigand    case PPC::fixup_ppc_half16ds:
28506ab2c828a5605abec36eb0d6749940fa6eb7391Bill Schmidt      switch (Modifier) {
28606ab2c828a5605abec36eb0d6749940fa6eb7391Bill Schmidt      default: llvm_unreachable("Unsupported Modifier");
28706ab2c828a5605abec36eb0d6749940fa6eb7391Bill Schmidt      case MCSymbolRefExpr::VK_None:
28865e90c036472380bba160c349412f37128608e1cUlrich Weigand        Type = ELF::R_PPC64_ADDR16_DS;
28906ab2c828a5605abec36eb0d6749940fa6eb7391Bill Schmidt        break;
29092cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_LO:
291a3967b6844f4be588c724ada3692e734bba65cf1Ulrich Weigand        Type = ELF::R_PPC64_ADDR16_LO_DS;
292a3967b6844f4be588c724ada3692e734bba65cf1Ulrich Weigand        break;
2935de735a962a255676cf3a9bc255579d465670633Ulrich Weigand      case MCSymbolRefExpr::VK_GOT:
2945de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        Type = ELF::R_PPC64_GOT16_DS;
2955de735a962a255676cf3a9bc255579d465670633Ulrich Weigand	break;
2965de735a962a255676cf3a9bc255579d465670633Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_LO:
2975de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        Type = ELF::R_PPC64_GOT16_LO_DS;
2985de735a962a255676cf3a9bc255579d465670633Ulrich Weigand        break;
29992cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TOC:
30034a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt        Type = ELF::R_PPC64_TOC16_DS;
30134a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt	break;
30292cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TOC_LO:
30334a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt        Type = ELF::R_PPC64_TOC16_LO_DS;
30434a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt        break;
305cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL:
306cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_TPREL16_DS;
307cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
308cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL_LO:
309cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_TPREL16_LO_DS;
310cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
311cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL:
312cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_DS;
313cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
314cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
315cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_DTPREL16_LO_DS;
316cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
317cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
318cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_TPREL16_DS;
319cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
32092cfa61c50d01307d658753f8d47f4e8555a6fa9Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
321b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt        Type = ELF::R_PPC64_GOT_TPREL16_LO_DS;
322d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt        break;
323cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
324cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_DTPREL16_DS;
325cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
326cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
327cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        Type = ELF::R_PPC64_GOT_DTPREL16_LO_DS;
328cab0a1933875935c717136d251e2af9749533ba8Ulrich Weigand        break;
32934a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      }
330aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      break;
331349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt    case PPC::fixup_ppc_nofixup:
332349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      switch (Modifier) {
333349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      default: llvm_unreachable("Unsupported Modifier");
3347a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TLSGD:
335349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        Type = ELF::R_PPC64_TLSGD;
336349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        break;
3377a34599db017a5486cf7cd11eb124984acec8286Ulrich Weigand      case MCSymbolRefExpr::VK_PPC_TLSLD:
338349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        Type = ELF::R_PPC64_TLSLD;
339349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt        break;
34023a72c8f7e46618ff8dbdbba4e8c1a2c4e44e3dfUlrich Weigand      case MCSymbolRefExpr::VK_PPC_TLS:
34123a72c8f7e46618ff8dbdbba4e8c1a2c4e44e3dfUlrich Weigand        Type = ELF::R_PPC64_TLS;
34223a72c8f7e46618ff8dbdbba4e8c1a2c4e44e3dfUlrich Weigand        break;
343349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      }
34457ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      break;
345aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella    case FK_Data_8:
346aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      switch (Modifier) {
347aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      default: llvm_unreachable("Unsupported Modifier");
348846565924a6f2932efc75c249b29c3619e587bbbUlrich Weigand      case MCSymbolRefExpr::VK_PPC_TOCBASE:
349aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella        Type = ELF::R_PPC64_TOC;
350aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella        break;
351aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      case MCSymbolRefExpr::VK_None:
352aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella        Type = ELF::R_PPC64_ADDR64;
353aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella	break;
354228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPMOD:
355228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand        Type = ELF::R_PPC64_DTPMOD64;
356228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand	break;
357228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_TPREL:
358228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand        Type = ELF::R_PPC64_TPREL64;
359228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand	break;
360228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand      case MCSymbolRefExpr::VK_PPC_DTPREL:
361228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand        Type = ELF::R_PPC64_DTPREL64;
362228e0afcfd0d5f167a95c6ddbec2c6a4a90b6d2bUlrich Weigand	break;
363aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      }
364aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella      break;
365f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    case FK_Data_4:
366f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      Type = ELF::R_PPC_ADDR32;
367f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
368f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    case FK_Data_2:
369f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      Type = ELF::R_PPC_ADDR16;
370f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola      break;
371f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola    }
372f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  }
373f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  return Type;
374f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola}
375f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola
376aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanellaunsigned PPCELFObjectWriter::GetRelocType(const MCValue &Target,
377aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella                                          const MCFixup &Fixup,
37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          bool IsPCRel) const {
379aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella  return getRelocTypeInner(Target, Fixup, IsPCRel);
380aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella}
381aa71428378c1cb491ca60041d8ba7aa110bc963dAdhemerval Zanella
382f3a86fb03d196994dc7923351f15d8ed9343013eRafael EspindolaMCObjectWriter *llvm::createPPCELFObjectWriter(raw_ostream &OS,
383f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola                                               bool Is64Bit,
38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                               bool IsLittleEndian,
385f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola                                               uint8_t OSABI) {
386f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola  MCELFObjectTargetWriter *MOTW = new PPCELFObjectWriter(Is64Bit, OSABI);
38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return createELFObjectWriter(MOTW, OS, IsLittleEndian);
388f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola}
389