diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/gen-as-const.py | 9 | ||||
-rw-r--r-- | scripts/gen-py-const.awk | 118 |
2 files changed, 9 insertions, 118 deletions
diff --git a/scripts/gen-as-const.py b/scripts/gen-as-const.py index f85e359..2f1dff0 100644 --- a/scripts/gen-as-const.py +++ b/scripts/gen-as-const.py @@ -75,6 +75,8 @@ def main(): help='C compiler (including options) to use') parser.add_argument('--test', action='store_true', help='Generate test case instead of header') + parser.add_argument('--python', action='store_true', + help='Generate Python file instead of header') parser.add_argument('sym_file', help='.sym file to process') args = parser.parse_args() @@ -103,6 +105,13 @@ def main(): sym_data.append('START') if args.test: print(gen_test(sym_data)) + elif args.python: + consts = glibcextract.compute_c_consts(sym_data, args.cc) + print('# GENERATED FILE\n' + '\n' + '# Constant definitions.\n' + '# See gen-as-const.py for details.\n') + print(''.join('%s = %s\n' % c for c in sorted(consts.items())), end='') else: consts = glibcextract.compute_c_consts(sym_data, args.cc) print(''.join('#define %s %s\n' % c for c in sorted(consts.items())), end='') diff --git a/scripts/gen-py-const.awk b/scripts/gen-py-const.awk deleted file mode 100644 index 9122028..0000000 --- a/scripts/gen-py-const.awk +++ /dev/null @@ -1,118 +0,0 @@ -# Script to generate constants for Python pretty printers. -# -# Copyright (C) 2016-2018 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# -# The GNU C Library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# The GNU C Library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with the GNU C Library; if not, see -# <http://www.gnu.org/licenses/>. - -# This script is a smaller version of the clever gen-asm-const.awk hack used to -# generate ASM constants from .sym files. We'll use this to generate constants -# for Python pretty printers. -# -# The input to this script are .pysym files that look like: -# #C_Preprocessor_Directive... -# NAME1 -# NAME2 expression... -# -# A line giving just a name implies an expression consisting of just that name. -# Comments start with '--'. -# -# The output of this script is a 'dummy' function containing 'asm' declarations -# for each non-preprocessor line in the .pysym file. The expression values -# will appear as input operands to the 'asm' declaration. For example, if we -# have: -# -# /* header.h */ -# #define MACRO 42 -# -# struct S { -# char c1; -# char c2; -# char c3; -# }; -# -# enum E { -# ZERO, -# ONE -# }; -# -# /* symbols.pysym */ -# #include <stddef.h> -# #include "header.h" -# -- This is a comment -# MACRO -# C3_OFFSET offsetof(struct S, c3) -# E_ONE ONE -# -# the output will be: -# -# #include <stddef.h> -# #include "header.h" -# void dummy(void) -# { -# asm ("@name@MACRO@value@%0@" : : "i" (MACRO)); -# asm ("@name@C3_OFFSET@value@%0@" : : "i" (offsetof(struct S, c3))); -# asm ("@name@E_ONE@value@%0@" : : "i" (ONE)); -# } -# -# We'll later feed this output to gcc -S. Since '-S' tells gcc to compile but -# not assemble, gcc will output something like: -# -# dummy: -# ... -# @name@MACRO@value@$42@ -# @name@C3_OFFSET@value@$2@ -# @name@E_ONE@value@$1@ -# -# Finally, we can process that output to extract the constant values. -# Notice gcc may prepend a special character such as '$' to each value. - -# found_symbol indicates whether we found a non-comment, non-preprocessor line. -BEGIN { found_symbol = 0 } - -# C preprocessor directives go straight through. -/^#/ { print; next; } - -# Skip comments. -/--/ { next; } - -# Trim leading whitespace. -{ sub(/^[[:blank:]]*/, ""); } - -# If we found a non-comment, non-preprocessor line, print the 'dummy' function -# header. -NF > 0 && !found_symbol { - print "void dummy(void)\n{"; - found_symbol = 1; -} - -# If the line contains just a name, duplicate it so we can use that name -# as the value of the expression. -NF == 1 { sub(/^.*$/, "& &"); } - -# If a line contains a name and an expression... -NF > 1 { - name = $1; - - # Remove any characters before the second field. - sub(/^[^[:blank:]]+[[:blank:]]+/, ""); - - # '$0' ends up being everything that appeared after the first field - # separator. - printf " asm (\"@name@%s@value@%0@\" : : \"i\" (%s));\n", name, $0; -} - -# Close the 'dummy' function. -END { if (found_symbol) print "}"; } |