forked from rpms/glibc
99 lines
4.4 KiB
Diff
99 lines
4.4 KiB
Diff
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='')
|