| //===-- 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 |