MCELFObjectWriter.h revision 84070ffbe6905f31cf369ad3f6742dfa5188332c
1285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola//===-- llvm/MC/MCELFObjectWriter.h - ELF Object Writer ---------*- C++ -*-===// 2285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola// 3285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola// The LLVM Compiler Infrastructure 4285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola// 5285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola// This file is distributed under the University of Illinois Open Source 6285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola// License. See LICENSE.TXT for details. 7285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola// 8285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola//===----------------------------------------------------------------------===// 9285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola 10285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola#ifndef LLVM_MC_MCELFOBJECTWRITER_H 11285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola#define LLVM_MC_MCELFOBJECTWRITER_H 12285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola 13285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola#include "llvm/MC/MCObjectWriter.h" 14285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola#include "llvm/Support/DataTypes.h" 15dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola#include "llvm/Support/ELF.h" 16285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola 17285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindolanamespace llvm { 186024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindolaclass MCELFObjectTargetWriter { 19dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola const uint8_t OSABI; 20bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola const uint16_t EMachine; 21bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola const unsigned HasRelocationAddend : 1; 22bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola const unsigned Is64Bit : 1; 23dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola 246024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindolaprotected: 25dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola 26dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola MCELFObjectTargetWriter(bool Is64Bit_, uint8_t OSABI_, 27bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola uint16_t EMachine_, bool HasRelocationAddend_); 286024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindola 296024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindolapublic: 30dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola static uint8_t getOSABI(Triple::OSType OSType) { 31dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola switch (OSType) { 32dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola case Triple::FreeBSD: 33dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola return ELF::ELFOSABI_FREEBSD; 34dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola case Triple::Linux: 35dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola return ELF::ELFOSABI_LINUX; 36dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola default: 37dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola return ELF::ELFOSABI_NONE; 38dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola } 39dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola } 40dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola 4184070ffbe6905f31cf369ad3f6742dfa5188332cRafael Espindola virtual ~MCELFObjectTargetWriter() {} 42bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola 43edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup, 44edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola bool IsPCRel, bool IsRelocWithSymbol, 45ceb09f38845a26f0f806946a611b42c6932d6504Rafael Espindola int64_t Addend) const = 0; 4669bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola virtual unsigned getEFlags() const; 4769bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm, 4869bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola const MCValue &Target, 4969bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola const MCFragment &F, 5069bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola const MCFixup &Fixup, 5169bbda03918a18bd4477bb254d51346ee3033567Rafael Espindola bool IsPCRel) const; 52f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola virtual void adjustFixupOffset(const MCFixup &Fixup, 53f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola uint64_t &RelocOffset); 54f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola 55edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola 56bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola /// @name Accessors 57bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola /// @{ 58dc9a8a378daf432d8dcfc178507afe149706f9a6Rafael Espindola uint8_t getOSABI() { return OSABI; } 59bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola uint16_t getEMachine() { return EMachine; } 60bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola bool hasRelocationAddend() { return HasRelocationAddend; } 61d4304031cb465ca85e2bebb352b7cde5a92a1c39Rafael Espindola bool is64Bit() const { return Is64Bit; } 62bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola /// @} 636024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindola}; 646024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindola 65285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola/// \brief Construct a new ELF writer instance. 66285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola/// 676024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael Espindola/// \param MOTW - The target specific ELF writer subclass. 68285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola/// \param OS - The stream to write to. 69285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola/// \returns The constructed object writer. 706024c97ffa15766bc0f200ffd309d9e017ae0d4bRafael EspindolaMCObjectWriter *createELFObjectWriter(MCELFObjectTargetWriter *MOTW, 71bff66a86e6e44dc7424cd2d7719ac80630b3a5f8Rafael Espindola raw_ostream &OS, bool IsLittleEndian); 72285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola} // End llvm namespace 73285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola 74285b3e5b61af15f11e59a7700375aefa2a326bd8Rafael Espindola#endif 75