| Index: convert_tests_to_objdump.py
|
| diff --git a/convert_tests_to_objdump.py b/convert_tests_to_objdump.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ec341e752f579350d748deffff0c1d2d4ebabdbc
|
| --- /dev/null
|
| +++ b/convert_tests_to_objdump.py
|
| @@ -0,0 +1,327 @@
|
| +#!/usr/bin/python
|
| +
|
| +import os
|
| +import re
|
| +import StringIO
|
| +import sys
|
| +import tempfile
|
| +import textwrap
|
| +import tokenize
|
| +
|
| +
|
| +def GetFilesList(root_dir):
|
| + files = []
|
| + blacklist = ['load.ll', 'store.ll']
|
| + for (d, _, fs) in os.walk(root_dir):
|
| + for f in fs:
|
| + if f.endswith('.ll') and f not in blacklist:
|
| + files.append(os.path.join(d, f))
|
| + return files
|
| +
|
| +
|
| +def MakeRegexRule(match, repl):
|
| + def Func(line):
|
| + return re.sub(match, repl, line)
|
| + return Func
|
| +
|
| +
|
| +def MakeHexRule(match):
|
| + def Func(line):
|
| + m = re.match(match, line)
|
| + if m:
|
| + if not m.group(2).startswith('0x'):
|
| + return m.group(1) + ',' + hex(int(m.group(2))) + '\n'
|
| + return line
|
| + return Func
|
| +
|
| +def MakeHexOpRule(match):
|
| + def Func(line):
|
| + m = re.match(match, line)
|
| + if m:
|
| + if not (m.group(3).startswith('0x') or m.group(4).startswith('x')):
|
| + return m.group(1) + m.group(2) + hex(int(m.group(3))) + m.group(4) + '\n'
|
| + return line
|
| + return Func
|
| +
|
| +ALL_RULES = [
|
| + MakeRegexRule(r' -symbolize', r' --symbolize'),
|
| + MakeRegexRule(r'(.*-LABEL: .*):', r'\1'),
|
| + MakeRegexRule(r'dword ptr', r'DWORD PTR'),
|
| + MakeRegexRule(r' word ptr', r' WORD PTR'),
|
| + MakeRegexRule(r',word ptr', r',WORD PTR'),
|
| + MakeRegexRule(r'DWORD ptr', r'DWORD PTR'),
|
| + MakeRegexRule(r'qword ptr', r'QWORD PTR'),
|
| + MakeRegexRule(r'QWORD ptr', r'QWORD PTR'),
|
| + MakeRegexRule(r'byte ptr', r'BYTE PTR'),
|
| + MakeRegexRule(r'BYTE ptr', r'BYTE PTR'),
|
| + MakeRegexRule(r'xmmword ptr', r'XMMWORD PTR'),
|
| + MakeRegexRule(r'xmmword', r'XMMWORD'),
|
| + MakeRegexRule(r'(; CHECK: .*mov.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK: .*add.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK_.*mov.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK_.*add.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK-DAG: .*mov.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK-DAG: .*add.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK-NEXT: .*mov.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; CHECK-NEXT: .*add.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; OPTM1.*mov.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; OPTM1.*add.*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; SSE41: .*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; SSE41-NEXT: .*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; O2: .*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; O2-NEXT: .*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; OM1: .*), (.*)', r'\1,\2'),
|
| + MakeRegexRule(r'(; OM1-NEXT: .*), (.*)', r'\1,\2'),
|
| + # MakeRegexRule(r'(; CHECK: .*)\+ (.*)', r'\1+\2'),
|
| + # MakeRegexRule(r'(; CHECK: .*) \+(.*)', r'\1+\2'),
|
| + MakeRegexRule(r'(; CHECK_.*)\+ (.*)', r'\1+\2'),
|
| + MakeRegexRule(r'(; CHECK_.*) \+(.*)', r'\1+\2'),
|
| + # MakeRegexRule(r'(; CHECK-NEXT: .*)\+ (.*)', r'\1+\2'),
|
| + # MakeRegexRule(r'(; CHECK-NEXT: .*) \+(.*)', r'\1+\2'),
|
| + MakeRegexRule(r'(; OPTM1.*)\+ (.*)', r'\1+\2'),
|
| + MakeRegexRule(r'(; OPTM1.*) \+(.*)', r'\1+\2'),
|
| + # MakeRegexRule(r'(; OPTM1-NEXT: .*)\+ (.*)', r'\1+\2'),
|
| + # MakeRegexRule(r'(; OPTM1-NEXT: .*) \+(.*)', r'\1+\2'),
|
| + MakeRegexRule(r'(; O2: .*)\+ (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2: .*) \+(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2-NEXT: .*)\+ (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2-NEXT: .*) \+(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1: .*)\+ (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1: .*) \+(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1-NEXT: .*)\+ (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1-NEXT: .*) \+(.*)', r'\1-\2'),
|
| + # MakeHexRule(r'(; CHECK: .*), ([0-9]+)$'),
|
| + # MakeRegexRule(r'(; CHECK: .*)- (.*)', r'\1-\2'),
|
| + # MakeRegexRule(r'(; CHECK: .*) -(.*)', r'\1-\2'),
|
| + # MakeRegexRule(r'(; CHECK-NEXT: .*)- (.*)', r'\1-\2'),
|
| + # MakeRegexRule(r'(; CHECK-NEXT: .*) -(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OPTM1.*)- (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OPTM1.*) -(.*)', r'\1-\2'),
|
| + # MakeRegexRule(r'(; OPTM1-NEXT: .*)- (.*)', r'\1-\2'),
|
| + # MakeRegexRule(r'(; OPTM1-NEXT: .*) -(.*)', r'\1-\2'),
|
| + MakeHexRule(r'(; CHECK_.*), ([0-9]+)$'),
|
| + MakeRegexRule(r'(; CHECK_.*)- (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; CHECK_.*) -(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2: .*)- (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2: .*) -(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2-NEXT: .*)- (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; O2-NEXT: .*) -(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1: .*)- (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1: .*) -(.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1-NEXT: .*)- (.*)', r'\1-\2'),
|
| + MakeRegexRule(r'(; OM1-NEXT: .*) -(.*)', r'\1-\2'),
|
| + # MakeHexRule(r'(; CHECK: .*), ([0-9]+)$'),
|
| + MakeHexRule(r'(; CHECK_.*), ([0-9]+)$'),
|
| + MakeHexRule(r'(; OPTM1.*), ([0-9]+)$'),
|
| + # MakeHexRule(r'(; CHECK-NEXT: .*), ([0-9]+)$'),
|
| + # MakeHexRule(r'(; OPTM1-NEXT: .*), ([0-9]+)$'),
|
| + #MakeHexRule(r'(; CHECK: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; CHECK_.*),([0-9]+)$'),
|
| + #MakeHexRule(r'(; OPTM1: .*),([0-9]+)$'),
|
| + #MakeHexRule(r'(; CHECK-NEXT: .*),([0-9]+)$'),
|
| + #MakeHexRule(r'(; OPTM1-NEXT: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; CHECK-DAG: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; CHECK-DAG: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; O2: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; O2-NEXT: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; OM1: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; OM1-NEXT: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; SSE41: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; SSE41: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; SSE41-NEXT: .*),([0-9]+)$'),
|
| + MakeHexRule(r'(; SSE41-NEXT: .*),([0-9]+)$'),
|
| + # This one is too blunt too, and usually they all double up the 0x0x.
|
| +# MakeHexOpRule(r'(; CHECK-NOT: .*)( )([0-9]+)(.*)'),
|
| + # MakeHexOpRule(r'(; CHECK: .*)(\+)([0-9]+)(.*)'),
|
| + MakeHexOpRule(r'(; CHECK_.*)(\+)([0-9]+)(.*)'),
|
| + MakeHexOpRule(r'(; OPTM1.*[xp])(\+)([0-9]+)(.*)'),
|
| + # MakeHexOpRule(r'(; CHECK-NEXT: .*)(\+)([0-9]+)(.*)'),
|
| + # MakeHexOpRule(r'(; OPTM1-NEXT: .*)(\+)([0-9]+)(.*)'),
|
| + # MakeHexOpRule(r'(; CHECK: .*[xp])(-)([0-9]+)(.*)'),
|
| + MakeHexOpRule(r'(; CHECK_.*[xp])(-)([0-9]+)(.*)'),
|
| + MakeHexOpRule(r'(; OPTM1.*[xp])(-)([0-9]+)(.*)'),
|
| + # MakeHexOpRule(r'(; CHECK-NEXT: .*[xp])(-)([0-9]+)(.*)'),
|
| + # MakeHexOpRule(r'(; OPTM1-NEXT: .*[xp])(-)([0-9]+)(.*)'),
|
| +# This one is too blunt (convert indirect calls and non asm too).
|
| + #MakeRegexRule(r'(; CHECK: .*call) (.*)', r'\1 {{.*}} R_{{.*}} \2'),
|
| + #MakeRegexRule(r'(; CHECK-NEXT: .*call) (.*)', r'\1 {{.*}} R_{{.*}} \2'),
|
| + #MakeRegexRule(r'(; OPTM1: .*call) (.*)', r'\1 {{.*}} R_{{.*}} \2'),
|
| + #MakeRegexRule(r'(; OPTM1-NEXT: .*call) (.*)', r'\1 {{.*}} R_{{.*}} \2'),
|
| + ]
|
| +
|
| +
|
| +def ApplyOnelinersToLine(line):
|
| + for r in ALL_RULES:
|
| + line = r(line)
|
| + return line
|
| +
|
| +
|
| +def ApplyOnelinersToFile(filename):
|
| + print 'ApplyOnelinersToFile: %s' % filename
|
| + with open(filename, 'r') as orig:
|
| + # Create a temp file in the same directory so that it can be moved.
|
| + # Otherwise, we cannot move out of a different filesystem like /tmp
|
| + with tempfile.NamedTemporaryFile(dir=os.path.dirname(filename),
|
| + delete=False) as temp:
|
| + for line in orig.readlines():
|
| + newline = ApplyOnelinersToLine(line)
|
| + if line != newline:
|
| + print 'Rewriting %s' % line
|
| + print 'To %s' % newline
|
| + temp.write(newline)
|
| + os.rename(temp.name, filename)
|
| +
|
| +
|
| +# THIS DOESN'T WORK YET... The spacing between tokens is all messed up.
|
| +def ConvertNumbersToHexLine(line):
|
| + if not line.startswith('; CHECK'):
|
| + return line
|
| + result = []
|
| + g = tokenize.generate_tokens(StringIO.StringIO(line).readline)
|
| + for toknum, tokval, _, _, _ in g:
|
| + if toknum == tokenize.NUMBER:
|
| + print 'Abouts to convert :%s ' % tokval
|
| + result.append((tokenize.NUMBER, hex(int(tokval))))
|
| + else:
|
| + result.append((toknum, tokval))
|
| + return tokenize.untokenize(result)
|
| +
|
| +
|
| +def ConvertNumbersToHex(filename):
|
| + print 'ConvertNumbersToHex: %s' % filename
|
| + with open(filename, 'r') as orig:
|
| + # Create a temp file in the same directory so that it can be moved.
|
| + # Otherwise, we cannot move out of a different filesystem like /tmp
|
| + with tempfile.NamedTemporaryFile(dir=os.path.dirname(filename),
|
| + delete=False) as temp:
|
| + for line in orig.readlines():
|
| + newline = ConvertNumbersToHexLine(line)
|
| + if line != newline:
|
| + print 'Rewriting %s' % line
|
| + print 'To %s' % newline
|
| + temp.write(newline)
|
| + os.rename(temp.name, filename)
|
| +
|
| +
|
| +def ApplyFunkyHeaderChanges3(lines):
|
| + if len(lines) != 3:
|
| + return False, None
|
| + new1 = re.sub(r'; RUN: %p2i -i %s (.*) \\',
|
| + r'; RUN: %p2i -i %s --assemble --disassemble \1 \\',
|
| + lines[0])
|
| + match1 = new1 != lines[0]
|
| + match2 = re.match(
|
| + r'; RUN: \| llvm-mc -triple=i686-none-nacl -filetype=obj \\', lines[1])
|
| + new3 = re.sub(
|
| + r'; RUN: \| llvm-objdump -d --symbolize -x86-asm-syntax=intel - \| (.*)',
|
| + r'; RUN: | \1',
|
| + lines[2])
|
| + match3 = new3 != lines[2]
|
| + # Try w/ -r also.
|
| + if not match3:
|
| + new3 = re.sub(
|
| + r'; RUN: \| llvm-objdump -d -r --symbolize -x86-asm-syntax=intel - \| (.*)',
|
| + r'; RUN: | \1',
|
| + lines[2])
|
| + match3 = new3 != lines[2]
|
| + if not (match1 and match2 and match3):
|
| + return False, None
|
| + maybe_wrap = textwrap.wrap(new1, 80, break_on_hyphens=False)
|
| + if len(maybe_wrap) > 1:
|
| + maybe_wrap[0] = maybe_wrap[0] + ' \\\n'
|
| + for i in xrange(1, len(maybe_wrap)):
|
| + maybe_wrap[i] = r'; RUN: ' + maybe_wrap[i] + '\n'
|
| + return True, maybe_wrap + [new3]
|
| + else:
|
| + return True, [new1, new3]
|
| +
|
| +
|
| +def ApplyFunkyHeaderChanges4(lines):
|
| + if len(lines) != 4:
|
| + return False, None
|
| + new1 = re.sub(r'; RUN: %p2i -i %s (.*) \\',
|
| + r'; RUN: %p2i -i %s --assemble --disassemble \1 \\',
|
| + lines[0])
|
| + match1 = new1 != lines[0]
|
| + match2 = re.match(
|
| + r'; RUN: \| llvm-mc -triple=i686-none-nacl -filetype=obj \\', lines[1])
|
| + match3 = re.match(
|
| + r'; RUN: \| llvm-objdump -d --symbolize -x86-asm-syntax=intel - \\',
|
| + lines[2])
|
| + if not match3:
|
| + match3 = re.match(
|
| + r'; RUN: \| llvm-objdump -d -r --symbolize -x86-asm-syntax=intel - \\',
|
| + lines[2])
|
| + match4 = re.match(r'; RUN: \| File.*', lines[3])
|
| + # There's no real change needed, but need to know if there's a match.
|
| + new4 = lines[3]
|
| + if not (match1 and match2 and match3 and match4):
|
| + return False, None
|
| + maybe_wrap = textwrap.wrap(new1, 80, break_on_hyphens=False)
|
| + if len(maybe_wrap) > 1:
|
| + maybe_wrap[0] = maybe_wrap[0] + ' \\\n'
|
| + for i in xrange(1, len(maybe_wrap)):
|
| + maybe_wrap[i] = r'; RUN: ' + maybe_wrap[i] + '\n'
|
| + return True, maybe_wrap + [new4]
|
| + else:
|
| + return True, [new1, new4]
|
| +
|
| +
|
| +def UndoTheCallTransformation(lines):
|
| + if len(lines) != 2:
|
| + return False, None
|
| + match1 = re.match(r'(; CHECK: .*call)', lines[0])
|
| + new2 = re.sub(
|
| + r'; CHECK-NEXT: (R_{{.*}} .*)',
|
| + r' {{.*}} \1',
|
| + lines[1])
|
| + match2 = new2 != lines[1]
|
| + if not (match1 and match2):
|
| + return False, None
|
| + return True, [match1.group(1) + new2]
|
| +
|
| +
|
| +def FixLockChecks(lines):
|
| + if len(lines) != 2:
|
| + return False, None
|
| + match1 = re.match(r'(; CHECK: lock)', lines[0])
|
| + match2 = re.match(r'; CHECK-NEXT: (.*)', lines[1])
|
| + if not (match1 and match2):
|
| + return False, None
|
| + return True, [r'; CHECK: lock ' + match2.group(1) + '\n']
|
| +
|
| +
|
| +def ApplyMultiLineEdits(filename, applier, num_lines):
|
| + print 'ApplyMultiLineEdits (%d): %s' % (num_lines, filename)
|
| + with open(filename, 'r') as orig:
|
| + lines = orig.readlines()
|
| + for i in xrange(0, len(lines) - (num_lines + 1)):
|
| + linesubs = lines[i:i + num_lines]
|
| + matched, newlines = applier(linesubs)
|
| + if matched:
|
| + print 'Rewriting %s' % linesubs
|
| + print 'To %s' % newlines
|
| + lines = lines[0:i] + newlines + lines[i + num_lines:]
|
| + with tempfile.NamedTemporaryFile(dir=os.path.dirname(filename),
|
| + delete=False) as temp:
|
| + for l in lines:
|
| + temp.write(l)
|
| + os.rename(temp.name, filename)
|
| +
|
| +
|
| +def Main(argv):
|
| + if len(argv) != 1:
|
| + print 'Expected a directory base as args, got %s' % argv
|
| + files = GetFilesList(argv[0])
|
| + for f in files:
|
| + ApplyMultiLineEdits(f, ApplyFunkyHeaderChanges3, 3)
|
| + ApplyMultiLineEdits(f, ApplyFunkyHeaderChanges4, 4)
|
| +# ApplyMultiLineEdits(f, UndoTheCallTransformation, 2)
|
| + ApplyMultiLineEdits(f, FixLockChecks, 2)
|
| + ApplyOnelinersToFile(f)
|
| +# ConvertNumbersToHex(f)
|
| + return 0
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(Main(sys.argv[1:]))
|
|
|