12d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier#!/usr/bin/env python
2a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier#===----------------------------------------------------------------------===##
3a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier#
4a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier#                     The LLVM Compiler Infrastructure
5a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier#
6a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier# This file is dual licensed under the MIT and the University of Illinois Open
7a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier# Source Licenses. See LICENSE.TXT for details.
8a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier#
9a9e91f30eea39e57e4d9cd0067f6a5f10a64c2ebEric Fiselier#===----------------------------------------------------------------------===##
102d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier"""
112d9feb59f05b62531bd8070b41615da5df15d67dEric Fiseliersym_extract - Extract and output a list of symbols from a shared library.
122d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier"""
132d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselierfrom argparse import ArgumentParser
141147753b1ccb0bbc40d05e7e73089e2b7bb38317Eric Fiselierfrom libcxx.sym_check import extract, util
152d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier
162d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier
172d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselierdef main():
182d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    parser = ArgumentParser(
192d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier        description='Extract a list of symbols from a shared library.')
202d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    parser.add_argument('library', metavar='shared-lib', type=str,
212d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier                        help='The library to extract symbols from')
222d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    parser.add_argument('-o', '--output', dest='output',
232d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier                        help='The output file. stdout is used if not given',
242d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier                        type=str, action='store', default=None)
252d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    parser.add_argument('--names-only', dest='names_only',
262d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier                        help='Output only the name of the symbol',
272d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier                        action='store_true', default=False)
280d6941834cb62a02deed43af20d24cc2a10e8acbEric Fiselier    parser.add_argument('--only-stdlib-symbols', dest='only_stdlib',
290d6941834cb62a02deed43af20d24cc2a10e8acbEric Fiselier                        help="Filter all symbols not related to the stdlib",
300d6941834cb62a02deed43af20d24cc2a10e8acbEric Fiselier                        action='store_true', default=False)
312d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    args = parser.parse_args()
322d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    if args.output is not None:
332d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier        print('Extracting symbols from %s to %s.'
342d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier              % (args.library, args.output))
352d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    syms = extract.extract_symbols(args.library)
360d6941834cb62a02deed43af20d24cc2a10e8acbEric Fiselier    if args.only_stdlib:
370d6941834cb62a02deed43af20d24cc2a10e8acbEric Fiselier        syms, other_syms = util.filter_stdlib_symbols(syms)
382d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    util.write_syms(syms, out=args.output, names_only=args.names_only)
392d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier
402d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier
412d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselierif __name__ == '__main__':
422d9feb59f05b62531bd8070b41615da5df15d67dEric Fiselier    main()
43