1edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola//===-- X86ELFObjectWriter.cpp - X86 ELF Writer ---------------------------===//
2edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola//
3edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola//                     The LLVM Compiler Infrastructure
4edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola//
5edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola// This file is distributed under the University of Illinois Open Source
6edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola// License. See LICENSE.TXT for details.
7edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola//
8edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola//===----------------------------------------------------------------------===//
9edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
10edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "MCTargetDesc/X86FixupKinds.h"
11edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "MCTargetDesc/X86MCTargetDesc.h"
12edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "llvm/MC/MCELFObjectWriter.h"
13edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "llvm/MC/MCExpr.h"
14edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "llvm/MC/MCValue.h"
15edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "llvm/Support/ELF.h"
16edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola#include "llvm/Support/ErrorHandling.h"
17edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
18edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindolausing namespace llvm;
19edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
20edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindolanamespace {
21edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola  class X86ELFObjectWriter : public MCELFObjectTargetWriter {
22edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola  public:
23678c35c3861df3d5882553da45e79a89dae20294Michael Liao    X86ELFObjectWriter(bool IsELF64, uint8_t OSABI, uint16_t EMachine);
24edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
252c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    ~X86ELFObjectWriter() override;
262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
27edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola  protected:
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                          bool IsPCRel) const override;
30edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola  };
31edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola}
32edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
33678c35c3861df3d5882553da45e79a89dae20294Michael LiaoX86ELFObjectWriter::X86ELFObjectWriter(bool IsELF64, uint8_t OSABI,
34678c35c3861df3d5882553da45e79a89dae20294Michael Liao                                       uint16_t EMachine)
35678c35c3861df3d5882553da45e79a89dae20294Michael Liao  : MCELFObjectTargetWriter(IsELF64, OSABI, EMachine,
36678c35c3861df3d5882553da45e79a89dae20294Michael Liao                            // Only i386 uses Rel instead of RelA.
37678c35c3861df3d5882553da45e79a89dae20294Michael Liao                            /*HasRelocationAddend*/ EMachine != ELF::EM_386) {}
38edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
39edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael EspindolaX86ELFObjectWriter::~X86ELFObjectWriter()
40edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola{}
41edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarenum X86_64RelType { RT64_64, RT64_32, RT64_32S, RT64_16, RT64_8 };
43edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic X86_64RelType getType64(unsigned Kind,
454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                               MCSymbolRefExpr::VariantKind &Modifier,
464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                               bool &IsPCRel) {
474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (Kind) {
484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Unimplemented");
504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case X86::reloc_global_offset_table8:
514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Modifier = MCSymbolRefExpr::VK_GOT;
524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    IsPCRel = true;
534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_64;
544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case FK_Data_8:
554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_64;
564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case X86::reloc_signed_4byte:
574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    if (Modifier == MCSymbolRefExpr::VK_None && !IsPCRel)
584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return RT64_32S;
594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_32;
604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case X86::reloc_global_offset_table:
614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    Modifier = MCSymbolRefExpr::VK_GOT;
624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    IsPCRel = true;
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_32;
644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case FK_Data_4:
654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case FK_PCRel_4:
664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case X86::reloc_riprel_4byte:
674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case X86::reloc_riprel_4byte_movq_load:
684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_32;
694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case FK_Data_2:
704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_16;
714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case FK_PCRel_1:
724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case FK_Data_1:
734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT64_8;
744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
76edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic unsigned getRelocType64(MCSymbolRefExpr::VariantKind Modifier,
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                               X86_64RelType Type, bool IsPCRel) {
794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (Modifier) {
804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Unimplemented");
824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_None:
834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    switch (Type) {
844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_64:
854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_X86_64_PC64 : ELF::R_X86_64_64;
864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32:
874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_X86_64_PC32 : ELF::R_X86_64_32;
884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32S:
894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_32S;
904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_16:
914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_X86_64_PC16 : ELF::R_X86_64_16;
924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_8:
934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_X86_64_PC8 : ELF::R_X86_64_8;
94edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola    }
954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOT:
964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    switch (Type) {
974c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_64:
984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_X86_64_GOTPC64 : ELF::R_X86_64_GOT64;
994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32:
1004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_X86_64_GOTPC32 : ELF::R_X86_64_GOT32;
1014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32S:
1024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_16:
1034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_8:
1044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      llvm_unreachable("Unimplemented");
1054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    }
1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOTOFF:
1074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT64_64);
1084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
1094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_X86_64_GOTOFF64;
1104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_TPOFF:
1114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
1124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    switch (Type) {
1134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_64:
1144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_TPOFF64;
1154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32:
1164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_TPOFF32;
1174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32S:
1184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_16:
1194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_8:
1204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      llvm_unreachable("Unimplemented");
1214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    }
1224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_DTPOFF:
1234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
1244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    switch (Type) {
1254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_64:
1264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_DTPOFF64;
1274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32:
1284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_DTPOFF32;
1294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32S:
1304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_16:
1314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_8:
1324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      llvm_unreachable("Unimplemented");
1334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    }
1344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_SIZE:
1354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
1364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    switch (Type) {
1374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_64:
1384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_SIZE64;
1394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32:
1404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return ELF::R_X86_64_SIZE32;
1414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_32S:
1424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_16:
1434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT64_8:
1444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      llvm_unreachable("Unimplemented");
1454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    }
1464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_TLSGD:
1474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT64_32);
1484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_X86_64_TLSGD;
1494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOTTPOFF:
1504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT64_32);
1514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_X86_64_GOTTPOFF;
1524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_TLSLD:
1534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT64_32);
1544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_X86_64_TLSLD;
1554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_PLT:
1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT64_32);
1574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_X86_64_PLT32;
1584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOTPCREL:
1594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT64_32);
1604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_X86_64_GOTPCREL;
1614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarenum X86_32RelType { RT32_32, RT32_16, RT32_8 };
165edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
1664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic X86_32RelType getType32(X86_64RelType T) {
1674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (T) {
1684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case RT64_64:
1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Unimplemented");
1704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case RT64_32:
1714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case RT64_32S:
1724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT32_32;
1734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case RT64_16:
1744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT32_16;
1754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case RT64_8:
1764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return RT32_8;
1774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
1784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  llvm_unreachable("unexpected relocation type!");
1794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
180edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
1814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic unsigned getRelocType32(MCSymbolRefExpr::VariantKind Modifier,
1824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                               X86_32RelType Type, bool IsPCRel) {
1834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (Modifier) {
1844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
1854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Unimplemented");
1864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_None:
1874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    switch (Type) {
1884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT32_32:
1894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_386_PC32 : ELF::R_386_32;
1904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT32_16:
1914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_386_PC16 : ELF::R_386_16;
1924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    case RT32_8:
1934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      return IsPCRel ? ELF::R_386_PC8 : ELF::R_386_8;
194edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola    }
1954c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOT:
1964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
1974c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return IsPCRel ? ELF::R_386_GOTPC : ELF::R_386_GOT32;
1984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOTOFF:
1994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_GOTOFF;
2024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_TPOFF:
2034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_LE_32;
2064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_DTPOFF:
2074c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2084c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2094c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_LDO_32;
2104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_TLSGD:
2114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_GD;
2144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOTTPOFF:
2154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_IE_32;
2184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_PLT:
2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_PLT32;
2214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_INDNTPOFF:
2224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_IE;
2254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_NTPOFF:
2264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_LE;
2294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_GOTNTPOFF:
2304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_GOTIE;
2334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case MCSymbolRefExpr::VK_TLSLDM:
2344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(Type == RT32_32);
2354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    assert(!IsPCRel);
2364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return ELF::R_386_TLS_LDM;
2374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
2384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
2394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
2404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarunsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
2414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                          const MCFixup &Fixup,
2424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                          bool IsPCRel) const {
2434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
2444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  X86_64RelType Type = getType64(Fixup.getKind(), Modifier, IsPCRel);
2454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (getEMachine() == ELF::EM_X86_64)
2464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return getRelocType64(Modifier, Type, IsPCRel);
247edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
2484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  assert(getEMachine() == ELF::EM_386 && "Unsupported ELF machine type.");
2494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return getRelocType32(Modifier, getType32(Type), IsPCRel);
250edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola}
251edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola
2522c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga NainarMCObjectWriter *llvm::createX86ELFObjectWriter(raw_pwrite_stream &OS,
2532c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                                               bool IsELF64, uint8_t OSABI,
254678c35c3861df3d5882553da45e79a89dae20294Michael Liao                                               uint16_t EMachine) {
255edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola  MCELFObjectTargetWriter *MOTW =
256678c35c3861df3d5882553da45e79a89dae20294Michael Liao    new X86ELFObjectWriter(IsELF64, OSABI, EMachine);
257edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola  return createELFObjectWriter(MOTW, OS,  /*IsLittleEndian=*/true);
258edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola}
259