|  | #!/usr/bin/env python | 
|  | # ===----------------------------------------------------------------------===## | 
|  | # | 
|  | # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | # See https://llvm.org/LICENSE.txt for license information. | 
|  | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | # | 
|  | # ===----------------------------------------------------------------------===## | 
|  | """ | 
|  | sym_diff - Compare two symbol lists and output the differences. | 
|  | """ | 
|  |  | 
|  | from argparse import ArgumentParser | 
|  | import sys | 
|  | from libcxx.sym_check import diff, util | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = ArgumentParser( | 
|  | description="Extract a list of symbols from a shared library." | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--names-only", | 
|  | dest="names_only", | 
|  | help="Only print symbol names", | 
|  | action="store_true", | 
|  | default=False, | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--removed-only", | 
|  | dest="removed_only", | 
|  | help="Only print removed symbols", | 
|  | action="store_true", | 
|  | default=False, | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--only-stdlib-symbols", | 
|  | dest="only_stdlib", | 
|  | help="Filter all symbols not related to the stdlib", | 
|  | action="store_true", | 
|  | default=False, | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--strict", | 
|  | dest="strict", | 
|  | help="Exit with a non-zero status if any symbols " "differ", | 
|  | action="store_true", | 
|  | default=False, | 
|  | ) | 
|  | parser.add_argument( | 
|  | "-o", | 
|  | "--output", | 
|  | dest="output", | 
|  | help="The output file. stdout is used if not given", | 
|  | type=str, | 
|  | action="store", | 
|  | default=None, | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--demangle", dest="demangle", action="store_true", default=False | 
|  | ) | 
|  | parser.add_argument( | 
|  | "old_syms", | 
|  | metavar="old-syms", | 
|  | type=str, | 
|  | help="The file containing the old symbol list or a library", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "new_syms", | 
|  | metavar="new-syms", | 
|  | type=str, | 
|  | help="The file containing the new symbol list or a library", | 
|  | ) | 
|  | args = parser.parse_args() | 
|  |  | 
|  | old_syms_list = util.extract_or_load(args.old_syms) | 
|  | new_syms_list = util.extract_or_load(args.new_syms) | 
|  |  | 
|  | if args.only_stdlib: | 
|  | old_syms_list, _ = util.filter_stdlib_symbols(old_syms_list) | 
|  | new_syms_list, _ = util.filter_stdlib_symbols(new_syms_list) | 
|  |  | 
|  | added, removed, changed = diff.diff(old_syms_list, new_syms_list) | 
|  | if args.removed_only: | 
|  | added = {} | 
|  | report, is_break, is_different = diff.report_diff( | 
|  | added, removed, changed, names_only=args.names_only, demangle=args.demangle | 
|  | ) | 
|  | if args.output is None: | 
|  | print(report) | 
|  | else: | 
|  | with open(args.output, "w") as f: | 
|  | f.write(report + "\n") | 
|  | exit_code = 1 if is_break or (args.strict and is_different) else 0 | 
|  | sys.exit(exit_code) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |