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