xref: /openbsd-src/gnu/llvm/libcxx/utils/generate_abi_list.py (revision 76d0caaeb19ae0808d90af1d0b3b7b50b3e5383f)
1*76d0caaeSpatrick#!/usr/bin/env python
2*76d0caaeSpatrick#===----------------------------------------------------------------------===##
3*76d0caaeSpatrick#
4*76d0caaeSpatrick# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*76d0caaeSpatrick# See https://llvm.org/LICENSE.txt for license information.
6*76d0caaeSpatrick# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*76d0caaeSpatrick#
8*76d0caaeSpatrick#===----------------------------------------------------------------------===##
9*76d0caaeSpatrick
10*76d0caaeSpatrickimport argparse
11*76d0caaeSpatrickimport io
12*76d0caaeSpatrickimport libcxx.sym_check.extract
13*76d0caaeSpatrickimport libcxx.sym_check.util
14*76d0caaeSpatrickimport pprint
15*76d0caaeSpatrickimport sys
16*76d0caaeSpatrick
17*76d0caaeSpatrickdef OutputFile(file):
18*76d0caaeSpatrick    if isinstance(file, io.IOBase):
19*76d0caaeSpatrick        return file
20*76d0caaeSpatrick    assert isinstance(file, str), "Got object {} which is not a str".format(file)
21*76d0caaeSpatrick    return open(file, 'w', newline='\n')
22*76d0caaeSpatrick
23*76d0caaeSpatrickdef main(argv):
24*76d0caaeSpatrick    parser = argparse.ArgumentParser(
25*76d0caaeSpatrick        description='Extract a list of symbols from a shared library.')
26*76d0caaeSpatrick    parser.add_argument('library', metavar='LIB', type=str,
27*76d0caaeSpatrick        help='The library to extract symbols from.')
28*76d0caaeSpatrick    parser.add_argument('-o', '--output', dest='output', type=OutputFile, default=sys.stdout,
29*76d0caaeSpatrick        help='The output file to write the symbols to. It is overwritten if it already exists. '
30*76d0caaeSpatrick             'If no file is specified, the results are written to standard output.')
31*76d0caaeSpatrick    args = parser.parse_args(argv)
32*76d0caaeSpatrick
33*76d0caaeSpatrick    symbols = libcxx.sym_check.extract.extract_symbols(args.library)
34*76d0caaeSpatrick    symbols, _ = libcxx.sym_check.util.filter_stdlib_symbols(symbols)
35*76d0caaeSpatrick
36*76d0caaeSpatrick    lines = [pprint.pformat(sym, width=99999) for sym in symbols]
37*76d0caaeSpatrick    args.output.writelines('\n'.join(sorted(lines)))
38*76d0caaeSpatrick
39*76d0caaeSpatrickif __name__ == '__main__':
40*76d0caaeSpatrick    main(sys.argv[1:])
41