Added program header emission
[oota-llvm.git] / test / Scripts / elf-dump
index 58ca1773280e9b9eeeb81c9384071a8df62b9f29..61342d8f98e58dfbc2e3cce1ecdcb8ace1d106bc 100755 (executable)
@@ -15,6 +15,7 @@ class Reader:
             self.file = open(path, "rb")
         self.isLSB = None
         self.is64Bit = None
+        self.isN64 = False
 
     def seek(self, pos):
         self.file.seek(pos)
@@ -51,6 +52,31 @@ class StringTable:
        end = self.string_table.index('\x00', index)
        return self.string_table[index:end]
 
+class ProgramHeader:
+    def __init__(self, f):
+        self.p_type = f.read32()
+        if f.is64Bit:
+            self.p_flags = f.read32()
+        self.p_offset = f.readWord()
+        self.p_vaddr = f.readWord()
+        self.p_paddr = f.readWord()
+        self.p_filesz = f.readWord()
+        self.p_memsz = f.readWord()
+        if not f.is64Bit:
+            self.p_flags = f.read32()
+        self.p_align = f.readWord()
+
+    def dump(self):
+        print "  (('p_type', %s)" % common_dump.HexDump(self.p_type) 
+        print "   ('p_flags', %s)" % common_dump.HexDump(self.p_flags) 
+        print "   ('p_offset', %s)" % common_dump.HexDump(self.p_offset) 
+        print "   ('p_vaddr', %s)" % common_dump.HexDump(self.p_vaddr) 
+        print "   ('p_paddr', %s)" % common_dump.HexDump(self.p_paddr) 
+        print "   ('p_filesz', %s)" % common_dump.HexDump(self.p_filesz) 
+        print "   ('p_memsz', %s)" % common_dump.HexDump(self.p_memsz) 
+        print "   ('p_align', %s)" % common_dump.HexDump(self.p_align) 
+        print "  ),"
+
 class Section:
     def __init__(self, f):
         self.sh_name = f.read32()
@@ -122,15 +148,28 @@ def dumpRel(f, section, dumprela = False):
         f.seek(section.sh_offset[0] + index * section.sh_entsize[0])
         print "    # Relocation %s" % index
         print "    (('r_offset', %s)" % common_dump.HexDump(f.readWord())
-        r_info = f.readWord()[0]
-        if f.is64Bit:
-            r_sym = (r_info >> 32, 32)
-            r_type = (r_info & 0xffffffff, 32)
+
+        if f.isN64:
+            r_sym =   f.read32()
+            r_ssym =  f.read8()
+            r_type3 = f.read8()
+            r_type2 = f.read8()
+            r_type =  f.read8()
+            print "     ('r_sym', %s)" % common_dump.HexDump(r_sym)
+            print "     ('r_ssym', %s)" % common_dump.HexDump(r_ssym)
+            print "     ('r_type3', %s)" % common_dump.HexDump(r_type3)
+            print "     ('r_type2', %s)" % common_dump.HexDump(r_type2)
+            print "     ('r_type', %s)" % common_dump.HexDump(r_type)
         else:
-            r_sym = (r_info >> 8, 24)
-            r_type = (r_info & 0xff, 8)
-        print "     ('r_sym', %s)" % common_dump.HexDump(r_sym)
-        print "     ('r_type', %s)" % common_dump.HexDump(r_type)
+            r_info = f.readWord()[0]
+            if f.is64Bit:
+                r_sym = (r_info >> 32, 32)
+                r_type = (r_info & 0xffffffff, 32)
+            else:
+                r_sym = (r_info >> 8, 24)
+                r_type = (r_info & 0xff, 8)
+            print "     ('r_sym', %s)" % common_dump.HexDump(r_sym)
+            print "     ('r_type', %s)" % common_dump.HexDump(r_type)
         if dumprela:
             print "     ('r_addend', %s)" % common_dump.HexDump(f.readWord())
         print "    ),"
@@ -166,22 +205,32 @@ def dumpELF(path, opts):
     f.seek(16) # Seek to end of e_ident.
 
     print "('e_type', %s)" % common_dump.HexDump(f.read16())
-    print "('e_machine', %s)" % common_dump.HexDump(f.read16())
+
+    # Does any other architecture use N64?
+    e_machine = f.read16()
+    if e_machine[0] == 0x0008 and f.is64Bit: # EM_MIPS && 64 bit
+        f.isN64 = True 
+    
+    print "('e_machine', %s)" % common_dump.HexDump(e_machine)
     print "('e_version', %s)" % common_dump.HexDump(f.read32())
     print "('e_entry', %s)" % common_dump.HexDump(f.readWord())
-    print "('e_phoff', %s)" % common_dump.HexDump(f.readWord())
+    e_phoff = f.readWord()
+    print "('e_phoff', %s)" % common_dump.HexDump(e_phoff)
     e_shoff = f.readWord()
     print "('e_shoff', %s)" % common_dump.HexDump(e_shoff)
     print "('e_flags', %s)" % common_dump.HexDump(f.read32())
     print "('e_ehsize', %s)" % common_dump.HexDump(f.read16())
-    print "('e_phentsize', %s)" % common_dump.HexDump(f.read16())
-    print "('e_phnum', %s)" % common_dump.HexDump(f.read16())
+    e_phentsize = f.read16()
+    print "('e_phentsize', %s)" % common_dump.HexDump(e_phentsize)
+    e_phnum = f.read16()
+    print "('e_phnum', %s)" % common_dump.HexDump(e_phnum)
     e_shentsize = f.read16()
     print "('e_shentsize', %s)" % common_dump.HexDump(e_shentsize)
     e_shnum = f.read16()
     print "('e_shnum', %s)" % common_dump.HexDump(e_shnum)
     e_shstrndx = f.read16()
     print "('e_shstrndx', %s)" % common_dump.HexDump(e_shstrndx)
+    
 
     # Read all section headers
     sections = []
@@ -208,6 +257,19 @@ def dumpELF(path, opts):
         sections[index].dump(shstrtab, f, strtab, opts.dumpSectionData)
     print "])"
 
+    # Read all  program headers
+    headers = []
+    for index in range(e_phnum[0]):
+        f.seek(e_phoff[0] + index * e_phentsize[0])
+        h = ProgramHeader(f)
+        headers.append(h)
+
+    print "('_ProgramHeaders', ["
+    for index in range(e_phnum[0]):
+        print "  # Program Header %s" % index
+        headers[index].dump()
+    print "])"
+
 if __name__ == "__main__":
     from optparse import OptionParser, OptionGroup
     parser = OptionParser("usage: %prog [options] {files}")