//===-- llvm/Target/TargetELFWriterInfo.h - ELF Writer Info -----*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the TargetELFWriterInfo class.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TARGET_TARGETELFWRITERINFO_H
#define LLVM_TARGET_TARGETELFWRITERINFO_H

namespace llvm {
  class Function;
  class TargetData;
  class TargetMachine;

  //===--------------------------------------------------------------------===//
  //                          TargetELFWriterInfo
  //===--------------------------------------------------------------------===//

  class TargetELFWriterInfo {
  protected:
    // EMachine - This field is the target specific value to emit as the
    // e_machine member of the ELF header.
    unsigned short EMachine;
    bool is64Bit, isLittleEndian;
  public:

    // Machine architectures
    enum MachineType {
      EM_NONE = 0,     // No machine
      EM_M32 = 1,      // AT&T WE 32100
      EM_SPARC = 2,    // SPARC
      EM_386 = 3,      // Intel 386
      EM_68K = 4,      // Motorola 68000
      EM_88K = 5,      // Motorola 88000
      EM_486 = 6,      // Intel 486 (deprecated)
      EM_860 = 7,      // Intel 80860
      EM_MIPS = 8,     // MIPS R3000
      EM_PPC = 20,     // PowerPC
      EM_ARM = 40,     // ARM
      EM_ALPHA = 41,   // DEC Alpha
      EM_SPARCV9 = 43, // SPARC V9
      EM_X86_64 = 62   // AMD64
    };

    // ELF File classes
    enum {
      ELFCLASS32 = 1, // 32-bit object file
      ELFCLASS64 = 2  // 64-bit object file
    };

    // ELF Endianess
    enum {
      ELFDATA2LSB = 1, // Little-endian object file
      ELFDATA2MSB = 2  // Big-endian object file
    };

    explicit TargetELFWriterInfo(bool is64Bit_, bool isLittleEndian_);
    virtual ~TargetELFWriterInfo();

    unsigned short getEMachine() const { return EMachine; }
    unsigned getEFlags() const { return 0; }
    unsigned getEIClass() const { return is64Bit ? ELFCLASS64 : ELFCLASS32; }
    unsigned getEIData() const {
      return isLittleEndian ? ELFDATA2LSB : ELFDATA2MSB;
    }

    /// ELF Header and ELF Section Header Info
    unsigned getHdrSize() const { return is64Bit ? 64 : 52; }
    unsigned getSHdrSize() const { return is64Bit ? 64 : 40; }

    /// Symbol Table Info
    unsigned getSymTabEntrySize() const { return is64Bit ? 24 : 16; }

    /// getPrefELFAlignment - Returns the preferred alignment for ELF. This
    /// is used to align some sections.
    unsigned getPrefELFAlignment() const { return is64Bit ? 8 : 4; }

    /// getRelocationEntrySize - Entry size used in the relocation section
    unsigned getRelocationEntrySize() const {
      return is64Bit ? (hasRelocationAddend() ? 24 : 16)
                     : (hasRelocationAddend() ? 12 : 8);
    }

    /// getRelocationType - Returns the target specific ELF Relocation type.
    /// 'MachineRelTy' contains the object code independent relocation type
    virtual unsigned getRelocationType(unsigned MachineRelTy) const = 0;

    /// hasRelocationAddend - True if the target uses an addend in the
    /// ELF relocation entry.
    virtual bool hasRelocationAddend() const = 0;

    /// getDefaultAddendForRelTy - Gets the default addend value for a
    /// relocation entry based on the target ELF relocation type.
    virtual long int getDefaultAddendForRelTy(unsigned RelTy,
                                              long int Modifier = 0) const = 0;

    /// getRelTySize - Returns the size of relocatable field in bits
    virtual unsigned getRelocationTySize(unsigned RelTy) const = 0;

    /// isPCRelativeRel - True if the relocation type is pc relative
    virtual bool isPCRelativeRel(unsigned RelTy) const = 0;

    /// getJumpTableRelocationTy - Returns the machine relocation type used
    /// to reference a jumptable.
    virtual unsigned getAbsoluteLabelMachineRelTy() const = 0;

    /// computeRelocation - Some relocatable fields could be relocated
    /// directly, avoiding the relocation symbol emission, compute the
    /// final relocation value for this symbol.
    virtual long int computeRelocation(unsigned SymOffset, unsigned RelOffset,
                                       unsigned RelTy) const = 0;
  };

} // end llvm namespace

#endif // LLVM_TARGET_TARGETELFWRITERINFO_H
