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