Partial backport of:

commit cb7be1590e9b18e272e72eb4e910a7ad06a53bd0
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Mon Dec 10 22:56:59 2018 +0000

    Use gen-as-const.py to process .pysym files.
    
    This patch eliminates the gen-py-const.awk variant of gen-as-const,
    switching to use of gnu-as-const.py (with a new --python option) to
    process .pysym files (i.e., to generate nptl_lock_constants.py), as
    the syntax of those files is identical to that of .sym files.
    
    Note that the generated nptl_lock_constants.py is *not* identical to
    the version generated by the awk script.  Apart from the trivial
    changes (comment referencing the new script, and output being sorted),
    the constant FUTEX_WAITERS, PTHREAD_MUTEXATTR_FLAG_BITS,
    PTHREAD_MUTEXATTR_FLAG_PSHARED and PTHREAD_MUTEX_PRIO_CEILING_MASK are
    now output as positive rather than negative constants (on x86_64
    anyway; maybe not necessarily on 32-bit systems):
    
    < FUTEX_WAITERS = -2147483648
    ---
    > FUTEX_WAITERS = 2147483648
    
    < PTHREAD_MUTEXATTR_FLAG_BITS = -251662336
    < PTHREAD_MUTEXATTR_FLAG_PSHARED = -2147483648
    ---
    > PTHREAD_MUTEXATTR_FLAG_BITS = 4043304960
    > PTHREAD_MUTEXATTR_FLAG_PSHARED = 2147483648
    
    < PTHREAD_MUTEX_PRIO_CEILING_MASK = -524288
    ---
    > PTHREAD_MUTEX_PRIO_CEILING_MASK = 4294443008
    
    This is because gen-as-const has a cast of the constant value to long
    int, which gen-py-const lacks.
    
    I think the positive values are more logically correct, since the
    constants in question are in fact unsigned in C.  But to reliably
    produce gen-as-const.py output for constants that always (in C and
    Python) reflects the signedness of values with the high bit of "long
    int" set would mean more complicated logic needs to be used in
    computing values.
    
    The more correct positive values by themselves produce a failure of
    nptl/test-mutexattr-printers, because masking with
    ~PTHREAD_MUTEXATTR_FLAG_BITS & ~PTHREAD_MUTEX_NO_ELISION_NP now leaves
    a bit -1 << 32 in the Python value, resulting in a KeyError exception.
    To avoid that, places masking with ~ of one of the constants in
    question are changed to mask with 0xffffffff as well (this reflects
    how ~ in Python applies to an infinite-precision integer whereas ~ in
    C does not do any promotions beyond the width of int).
    
    Tested for x86_64.
    
            * 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.

Only the gen-as-const.py changes are included downstream.  We keep using
gen-py-const.awk for the build.

diff --git a/scripts/gen-as-const.py b/scripts/gen-as-const.py
index f85e359394acb1a4..2f1dff092b98e044 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='')
