mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
2ae97a2777
a dirty hack and isn't need anymore since the last x86 code emitter patch) - Add a target-dependent modifier to addend calculation - Use R_X86_64_32S relocation for X86::reloc_absolute_word_sext - Use getELFSectionFlags whenever possible - fix getTextSection to use TLOF and emit the right text section - Handle global emission for static ctors, dtors and Type::PointerTyID - Some minor fixes llvm-svn: 78176
125 lines
4.4 KiB
C++
125 lines
4.4 KiB
C++
//===-- 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;
|
|
TargetMachine &TM;
|
|
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(TargetMachine &tm);
|
|
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
|