aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Gaeke <gaeke@uiuc.edu>2004-02-29 06:30:25 +0000
committerBrian Gaeke <gaeke@uiuc.edu>2004-02-29 06:30:25 +0000
commit620ee02353d8b65959dc01a66b073adfcdef9eac (patch)
treea40f28fb7d48734f477938e63e72ecf7f0e4ced7
parent1ddf475b6a3d748427546ab8f65a712c8eea3a0f (diff)
downloadexternal_llvm-620ee02353d8b65959dc01a66b073adfcdef9eac.zip
external_llvm-620ee02353d8b65959dc01a66b073adfcdef9eac.tar.gz
external_llvm-620ee02353d8b65959dc01a66b073adfcdef9eac.tar.bz2
Add more architectures, and ELF64 stuff.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11985 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/Support/ELF.h50
-rw-r--r--include/llvm/Support/ELF.h50
2 files changed, 98 insertions, 2 deletions
diff --git a/include/Support/ELF.h b/include/Support/ELF.h
index ab11e0c..c817b85 100644
--- a/include/Support/ELF.h
+++ b/include/Support/ELF.h
@@ -30,6 +30,16 @@ typedef uint32_t Elf32_Off; // File offset
typedef int32_t Elf32_Sword;
typedef uint32_t Elf32_Word;
+typedef uint64_t Elf64_Addr;
+typedef uint64_t Elf64_Off;
+typedef int32_t Elf64_Shalf;
+typedef int32_t Elf64_Sword;
+typedef uint32_t Elf64_Word;
+typedef int64_t Elf64_Sxword;
+typedef uint64_t Elf64_Xword;
+typedef uint32_t Elf64_Half;
+typedef uint16_t Elf64_Quarter;
+
// Object file magic string.
static const char ElfMagic[] = { 0x7f, 'E', 'L', 'F', '\0' };
@@ -55,6 +65,25 @@ struct Elf32_Ehdr {
unsigned char getDataEncoding () { return e_ident[5]; }
};
+// 64-bit ELF header. Fields are the same as for ELF32, but with different
+// types (see above).
+typedef struct {
+ unsigned char e_ident[16];
+ Elf64_Quarter e_type;
+ Elf64_Quarter e_machine;
+ Elf64_Half e_version;
+ Elf64_Addr e_entry;
+ Elf64_Off e_phoff;
+ Elf64_Off e_shoff;
+ Elf64_Half e_flags;
+ Elf64_Quarter e_ehsize;
+ Elf64_Quarter e_phentsize;
+ Elf64_Quarter e_phnum;
+ Elf64_Quarter e_shentsize;
+ Elf64_Quarter e_shnum;
+ Elf64_Quarter e_shstrndx;
+} Elf64_Ehdr;
+
// File types
enum {
ET_NONE = 0, // No file type
@@ -74,8 +103,13 @@ enum {
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_MIPS = 8, // MIPS R3000
+ EM_PPC = 20, // PowerPC
+ EM_ARM = 40, // ARM
+ EM_ALPHA = 41, // DEC Alpha
+ EM_SPARCV9 = 43 // SPARC V9
};
// Object file classes.
@@ -104,6 +138,20 @@ struct Elf32_Shdr {
Elf32_Word sh_entsize; // Size of records contained within the section
};
+// Section header for ELF64 - same fields as ELF32, different types.
+typedef struct {
+ Elf64_Half sh_name;
+ Elf64_Half sh_type;
+ Elf64_Xword sh_flags;
+ Elf64_Addr sh_addr;
+ Elf64_Off sh_offset;
+ Elf64_Xword sh_size;
+ Elf64_Half sh_link;
+ Elf64_Half sh_info;
+ Elf64_Xword sh_addralign;
+ Elf64_Xword sh_entsize;
+} Elf64_Shdr;
+
// Special section indices.
enum {
SHN_UNDEF = 0, // Undefined, missing, irrelevant, or meaningless
diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h
index ab11e0c..c817b85 100644
--- a/include/llvm/Support/ELF.h
+++ b/include/llvm/Support/ELF.h
@@ -30,6 +30,16 @@ typedef uint32_t Elf32_Off; // File offset
typedef int32_t Elf32_Sword;
typedef uint32_t Elf32_Word;
+typedef uint64_t Elf64_Addr;
+typedef uint64_t Elf64_Off;
+typedef int32_t Elf64_Shalf;
+typedef int32_t Elf64_Sword;
+typedef uint32_t Elf64_Word;
+typedef int64_t Elf64_Sxword;
+typedef uint64_t Elf64_Xword;
+typedef uint32_t Elf64_Half;
+typedef uint16_t Elf64_Quarter;
+
// Object file magic string.
static const char ElfMagic[] = { 0x7f, 'E', 'L', 'F', '\0' };
@@ -55,6 +65,25 @@ struct Elf32_Ehdr {
unsigned char getDataEncoding () { return e_ident[5]; }
};
+// 64-bit ELF header. Fields are the same as for ELF32, but with different
+// types (see above).
+typedef struct {
+ unsigned char e_ident[16];
+ Elf64_Quarter e_type;
+ Elf64_Quarter e_machine;
+ Elf64_Half e_version;
+ Elf64_Addr e_entry;
+ Elf64_Off e_phoff;
+ Elf64_Off e_shoff;
+ Elf64_Half e_flags;
+ Elf64_Quarter e_ehsize;
+ Elf64_Quarter e_phentsize;
+ Elf64_Quarter e_phnum;
+ Elf64_Quarter e_shentsize;
+ Elf64_Quarter e_shnum;
+ Elf64_Quarter e_shstrndx;
+} Elf64_Ehdr;
+
// File types
enum {
ET_NONE = 0, // No file type
@@ -74,8 +103,13 @@ enum {
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_MIPS = 8, // MIPS R3000
+ EM_PPC = 20, // PowerPC
+ EM_ARM = 40, // ARM
+ EM_ALPHA = 41, // DEC Alpha
+ EM_SPARCV9 = 43 // SPARC V9
};
// Object file classes.
@@ -104,6 +138,20 @@ struct Elf32_Shdr {
Elf32_Word sh_entsize; // Size of records contained within the section
};
+// Section header for ELF64 - same fields as ELF32, different types.
+typedef struct {
+ Elf64_Half sh_name;
+ Elf64_Half sh_type;
+ Elf64_Xword sh_flags;
+ Elf64_Addr sh_addr;
+ Elf64_Off sh_offset;
+ Elf64_Xword sh_size;
+ Elf64_Half sh_link;
+ Elf64_Half sh_info;
+ Elf64_Xword sh_addralign;
+ Elf64_Xword sh_entsize;
+} Elf64_Shdr;
+
// Special section indices.
enum {
SHN_UNDEF = 0, // Undefined, missing, irrelevant, or meaningless