diff options
Diffstat (limited to 'utils/CmpDriver')
-rwxr-xr-x | utils/CmpDriver | 92 |
1 files changed, 54 insertions, 38 deletions
diff --git a/utils/CmpDriver b/utils/CmpDriver index 97c91a8209156..16b108117d3e9 100755 --- a/utils/CmpDriver +++ b/utils/CmpDriver @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python import subprocess @@ -33,36 +33,26 @@ def insertMinimumPadding(a, b, dist): Assumes dist(X, Y) -> int and non-negative. """ - # Yay for simplicity over complexity. - - def extend(aElt, bElt, solution): - d0,(a0,b0) = solution - return d0 + dist(aElt,bElt), (([aElt]+a0),([bElt]+b0)) - - def f(a, b): - if len(a) == len(b): - return (sum(map(dist, a, b)), (a, b)) - - if not a or not b: - if not a: - a += [None] * len(b) - else: - b += [None] * len(a) - return (sum(map(dist, a, b)), (a, b)) - - if int(dist(a[0], b[0])) == 0: - # Non-negative condition implies maximum is satisfied - # taking this. - return extend(a[0], b[0], f(a[1:], b[1:])) - - if len(a) < len(b): - return min(f([None] + a, b), - extend(a[0], b[0], f(a[1:], b[1:]))) - else: - return min(f(a, [None] + b), - extend(a[0], b[0], f(a[1:], b[1:]))) - - return f(a, b)[1] + def cost(a, b): + return sum(map(dist, a + [None] * (len(b) - len(a)), b)) + + # Normalize so a is shortest. + if len(b) < len(a): + b, a = insertMinimumPadding(b, a, dist) + return a,b + + # For each None we have to insert... + for i in range(len(b) - len(a)): + # For each position we could insert it... + current = cost(a, b) + best = None + for j in range(len(a) + 1): + a_0 = a[:j] + [None] + a[j:] + candidate = cost(a_0, b) + if best is None or candidate < best[0]: + best = (candidate, a_0, j) + a = best[1] + return a,b class ZipperDiff(object): """ZipperDiff - Simple (slow) diff only accomodating inserts.""" @@ -107,7 +97,7 @@ class CompileInfo: ln.startswith('Configured with: ') or ln.startswith('Thread model: ') or ln.startswith('gcc version') or - ln.startswith('ccc version')): + ln.startswith('clang version')): pass elif ln.strip().startswith('"'): self.commands.append(list(splitArgs(ln))) @@ -131,7 +121,7 @@ def main(): args = sys.argv[1:] driverA = os.getenv('DRIVER_A') or 'gcc' - driverB = os.getenv('DRIVER_B') or 'xcc' + driverB = os.getenv('DRIVER_B') or 'clang' infoA = captureDriverInfo(driverA, args) infoB = captureDriverInfo(driverB, args) @@ -141,15 +131,41 @@ def main(): # Compare stdout. if infoA.stdout != infoB.stdout: print '-- STDOUT DIFFERS -' - print 'A: ',infoA.stdout - print 'B: ',infoB.stdout + print 'A OUTPUT: ',infoA.stdout + print 'B OUTPUT: ',infoB.stdout + print + + diff = ZipperDiff(infoA.stdout.split('\n'), + infoB.stdout.split('\n')) + for i,(aElt,bElt) in enumerate(diff.getDiffs()): + if aElt is None: + print 'A missing: %s' % bElt + elif bElt is None: + print 'B missing: %s' % aElt + else: + print 'mismatch: A: %s' % aElt + print ' B: %s' % bElt + differ = True # Compare stderr. if infoA.stderr != infoB.stderr: print '-- STDERR DIFFERS -' - print 'A: ',infoA.stderr - print 'B: ',infoB.stderr + print 'A STDERR: ',infoA.stderr + print 'B STDERR: ',infoB.stderr + print + + diff = ZipperDiff(infoA.stderr.split('\n'), + infoB.stderr.split('\n')) + for i,(aElt,bElt) in enumerate(diff.getDiffs()): + if aElt is None: + print 'A missing: %s' % bElt + elif bElt is None: + print 'B missing: %s' % aElt + else: + print 'mismatch: A: %s' % aElt + print ' B: %s' % bElt + differ = True # Compare commands. @@ -191,4 +207,4 @@ def main(): sys.exit(1) if __name__ == '__main__': - main() + main() |