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