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: 23edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola X86ELFObjectWriter(bool is64Bit, uint8_t OSABI); 24edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 25edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola virtual ~X86ELFObjectWriter(); 26edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola protected: 27edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, 28edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola bool IsPCRel, bool IsRelocWithSymbol, 29edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola int64_t Addend) const; 30edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola }; 31edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola} 32edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 33edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael EspindolaX86ELFObjectWriter::X86ELFObjectWriter(bool Is64Bit, uint8_t OSABI) 34edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola : MCELFObjectTargetWriter(Is64Bit, OSABI, 35edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Is64Bit ? ELF::EM_X86_64 : ELF::EM_386, 36edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola /*HasRelocationAddend*/ Is64Bit) {} 37edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 38edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael EspindolaX86ELFObjectWriter::~X86ELFObjectWriter() 39edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola{} 40edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 41edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindolaunsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target, 42edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola const MCFixup &Fixup, 43edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola bool IsPCRel, 44edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola bool IsRelocWithSymbol, 45edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola int64_t Addend) const { 46edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola // determine the type of the relocation 47edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 48edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ? 49edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); 50edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola unsigned Type; 51edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola if (is64Bit()) { 52edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola if (IsPCRel) { 53edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch ((unsigned)Fixup.getKind()) { 54edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: llvm_unreachable("invalid fixup kind!"); 55edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 56edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_8: Type = ELF::R_X86_64_PC64; break; 57edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_4: Type = ELF::R_X86_64_PC32; break; 58edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_2: Type = ELF::R_X86_64_PC16; break; 59edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 60edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_8: 61edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola assert(Modifier == MCSymbolRefExpr::VK_None); 62edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_PC64; 63edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 64edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_signed_4byte: 65edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_riprel_4byte_movq_load: 66edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_riprel_4byte: 67edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_4: 68edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch (Modifier) { 69edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: 70edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola llvm_unreachable("Unimplemented"); 71edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_None: 72edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_PC32; 73edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 74edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_PLT: 75edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_PLT32; 76edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 77edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOTPCREL: 78edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_GOTPCREL; 79edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 80edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOTTPOFF: 81edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_GOTTPOFF; 82edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 83edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_TLSGD: 84edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_TLSGD; 85edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 86edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_TLSLD: 87edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_TLSLD; 88edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 89edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 90edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 91edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_2: 92edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola assert(Modifier == MCSymbolRefExpr::VK_None); 93edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_PC16; 94edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 95edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_1: 96edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola assert(Modifier == MCSymbolRefExpr::VK_None); 97edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_PC8; 98edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 99edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 100edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } else { 101edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch ((unsigned)Fixup.getKind()) { 102edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: llvm_unreachable("invalid fixup kind!"); 103edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_8: Type = ELF::R_X86_64_64; break; 104edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_signed_4byte: 105edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch (Modifier) { 106edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: 107edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola llvm_unreachable("Unimplemented"); 108edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_None: 109edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_32S; 110edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 111edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOT: 112edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_GOT32; 113edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 114edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOTPCREL: 115edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_GOTPCREL; 116edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 117edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_TPOFF: 118edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_TPOFF32; 119edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 120edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_DTPOFF: 121edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_DTPOFF32; 122edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 123edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 124edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 125edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_4: 126edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_X86_64_32; 127edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 128edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_2: Type = ELF::R_X86_64_16; break; 129edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_1: 130edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_1: Type = ELF::R_X86_64_8; break; 131edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 132edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 133edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } else { 134edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola if (IsPCRel) { 135edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch ((unsigned)Fixup.getKind()) { 136edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: llvm_unreachable("invalid fixup kind!"); 137edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 138edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_global_offset_table: 139edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_GOTPC; 140edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 141edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 142edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_signed_4byte: 143edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_4: 144edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_4: 145edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch (Modifier) { 146edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: 147edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola llvm_unreachable("Unimplemented"); 148edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_None: 149edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_PC32; 150edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 151edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_PLT: 152edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_PLT32; 153edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 154edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 155edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 156edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 157edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } else { 158edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch ((unsigned)Fixup.getKind()) { 159edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: llvm_unreachable("invalid fixup kind!"); 160edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 161edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_global_offset_table: 162edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_GOTPC; 163edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 164edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 165edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola // FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode 166edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola // instead? 167edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case X86::reloc_signed_4byte: 168edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_4: 169edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_4: 170edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola switch (Modifier) { 171edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola default: 172edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola llvm_unreachable("Unimplemented"); 173edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_None: 174edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_32; 175edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 176edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOT: 177edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_GOT32; 178edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 179edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOTOFF: 180edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_GOTOFF; 181edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 182edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_TLSGD: 183edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_GD; 184edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 185edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_TPOFF: 186edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_LE_32; 187edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 188edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_INDNTPOFF: 189edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_IE; 190edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 191edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_NTPOFF: 192edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_LE; 193edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 194edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOTNTPOFF: 195edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_GOTIE; 196edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 197edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_TLSLDM: 198edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_LDM; 199edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 200edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_DTPOFF: 201edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_LDO_32; 202edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 203edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case MCSymbolRefExpr::VK_GOTTPOFF: 204edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola Type = ELF::R_386_TLS_IE_32; 205edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 206edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 207edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola break; 208edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_2: Type = ELF::R_386_16; break; 209edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_PCRel_1: 210edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola case FK_Data_1: Type = ELF::R_386_8; break; 211edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 212edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 213edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola } 214edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 215edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola return Type; 216edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola} 217edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 218edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael EspindolaMCObjectWriter *llvm::createX86ELFObjectWriter(raw_ostream &OS, 219edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola bool Is64Bit, 220edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola uint8_t OSABI) { 221edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola MCELFObjectTargetWriter *MOTW = 222edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola new X86ELFObjectWriter(Is64Bit, OSABI); 223edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/true); 224edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola} 225