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