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