MCELFObjectWriter.h revision 84070ffbe6905f31cf369ad3f6742dfa5188332c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- llvm/MC/MCELFObjectWriter.h - ELF Object Writer ---------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef LLVM_MC_MCELFOBJECTWRITER_H
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define LLVM_MC_MCELFOBJECTWRITER_H
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/MC/MCObjectWriter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/DataTypes.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/ELF.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MCELFObjectTargetWriter {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8_t OSABI;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint16_t EMachine;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned HasRelocationAddend : 1;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const unsigned Is64Bit : 1;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MCELFObjectTargetWriter(bool Is64Bit_, uint8_t OSABI_,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          uint16_t EMachine_,  bool HasRelocationAddend_);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static uint8_t getOSABI(Triple::OSType OSType) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (OSType) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Triple::FreeBSD:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return ELF::ELFOSABI_FREEBSD;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case Triple::Linux:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return ELF::ELFOSABI_LINUX;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return ELF::ELFOSABI_NONE;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MCELFObjectTargetWriter() {}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned GetRelocType(const MCValue &Target, const MCFixup &Fixup,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool IsPCRel, bool IsRelocWithSymbol,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                int64_t Addend) const = 0;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual unsigned getEFlags() const;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const MCSymbol *ExplicitRelSym(const MCAssembler &Asm,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const MCValue &Target,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const MCFragment &F,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const MCFixup &Fixup,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         bool IsPCRel) const;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void adjustFixupOffset(const MCFixup &Fixup,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 uint64_t &RelocOffset);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @name Accessors
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @{
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8_t getOSABI() { return OSABI; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16_t getEMachine() { return EMachine; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasRelocationAddend() { return HasRelocationAddend; }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is64Bit() const { return Is64Bit; }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Construct a new ELF writer instance.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \param MOTW - The target specific ELF writer subclass.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \param OS - The stream to write to.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \returns The constructed object writer.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MCObjectWriter *createELFObjectWriter(MCELFObjectTargetWriter *MOTW,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      raw_ostream &OS, bool IsLittleEndian);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // End llvm namespace
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)