Make the ptrtoint comparison simplification work if one side is a global.
[oota-llvm.git] / test / Scripts / macho-dump
index d37b545b2ab12633cc329045bf861b2961ffed99..5b9943ada2ca1ea8e22e50299e6e5e8d36c2b382 100755 (executable)
@@ -37,7 +37,10 @@ class Reader:
       return struct.unpack('><'[self.isLSB] + 'H', self.read(2))[0]
 
    def read32(self):
-      return struct.unpack('><'[self.isLSB] + 'I', self.read(4))[0]
+      # Force to 32-bit, if possible; otherwise these might be long ints on a
+      # big-endian platform. FIXME: Why???
+      Value = struct.unpack('><'[self.isLSB] + 'I', self.read(4))[0]
+      return int(Value)
 
    def registerStringTable(self, strings):
       if self.string_table is not None:
@@ -101,6 +104,9 @@ def dumpLoadCommand(f, i, opts):
       dumpSymtabCommand(f, opts)
    elif cmd == 11:
       dumpDysymtabCommand(f, opts)
+   elif cmd == 27:
+      import uuid
+      print "  ('uuid', %s)" % uuid.UUID(bytes=f.read(16))
    else:
       print >>sys.stderr,"%s: warning: unknown load command: %r" % (sys.argv[0], cmd)
       f.read(cmdSize - 8)
@@ -159,7 +165,7 @@ def dumpNlist32(f, i, opts):
    n_type = f.read8()
    print "    ('n_type', %#x)" % n_type
    n_sect = f.read8()
-   print "    ('n_type', %r)" % n_sect
+   print "    ('n_sect', %r)" % n_sect
    n_desc = f.read16()
    print "    ('n_desc', %r)" % n_desc
    n_value = f.read32()
@@ -195,7 +201,7 @@ def dumpDysymtabCommand(f, opts):
    print "  ('_indirect_symbols', ["
    for i in range(nindirectsyms):
       print "    # Indirect Symbol %r" % i
-      print "    (('symbol_index', %r),)," % f.read32()
+      print "    (('symbol_index', %#x),)," % f.read32()
    print "  ])"
       
    f.seek(prev_pos)
@@ -205,20 +211,42 @@ def dumpSection32(f, i, opts):
    print "   (('section_name', %r)" % f.read(16)
    print "    ('segment_name', %r)" % f.read(16)
    print "    ('address', %r)" % f.read32()
-   print "    ('size', %r)" % f.read32()
-   print "    ('offset', %r)" % f.read32()
-   print "    ('alignment', %r)" % f.read32()
-   print "    ('reloc_offset', %r)" % f.read32()
-   print "    ('num_reloc', %r)" % f.read32()
+   size = f.read32()
+   print "    ('size', %r)" % size
+   offset = f.read32()
+   print "    ('offset', %r)" % offset
+   print "    ('alignment', %r)" % f.read32()   
+   reloc_offset = f.read32()
+   print "    ('reloc_offset', %r)" % reloc_offset
+   num_reloc = f.read32()
+   print "    ('num_reloc', %r)" % num_reloc
    print "    ('flags', %#x)" % f.read32()
    print "    ('reserved1', %r)" % f.read32()
    print "    ('reserved2', %r)" % f.read32()
    print "   ),"
+
+   prev_pos = f.tell()
+
+   f.seek(reloc_offset)
+   print "  ('_relocations', ["
+   for i in range(num_reloc):
+      print "    # Relocation %r" % i
+      print "    (('word-0', %#x)," % f.read32()
+      print "     ('word-1', %#x))," % f.read32()
+   print "  ])"
+
+   if opts.dumpSectionData:
+      f.seek(offset)
+      print "  ('_section_data', %r)" % f.read(size)
+      
+   f.seek(prev_pos)
    
 def main():
     from optparse import OptionParser, OptionGroup
     parser = OptionParser("usage: %prog [options] {files}")
-
+    parser.add_option("", "--dump-section-data", dest="dumpSectionData",
+                      help="Dump the contents of sections",
+                      action="store_true", default=False)    
     (opts, args) = parser.parse_args()
 
     if not args: