| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2016 the V8 project authors. All rights reserved. | 2 # Copyright 2016 the V8 project authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """ | 6 """ |
| 7 V8 correctness fuzzer launcher script. | 7 V8 correctness fuzzer launcher script. |
| 8 """ | 8 """ |
| 9 | 9 |
| 10 import argparse | 10 import argparse |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 FUZZ_TEST_RE = re.compile(r'.*fuzz(-\d+\.js)') | 85 FUZZ_TEST_RE = re.compile(r'.*fuzz(-\d+\.js)') |
| 86 SOURCE_RE = re.compile(r'print\("v8-foozzie source: (.*)"\);') | 86 SOURCE_RE = re.compile(r'print\("v8-foozzie source: (.*)"\);') |
| 87 | 87 |
| 88 # The number of hex digits used from the hash of the original source file path. | 88 # The number of hex digits used from the hash of the original source file path. |
| 89 # Keep the number small to avoid duplicate explosion. | 89 # Keep the number small to avoid duplicate explosion. |
| 90 ORIGINAL_SOURCE_HASH_LENGTH = 3 | 90 ORIGINAL_SOURCE_HASH_LENGTH = 3 |
| 91 | 91 |
| 92 # Placeholder string if no original source file could be determined. | 92 # Placeholder string if no original source file could be determined. |
| 93 ORIGINAL_SOURCE_DEFAULT = 'none' | 93 ORIGINAL_SOURCE_DEFAULT = 'none' |
| 94 | 94 |
| 95 |
| 96 def infer_arch(d8): |
| 97 """Infer the V8 architecture from the build configuration next to the |
| 98 executable. |
| 99 """ |
| 100 with open(os.path.join(os.path.dirname(d8), 'v8_build_config.json')) as f: |
| 101 arch = json.load(f)['v8_current_cpu'] |
| 102 return 'ia32' if arch == 'x86' else arch |
| 103 |
| 104 |
| 95 def parse_args(): | 105 def parse_args(): |
| 96 parser = argparse.ArgumentParser() | 106 parser = argparse.ArgumentParser() |
| 97 parser.add_argument( | 107 parser.add_argument( |
| 98 '--random-seed', type=int, required=True, | 108 '--random-seed', type=int, required=True, |
| 99 help='random seed passed to both runs') | 109 help='random seed passed to both runs') |
| 100 parser.add_argument( | 110 parser.add_argument( |
| 101 '--first-arch', help='first architecture', default='x64') | |
| 102 parser.add_argument( | |
| 103 '--second-arch', help='second architecture', default='x64') | |
| 104 parser.add_argument( | |
| 105 '--first-config', help='first configuration', default='fullcode') | 111 '--first-config', help='first configuration', default='fullcode') |
| 106 parser.add_argument( | 112 parser.add_argument( |
| 107 '--second-config', help='second configuration', default='fullcode') | 113 '--second-config', help='second configuration', default='fullcode') |
| 108 parser.add_argument( | 114 parser.add_argument( |
| 109 '--first-d8', default='d8', | 115 '--first-d8', default='d8', |
| 110 help='optional path to first d8 executable, ' | 116 help='optional path to first d8 executable, ' |
| 111 'default: bundled in the same directory as this script') | 117 'default: bundled in the same directory as this script') |
| 112 parser.add_argument( | 118 parser.add_argument( |
| 113 '--second-d8', | 119 '--second-d8', |
| 114 help='optional path to second d8 executable, default: same as first') | 120 help='optional path to second d8 executable, default: same as first') |
| 115 parser.add_argument('testcase', help='path to test case') | 121 parser.add_argument('testcase', help='path to test case') |
| 116 options = parser.parse_args() | 122 options = parser.parse_args() |
| 117 | 123 |
| 118 # Ensure we make a sane comparison. | |
| 119 assert (options.first_arch != options.second_arch or | |
| 120 options.first_config != options.second_config) , ( | |
| 121 'Need either arch or config difference.') | |
| 122 assert options.first_arch in SUPPORTED_ARCHS | |
| 123 assert options.second_arch in SUPPORTED_ARCHS | |
| 124 assert options.first_config in CONFIGS | |
| 125 assert options.second_config in CONFIGS | |
| 126 | |
| 127 # Ensure we have a test case. | 124 # Ensure we have a test case. |
| 128 assert (os.path.exists(options.testcase) and | 125 assert (os.path.exists(options.testcase) and |
| 129 os.path.isfile(options.testcase)), ( | 126 os.path.isfile(options.testcase)), ( |
| 130 'Test case %s doesn\'t exist' % options.testcase) | 127 'Test case %s doesn\'t exist' % options.testcase) |
| 131 | 128 |
| 132 # Use first d8 as default for second d8. | 129 # Use first d8 as default for second d8. |
| 133 options.second_d8 = options.second_d8 or options.first_d8 | 130 options.second_d8 = options.second_d8 or options.first_d8 |
| 134 | 131 |
| 135 # Ensure absolute paths. | 132 # Ensure absolute paths. |
| 136 if not os.path.isabs(options.first_d8): | 133 if not os.path.isabs(options.first_d8): |
| 137 options.first_d8 = os.path.join(BASE_PATH, options.first_d8) | 134 options.first_d8 = os.path.join(BASE_PATH, options.first_d8) |
| 138 if not os.path.isabs(options.second_d8): | 135 if not os.path.isabs(options.second_d8): |
| 139 options.second_d8 = os.path.join(BASE_PATH, options.second_d8) | 136 options.second_d8 = os.path.join(BASE_PATH, options.second_d8) |
| 140 | 137 |
| 141 # Ensure executables exist. | 138 # Ensure executables exist. |
| 142 assert os.path.exists(options.first_d8) | 139 assert os.path.exists(options.first_d8) |
| 143 assert os.path.exists(options.second_d8) | 140 assert os.path.exists(options.second_d8) |
| 144 | 141 |
| 145 # Ensure we use different executables when we claim we compare | 142 # Infer architecture from build artifacts. |
| 146 # different architectures. | 143 options.first_arch = infer_arch(options.first_d8) |
| 147 # TODO(machenbach): Infer arch from gn's build output. | 144 options.second_arch = infer_arch(options.second_d8) |
| 148 if options.first_arch != options.second_arch: | 145 |
| 149 assert options.first_d8 != options.second_d8 | 146 # Ensure we make a sane comparison. |
| 147 assert (options.first_arch != options.second_arch or |
| 148 options.first_config != options.second_config), ( |
| 149 'Need either arch or config difference.') |
| 150 assert options.first_arch in SUPPORTED_ARCHS |
| 151 assert options.second_arch in SUPPORTED_ARCHS |
| 152 assert options.first_config in CONFIGS |
| 153 assert options.second_config in CONFIGS |
| 150 | 154 |
| 151 return options | 155 return options |
| 152 | 156 |
| 153 | 157 |
| 154 def get_meta_data(content): | 158 def get_meta_data(content): |
| 155 """Extracts original-source-file paths from test case content.""" | 159 """Extracts original-source-file paths from test case content.""" |
| 156 sources = [] | 160 sources = [] |
| 157 for line in content.splitlines(): | 161 for line in content.splitlines(): |
| 158 match = SOURCE_RE.match(line) | 162 match = SOURCE_RE.match(line) |
| 159 if match: | 163 if match: |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 configs='', source_key='', suppression='wrong_usage') | 295 configs='', source_key='', suppression='wrong_usage') |
| 292 result = RETURN_FAIL | 296 result = RETURN_FAIL |
| 293 except Exception as e: | 297 except Exception as e: |
| 294 print FAILURE_HEADER_TEMPLATE % dict( | 298 print FAILURE_HEADER_TEMPLATE % dict( |
| 295 configs='', source_key='', suppression='internal_error') | 299 configs='', source_key='', suppression='internal_error') |
| 296 print '# Internal error: %s' % e | 300 print '# Internal error: %s' % e |
| 297 traceback.print_exc(file=sys.stdout) | 301 traceback.print_exc(file=sys.stdout) |
| 298 result = RETURN_FAIL | 302 result = RETURN_FAIL |
| 299 | 303 |
| 300 sys.exit(result) | 304 sys.exit(result) |
| OLD | NEW |