Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Unified Diff: convert_tests_to_objdump.py

Issue 928663002: Example script converting llvm-objdump -> objdump. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: update to show more hacks -- hexwq conversion Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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:]))
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698