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