X86WinCOFFObjectWriter.cpp revision df09270ae897e7fa64a7c162de163c32ee181a03
1df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola//===-- X86WinCOFFObjectWriter.cpp - X86 Win COFF Writer ------------------===// 2df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola// 3df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola// The LLVM Compiler Infrastructure 4df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola// 5df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola// This file is distributed under the University of Illinois Open Source 6df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola// License. See LICENSE.TXT for details. 7df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola// 8df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola//===----------------------------------------------------------------------===// 9df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 10df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola#include "MCTargetDesc/X86FixupKinds.h" 11df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola#include "MCTargetDesc/X86MCTargetDesc.h" 12df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola#include "llvm/MC/MCWinCOFFObjectWriter.h" 13df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola#include "llvm/Support/COFF.h" 14df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola#include "llvm/Support/ErrorHandling.h" 15df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 16df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindolausing namespace llvm; 17df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 18df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindolanamespace llvm { 19df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola class MCObjectWriter; 20df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola} 21df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 22df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindolanamespace { 23df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola class X86WinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter { 24df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola const bool Is64Bit; 25df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 26df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola public: 27df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola X86WinCOFFObjectWriter(bool Is64Bit_); 28df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola ~X86WinCOFFObjectWriter(); 29df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 30df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola virtual unsigned getRelocType(unsigned FixupKind) const; 31df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola }; 32df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola} 33df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 34df09270ae897e7fa64a7c162de163c32ee181a03Rafael EspindolaX86WinCOFFObjectWriter::X86WinCOFFObjectWriter(bool Is64Bit_) 35df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola : MCWinCOFFObjectTargetWriter(Is64Bit_ ? COFF::IMAGE_FILE_MACHINE_AMD64 : 36df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola COFF::IMAGE_FILE_MACHINE_I386), 37df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola Is64Bit(Is64Bit_) {} 38df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 39df09270ae897e7fa64a7c162de163c32ee181a03Rafael EspindolaX86WinCOFFObjectWriter::~X86WinCOFFObjectWriter() {} 40df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 41df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindolaunsigned X86WinCOFFObjectWriter::getRelocType(unsigned FixupKind) const { 42df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola switch (FixupKind) { 43df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case FK_PCRel_4: 44df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case X86::reloc_riprel_4byte: 45df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case X86::reloc_riprel_4byte_movq_load: 46df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola return Is64Bit ? COFF::IMAGE_REL_AMD64_REL32 : COFF::IMAGE_REL_I386_REL32; 47df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola break; 48df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case FK_Data_4: 49df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case X86::reloc_signed_4byte: 50df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola return Is64Bit ? COFF::IMAGE_REL_AMD64_ADDR32 : COFF::IMAGE_REL_I386_DIR32; 51df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola break; 52df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case FK_Data_8: 53df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola if (Is64Bit) 54df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola return COFF::IMAGE_REL_AMD64_ADDR64; 55df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola else 56df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola llvm_unreachable("unsupported relocation type"); 57df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola break; 58df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola case X86::reloc_coff_secrel32: 59df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola return Is64Bit ? COFF::IMAGE_REL_AMD64_SREL32 : COFF::IMAGE_REL_I386_SECREL; 60df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola break; 61df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola default: 62df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola llvm_unreachable("unsupported relocation type"); 63df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola } 64df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola} 65df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola 66df09270ae897e7fa64a7c162de163c32ee181a03Rafael EspindolaMCObjectWriter *llvm::createX86WinCOFFObjectWriter(raw_ostream &OS, 67df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola bool Is64Bit) { 68df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola MCWinCOFFObjectTargetWriter *MOTW = new X86WinCOFFObjectWriter(Is64Bit); 69df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola return createWinCOFFObjectWriter(MOTW, OS); 70df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola} 71