| Index: src/trusted/validator_ragel/unreviewed/parse_hex.py
|
| diff --git a/src/trusted/validator_ragel/unreviewed/parse_hex.py b/src/trusted/validator_ragel/unreviewed/parse_hex.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9bb90a366197f2e7e72e2da82729f30536f69f2b
|
| --- /dev/null
|
| +++ b/src/trusted/validator_ragel/unreviewed/parse_hex.py
|
| @@ -0,0 +1,84 @@
|
| +#!/usr/bin/python
|
| +# Copyright (c) 2012 The Native Client Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""Converts outputs from the old validator into a list of general errors.
|
| +
|
| +The outputs then would be compared for exact match with what the
|
| +script run_ncval_tests.py outputs for the test.
|
| +
|
| +Works under assumption that the corresponding input files (*.hex) maintain a
|
| +separation of instructions: one instruction per line in .hex file. We could get
|
| +the same information from the validator, but, luckily, we do not have to do
|
| +that.
|
| +"""
|
| +
|
| +import re
|
| +import sys
|
| +
|
| +import run_ncval_tests
|
| +
|
| +
|
| +def WriteFile(filename, data):
|
| + fh = open(filename, "w")
|
| + try:
|
| + fh.write(data)
|
| + finally:
|
| + fh.close()
|
| +
|
| +
|
| +def Main(argv):
|
| + argv = argv[1:]
|
| + offset = None
|
| + for arg in argv:
|
| + assert(arg[-5:] == '.rval')
|
| +
|
| + # Parse the golden file 1st time, find bundle_crosses.
|
| + bundle_crosses = []
|
| + for line in open(arg, 'r').readlines():
|
| + bundle_error_m = re.match(
|
| + r'VALIDATOR: ERROR: ([0-9a-zA-Z]+): Bad basic block alignment', line)
|
| + if bundle_error_m:
|
| + bundle_crosses.append(int(bundle_error_m.group(1), 16))
|
| +
|
| + # Find offsets for all instructions that cross a bundle.
|
| + err_offsets = {}
|
| + insts = run_ncval_tests.InstByteSequence()
|
| + insts.Parse(arg[:-5] + '.hex')
|
| + for bundle_offset in set(bundle_crosses):
|
| + off = bundle_offset - 1
|
| + while off >= 0:
|
| + if insts.HasOffset(off):
|
| + err_offsets[off] = ['crosses boundary']
|
| + break
|
| + off -= 1
|
| +
|
| + # Parse the golden file 2nd time. Find other offsets that cause errors. An
|
| + # error report takes 2 sequential lines.
|
| + seen_offset = False
|
| + for line in open(arg, 'r').readlines():
|
| + ln = line.rstrip()
|
| + off_m = re.match(r'VALIDATOR: ([0-9a-z]+):', ln)
|
| + if off_m:
|
| + seen_offset = True
|
| + prev_offset = offset
|
| + offset = int(off_m.group(1), 16)
|
| + continue
|
| + val_error_m = re.match(r'VALIDATOR: ERROR:', ln)
|
| + if val_error_m and seen_offset and prev_offset != offset:
|
| + err_offsets.setdefault(offset, []).append('validation error')
|
| + seen_offset = False
|
| +
|
| + # Output the error messages in offset order.
|
| + golden_text = ''
|
| + for off, msg_lst in sorted(err_offsets.iteritems()):
|
| + for msg in msg_lst:
|
| + golden_text += 'offset 0x%x: %s\n' % (off, msg)
|
| + filename = arg[:-5] + '.val.ref'
|
| + print 'writing file: %s' % filename
|
| + WriteFile(filename, golden_text)
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(Main(sys.argv))
|
|
|