| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium 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 """Check that symbols are ordered into a binary as they appear in the orderfile. | 6 """Check that symbols are ordered into a binary as they appear in the orderfile. |
| 7 """ | 7 """ |
| 8 | 8 |
| 9 import logging | 9 import logging |
| 10 import optparse | 10 import optparse |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 previous_symbol_info = symbol_info | 67 previous_symbol_info = symbol_info |
| 68 return (misordered_count, len(matched_symbol_infos), missing_count) | 68 return (misordered_count, len(matched_symbol_infos), missing_count) |
| 69 | 69 |
| 70 | 70 |
| 71 def main(): | 71 def main(): |
| 72 parser = optparse.OptionParser(usage= | 72 parser = optparse.OptionParser(usage= |
| 73 'usage: %prog [options] <binary> <orderfile>') | 73 'usage: %prog [options] <binary> <orderfile>') |
| 74 parser.add_option('--target-arch', action='store', dest='arch', | 74 parser.add_option('--target-arch', action='store', dest='arch', |
| 75 choices=['arm', 'arm64', 'x86', 'x86_64', 'x64', 'mips'], | 75 choices=['arm', 'arm64', 'x86', 'x86_64', 'x64', 'mips'], |
| 76 help='The target architecture for the binary.') | 76 help='The target architecture for the binary.') |
| 77 parser.add_option('--threshold', action='store', dest='threshold', default=1, | 77 parser.add_option('--threshold', action='store', dest='threshold', default=10, |
| 78 help='The maximum allowed number of out-of-order symbols.') | 78 help='The maximum allowed number of out-of-order symbols.') |
| 79 options, argv = parser.parse_args(sys.argv) | 79 options, argv = parser.parse_args(sys.argv) |
| 80 if not options.arch: | 80 if not options.arch: |
| 81 options.arch = cygprofile_utils.DetectArchitecture() | 81 options.arch = cygprofile_utils.DetectArchitecture() |
| 82 if len(argv) != 3: | 82 if len(argv) != 3: |
| 83 parser.print_help() | 83 parser.print_help() |
| 84 return 1 | 84 return 1 |
| 85 (binary_filename, orderfile_filename) = argv[1:] | 85 (binary_filename, orderfile_filename) = argv[1:] |
| 86 | 86 |
| 87 symbol_extractor.SetArchitecture(options.arch) | 87 symbol_extractor.SetArchitecture(options.arch) |
| 88 obj_dir = cygprofile_utils.GetObjDir(binary_filename) | 88 obj_dir = cygprofile_utils.GetObjDir(binary_filename) |
| 89 symbol_to_sections_map = \ | 89 symbol_to_sections_map = \ |
| 90 cyglog_to_orderfile.GetSymbolToSectionsMapFromObjectFiles(obj_dir) | 90 cyglog_to_orderfile.GetSymbolToSectionsMapFromObjectFiles(obj_dir) |
| 91 section_to_symbols_map = cygprofile_utils.InvertMapping( | 91 section_to_symbols_map = cygprofile_utils.InvertMapping( |
| 92 symbol_to_sections_map) | 92 symbol_to_sections_map) |
| 93 symbols = patch_orderfile.GetSymbolsFromOrderfile(orderfile_filename, | 93 symbols = patch_orderfile.GetSymbolsFromOrderfile(orderfile_filename, |
| 94 section_to_symbols_map) | 94 section_to_symbols_map) |
| 95 symbol_infos = symbol_extractor.SymbolInfosFromBinary(binary_filename) | 95 symbol_infos = symbol_extractor.SymbolInfosFromBinary(binary_filename) |
| 96 # Missing symbols is not an error since some of them can be eliminated through | 96 # Missing symbols is not an error since some of them can be eliminated through |
| 97 # inlining. | 97 # inlining. |
| 98 (misordered_pairs_count, matched_symbols, _) = _CountMisorderedSymbols( | 98 (misordered_pairs_count, matched_symbols, _) = _CountMisorderedSymbols( |
| 99 symbols, symbol_infos) | 99 symbols, symbol_infos) |
| 100 return (misordered_pairs_count > options.threshold) or (matched_symbols == 0) | 100 return (misordered_pairs_count > options.threshold) or (matched_symbols == 0) |
| 101 | 101 |
| 102 | 102 |
| 103 if __name__ == '__main__': | 103 if __name__ == '__main__': |
| 104 logging.basicConfig(level=logging.INFO) | 104 logging.basicConfig(level=logging.INFO) |
| 105 sys.exit(main()) | 105 sys.exit(main()) |
| OLD | NEW |