First step of switch lowering refactoring: perform worklist-driven
[oota-llvm.git] / include / llvm / Support / ELF.h
index 204d26dd04e1102dcc0c57313948bddff12c38c8..cd811f288ecb21d48ecfb80282c72f250a047fa5 100644 (file)
@@ -1,22 +1,27 @@
-//===-- Support/ELF.h - ELF constants and data structures -------*- C++ -*-===//
-// 
+//===-- llvm/Support/ELF.h - ELF constants and data structures --*- C++ -*-===//
+//
 //                     The LLVM Compiler Infrastructure
 //
 // This file was developed by the LLVM research group and is distributed under
 // the University of Illinois Open Source License. See LICENSE.TXT for details.
-// 
+//
 //===----------------------------------------------------------------------===//
 //
 // This header contains common, non-processor-specific data structures and
 // constants for the ELF file format.
-// 
-// The details of this file are largely based on the Tool Interface Standard
-// (TIS) Executable and Linking Format (ELF) Specification Version 1.2,
-// May 1995.
+//
+// The details of the ELF32 bits in this file are largely based on
+// the Tool Interface Standard (TIS) Executable and Linking Format
+// (ELF) Specification Version 1.2, May 1995. The ELF64 stuff is not
+// standardized, as far as I can tell. It was largely based on information
+// I found in OpenBSD header files.
 //
 //===----------------------------------------------------------------------===//
 
-#include "Support/DataTypes.h"
+#ifndef LLVM_SUPPORT_ELF_H
+#define LLVM_SUPPORT_ELF_H
+
+#include "llvm/Support/DataTypes.h"
 #include <cstring>
 #include <cstdlib>
 
@@ -30,8 +35,18 @@ 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 = "\x7fELF";
+static const char ElfMagic[] = { 0x7f, 'E', 'L', 'F', '\0' };
 
 struct Elf32_Ehdr {
   unsigned char e_ident[16]; // ELF Identification bytes
@@ -49,12 +64,31 @@ struct Elf32_Ehdr {
   Elf32_Half    e_shnum;     // Number of entries in the section header table
   Elf32_Half    e_shstrndx;  // Sect hdr table index of sect name string table
   bool checkMagic () const {
-    return (memcmp (e_ident, ElfMagic, strlen (ElfMagic)) == 0;
+    return (memcmp (e_ident, ElfMagic, strlen (ElfMagic))) == 0;
   }
   unsigned char getFileClass () const { return e_ident[4]; }
   unsigned char getDataEncoding () { return e_ident[5]; }
 };
 
+// 64-bit ELF header. Fields are the same as for ELF32, but with different
+// types (see above).
+struct Elf64_Ehdr {
+  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;
+};
+
 // File types
 enum {
   ET_NONE   = 0,      // No file type
@@ -74,8 +108,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.
@@ -98,12 +137,26 @@ struct Elf32_Shdr {
   Elf32_Addr sh_addr;      // Address where section is to be loaded
   Elf32_Off  sh_offset;    // File offset of section data, in bytes
   Elf32_Word sh_size;      // Size of section, in bytes
-  Elf32_Word sh_link;      // Section type-specific header table index link 
+  Elf32_Word sh_link;      // Section type-specific header table index link
   Elf32_Word sh_info;      // Section type-specific extra information
   Elf32_Word sh_addralign; // Section address alignment
   Elf32_Word sh_entsize;   // Size of records contained within the section
 };
 
+// Section header for ELF64 - same fields as ELF32, different types.
+struct Elf64_Shdr {
+  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;
+};
+
 // Special section indices.
 enum {
   SHN_UNDEF     = 0,      // Undefined, missing, irrelevant, or meaningless
@@ -151,7 +204,7 @@ struct Elf32_Sym {
   unsigned char st_info;  // Symbol's type and binding attributes
   unsigned char st_other; // Must be zero; reserved
   Elf32_Half    st_shndx; // Which section (header table index) it's defined in
-  
+
   // These accessors and mutators correspond to the ELF32_ST_BIND,
   // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification:
   unsigned char getBinding () const { return st_info >> 4; }
@@ -185,15 +238,15 @@ enum {
 
 // Relocation entry, without explicit addend.
 struct Elf32_Rel {
-  Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 
+  Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr)
   Elf32_Word r_info;   // Symbol table index and type of relocation to apply
-  
+
   // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE,
   // and ELF32_R_INFO macros defined in the ELF specification:
   Elf32_Word getSymbol () const { return (r_info >> 8); }
   unsigned char getType () const { return (unsigned char) (r_info & 0x0ff); }
-  void setSymbol (Elf32_Word s) const { setSymbolAndType (s, getType ()); }
-  void setType (unsigned char t) const { setSymbolAndType (getSymbol(), t); }
+  void setSymbol (Elf32_Word s) { setSymbolAndType (s, getType ()); }
+  void setType (unsigned char t) { setSymbolAndType (getSymbol(), t); }
   void setSymbolAndType (Elf32_Word s, unsigned char t) {
     r_info = (s << 8) + t;
   };
@@ -201,16 +254,16 @@ struct Elf32_Rel {
 
 // Relocation entry with explicit addend.
 struct Elf32_Rela {
-  Elf32_Addr  r_offset; // Location (file byte offset, or program virtual addr)     
+  Elf32_Addr  r_offset; // Location (file byte offset, or program virtual addr)
   Elf32_Word  r_info;   // Symbol table index and type of relocation to apply
   Elf32_Sword r_addend; // Compute value for relocatable field by adding this
-  
+
   // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE,
   // and ELF32_R_INFO macros defined in the ELF specification:
   Elf32_Word getSymbol () const { return (r_info >> 8); }
   unsigned char getType () const { return (unsigned char) (r_info & 0x0ff); }
-  void setSymbol (Elf32_Word s) const { setSymbolAndType (s, getType ()); }
-  void setType (unsigned char t) const { setSymbolAndType (getSymbol(), t); }
+  void setSymbol (Elf32_Word s) { setSymbolAndType (s, getType ()); }
+  void setType (unsigned char t) { setSymbolAndType (getSymbol(), t); }
   void setSymbolAndType (Elf32_Word s, unsigned char t) {
     r_info = (s << 8) + t;
   };
@@ -243,3 +296,5 @@ enum {
 } // end namespace ELF
 
 } // end namespace llvm
+
+#endif