Implement major new fastisel functionality: the matcher can now handle immediates...
[oota-llvm.git] / test / Scripts / coff-dump.py
index 7868c006a43bed1090607f529a9ef12c477d1639..36ec53932c638be69bb556ee214c8fbb3ca9f3d9 100755 (executable)
@@ -160,14 +160,15 @@ file = ('struct', [
           0x0010: 'IMAGE_REL_AMD64_SSPAN32',
         },
       }))),
-      ('SymbolName',       ('ptr', '+ PointerToSymbolTable * - SymbolTableIndex 1 18', ('scalar',  '<8s', symname)))
+      ('SymbolName',       ('ptr', '+ PointerToSymbolTable * SymbolTableIndex 18', ('scalar',  '<8s', symname)))
     ])))),
   ]))),
-  ('Symbols', ('ptr', 'PointerToSymbolTable', ('byte-array', '* NumberOfSymbols 18',  ('struct', [
+  ('Symbols', ('ptr', 'PointerToSymbolTable', ('byte-array', '18', '* NumberOfSymbols 18',  ('struct', [
     ('Name',                ('scalar',  '<8s', symname)),
     ('Value',               ('scalar',  '<L',  '%d'   )),
     ('SectionNumber',       ('scalar',  '<H',  '%d'   )),
-    ('SimpleType',          ('enum',    '<B',  '%d', {
+    ('_Type',               ('scalar',  '<H',  None   )),
+    ('SimpleType',          ('enum',    '& _Type 15',  '%d', {
       0: 'IMAGE_SYM_TYPE_NULL',
       1: 'IMAGE_SYM_TYPE_VOID',
       2: 'IMAGE_SYM_TYPE_CHAR',
@@ -184,8 +185,8 @@ file = ('struct', [
       13: 'IMAGE_SYM_TYPE_WORD',
       14: 'IMAGE_SYM_TYPE_UINT',
       15: 'IMAGE_SYM_TYPE_DWORD',
-    })),
-    ('ComplexType',         ('enum',    '<B',  '%d', {
+    })),                                # (Type & 0xF0) >> 4
+    ('ComplexType',         ('enum',    '>> & _Type 240 4',  '%d', {
       0: 'IMAGE_SYM_DTYPE_NULL',
       1: 'IMAGE_SYM_DTYPE_POINTER',
       2: 'IMAGE_SYM_DTYPE_FUNCTION',
@@ -317,7 +318,7 @@ def print_binary_data(size):
     write("%s|%s|\n" % (bytes, text))
   return value
 
-idlit = re.compile("[a-zA-Z][a-zA-Z0-9_-]*")
+idlit = re.compile("[a-zA-Z_][a-zA-Z0-9_-]*")
 numlit = re.compile("[0-9]+")
 
 def read_value(expr):
@@ -335,11 +336,6 @@ def read_value(expr):
     if expr == 'false':
       return False
 
-    if len(token) > 1 and token[0] in ('=', '@', '<', '!', '>'):
-      val = read(expr)
-      assert(len(val) == 1)
-      return val[0]
-
     if token == '+':
       return eval() + eval()
     if token == '-':
@@ -348,6 +344,19 @@ def read_value(expr):
       return eval() * eval()
     if token == '/':
       return eval() / eval()
+    if token == '&':
+      return eval() & eval()
+    if token == '|':
+      return eval() | eval()
+    if token == '>>':
+      return eval() >> eval()
+    if token == '<<':
+      return eval() << eval()
+
+    if len(token) > 1 and token[0] in ('=', '@', '<', '!', '>'):
+      val = read(expr)
+      assert(len(val) == 1)
+      return val[0]
 
     if idlit.match(token):
       return Fields[token]
@@ -356,10 +365,10 @@ def read_value(expr):
 
     raise RuntimeError("unexpected token %s" % repr(token))
 
-  value = eval ()
+  value = eval()
 
   try:
-    input.next ()
+    input.next()
   except StopIteration:
     return value
   raise RuntimeError("unexpected input at end of expression")
@@ -373,6 +382,8 @@ def write_value(format,value):
   elif format_type is types.TupleType:
     Fields['this'] = value
     handle_element(format)
+  elif format_type is types.NoneType:
+    pass
   else:
     raise RuntimeError("unexpected type: %s" % repr(format_type))
 
@@ -448,11 +459,13 @@ def handle_struct(entry):
     name = member[0]
     type = member[1]
 
-    write("%s = "%name.ljust(24))
+    if name[0] != "_":
+      write("%s = " % name.ljust(24))
 
     value = handle_element(type)
 
-    write("\n")
+    if name[0] != "_":
+      write("\n")
 
     Fields[name] = value
     newFields[name] = value
@@ -487,24 +500,28 @@ def handle_array(entry):
   return newItems
 
 def handle_byte_array(entry):
-  length = entry[1]
-  element = entry[2]
+  ent_size = entry[1]
+  length = entry[2]
+  element = entry[3]
 
   newItems = []
 
   write("[\n")
   indent()
 
+  item_size = read_value(ent_size)
   value = read_value(length)
   end_of_array = Input.tell() + value
 
+  prev_loc = Input.tell()
   index = 0
   while Input.tell() < end_of_array:
-    write("%d = "%index)
+    write("%d = " % index)
     value = handle_element(element)
     write("\n")
     newItems.append(value)
-    index += 1
+    index += (Input.tell() - prev_loc) / item_size
+    prev_loc = Input.tell()
 
   dedent()
   write("]")
@@ -560,7 +577,12 @@ def handle_element(entry):
 
   return handlers[entry[0]](entry)
 
-Input = open (sys.argv[1], "rb")
+if len(sys.argv) <= 1 or sys.argv[1] == '-':
+  import StringIO
+  Input = StringIO.StringIO(sys.stdin.read())
+else:
+  Input = open (sys.argv[1], "rb")
+
 try:
   handle_element(file)
 finally: