diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | Makerules | 44 | ||||
-rw-r--r-- | manual/README.pretty-printers | 2 | ||||
-rw-r--r-- | nptl/nptl-printers.py | 3 | ||||
-rw-r--r-- | scripts/gen-as-const.py | 9 | ||||
-rw-r--r-- | scripts/gen-py-const.awk | 118 |
6 files changed, 38 insertions, 150 deletions
@@ -1,5 +1,17 @@ 2018-12-10 Joseph Myers <joseph@codesourcery.com> + * scripts/gen-as-const.py (main): Handle --python option. + * scripts/gen-py-const.awk: Remove. + * Makerules (py-const-script): Use gen-as-const.py. + ($(py-const)): Likewise. + * nptl/nptl-printers.py (MutexPrinter.read_status_no_robust): Mask + with 0xffffffff together with ~(PTHREAD_MUTEX_PRIO_CEILING_MASK). + (MutexAttributesPrinter.read_values): Mask with 0xffffffff + together with ~PTHREAD_MUTEXATTR_FLAG_BITS and + ~PTHREAD_MUTEX_NO_ELISION_NP. + * manual/README.pretty-printers: Update reference to + gen-py-const.awk. + * scripts/glibcextract.py: New file. * scripts/gen-as-const.py: Do not import os.path, re, subprocess or tempfile. Import glibcexctract. @@ -232,42 +232,26 @@ ifdef gen-py-const-headers py-const-files := $(patsubst %.pysym,%.py,$(gen-py-const-headers)) py-const-dir := $(objpfx) py-const := $(addprefix $(py-const-dir),$(py-const-files)) -py-const-script := $(..)scripts/gen-py-const.awk +py-const-script := $(..)scripts/gen-as-const.py -# This is a hack we use to generate .py files with constants for Python -# pretty printers. It works the same way as gen-as-const. -# See scripts/gen-py-const.awk for details on how the awk | gcc mechanism -# works. +# This is a hack we use to generate .py files with constants for +# Python code. # -# $@.tmp and $@.tmp2 are temporary files we use to store the partial contents -# of the target file. We do this instead of just writing on $@ because, if the -# build process terminates prematurely, re-running Make wouldn't run this rule -# since Make would see that the target file already exists (despite it being -# incomplete). +# $@.tmp is a temporary file we use to store the partial contents of +# the target file. We do this instead of just writing on $@ because, +# if the build process terminates prematurely, re-running Make +# wouldn't run this rule since Make would see that the target file +# already exists (despite it being incomplete). # -# The sed line replaces "@name@SOME_NAME@value@SOME_VALUE@" strings from the -# output of 'gcc -S' with "SOME_NAME = SOME_VALUE" strings. -# The '-n' option, combined with the '/p' command, makes sed output only the -# modified lines instead of the whole input file. The output is redirected -# to a .py file; we'll import it in the pretty printers file to read -# the constants generated by gen-py-const.awk. -# The regex has two capturing groups, for SOME_NAME and SOME_VALUE -# respectively. Notice SOME_VALUE may be prepended by a special character, -# depending on the assembly syntax (e.g. immediates are prefixed by a '$' -# in AT&T x86, and by a '#' in ARM). We discard it using a complemented set -# before the second capturing group. +# The output is redirected to a .py file; we'll import it in the main +# Python code to read the constants generated by gen-as-const.py. $(py-const): $(py-const-dir)%.py: %.pysym $(py-const-script) \ $(common-before-compile) $(make-target-directory) - $(AWK) -f $(py-const-script) $< \ - | $(CC) -S -o $@.tmp $(CFLAGS) $(CPPFLAGS) -x c - - echo '# GENERATED FILE\n' > $@.tmp2 - echo '# Constant definitions for pretty printers.' >> $@.tmp2 - echo '# See gen-py-const.awk for details.\n' >> $@.tmp2 - sed -n -r 's/^.*@name@([^@]+)@value@[^[:xdigit:]Xx-]*([[:xdigit:]Xx-]+)@.*/\1 = \2/p' \ - $@.tmp >> $@.tmp2 - mv -f $@.tmp2 $@ - rm -f $@.tmp + $(PYTHON) $(py-const-script) --python \ + --cc="$(CC) $(CFLAGS) $(CPPFLAGS)" $< \ + > $@.tmp + mv -f $@.tmp $@ generated += $(py-const) endif # gen-py-const-headers diff --git a/manual/README.pretty-printers b/manual/README.pretty-printers index 2522cb8..a2ba898 100644 --- a/manual/README.pretty-printers +++ b/manual/README.pretty-printers @@ -104,7 +104,7 @@ Adding new pretty printers Adding new pretty printers to glibc requires following these steps: 1. Identify which constants must be generated from C headers, and write the -corresponding .pysym file. See scripts/gen-py-const.awk for more information +corresponding .pysym file. See scripts/gen-as-const.py for more information on how this works. The name of the .pysym file must be added to the 'gen-py-const-headers' variable in your submodule's Makefile (without the .pysym extension). diff --git a/nptl/nptl-printers.py b/nptl/nptl-printers.py index c5a69ef..104460c 100644 --- a/nptl/nptl-printers.py +++ b/nptl/nptl-printers.py @@ -155,7 +155,7 @@ class MutexPrinter(object): lock_value = self.lock if self.kind & PTHREAD_MUTEX_PRIO_PROTECT_NP: - lock_value &= ~(PTHREAD_MUTEX_PRIO_CEILING_MASK) + lock_value &= 0xffffffff & ~(PTHREAD_MUTEX_PRIO_CEILING_MASK) if lock_value == PTHREAD_MUTEX_UNLOCKED: self.values.append(('Status', 'Not acquired')) @@ -274,6 +274,7 @@ class MutexAttributesPrinter(object): """ mutexattr_type = (self.mutexattr + & 0xffffffff & ~PTHREAD_MUTEXATTR_FLAG_BITS & ~PTHREAD_MUTEX_NO_ELISION_NP) 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 "}"; } |