forked from rpms/glibc
158 lines
6.6 KiB
Diff
158 lines
6.6 KiB
Diff
|
commit 477a02f63751c4b759ddd9454d17f2a7ad120ee3
|
||
|
Author: Joseph Myers <joseph@codesourcery.com>
|
||
|
Date: Mon Dec 3 22:08:50 2018 +0000
|
||
|
|
||
|
Make gen-as-const.py handle '--' consistently with awk script.
|
||
|
|
||
|
It was reported in
|
||
|
<https://sourceware.org/ml/libc-alpha/2018-12/msg00045.html> that
|
||
|
gen-as-const.py fails to generate test code in the case where a .sym
|
||
|
file has no symbols in it, so resulting in a test failing to link for
|
||
|
Hurd.
|
||
|
|
||
|
The relevant difference from the old awk script is that the old script
|
||
|
treated '--' lines as indicating that the text to do at the start of
|
||
|
the test (or file used to compute constants) should be output at that
|
||
|
point if not already output, as well as treating lines with actual
|
||
|
entries for constants like that. This patch changes gen-as-const.py
|
||
|
accordingly, making it the sole responsibility of the code parsing
|
||
|
.sym files to determine when such text should be output and ensuring
|
||
|
it's always output at some point even if there are no symbols and no
|
||
|
'--' lines, since not outputting it means the test fails to link.
|
||
|
Handling '--' like that also avoids any problems that would arise if
|
||
|
the first entry for a symbol were inside #ifdef (since the text in
|
||
|
question must not be output inside #ifdef).
|
||
|
|
||
|
Tested for x86_64, and with build-many-glibcs.py for i686-gnu. Note
|
||
|
that there are still compilation test failures for i686-gnu
|
||
|
(linknamespace tests, possibly arising from recent posix_spawn-related
|
||
|
changes).
|
||
|
|
||
|
* scripts/gen-as-const.py (compute_c_consts): Take an argument
|
||
|
'START' to indicate that start text should be output.
|
||
|
(gen_test): Likewise.
|
||
|
(main): Generate 'START' for first symbol or '--' line, or at end
|
||
|
of input if not previously generated.
|
||
|
|
||
|
diff --git a/scripts/gen-as-const.py b/scripts/gen-as-const.py
|
||
|
index cabf401ed15e8367..eb85ef1aa0f4934d 100644
|
||
|
--- a/scripts/gen-as-const.py
|
||
|
+++ b/scripts/gen-as-const.py
|
||
|
@@ -34,28 +34,28 @@ def compute_c_consts(sym_data, cc):
|
||
|
"""Compute the values of some C constants.
|
||
|
|
||
|
The first argument is a list whose elements are either strings
|
||
|
- (preprocessor directives) or pairs of strings (a name and a C
|
||
|
+ (preprocessor directives, or the special string 'START' to
|
||
|
+ indicate this function should insert its initial boilerplate text
|
||
|
+ in the output there) or pairs of strings (a name and a C
|
||
|
expression for the corresponding value). Preprocessor directives
|
||
|
in the middle of the list may be used to select which constants
|
||
|
end up being evaluated using which expressions.
|
||
|
|
||
|
"""
|
||
|
out_lines = []
|
||
|
- started = False
|
||
|
for arg in sym_data:
|
||
|
if isinstance(arg, str):
|
||
|
- out_lines.append(arg)
|
||
|
+ if arg == 'START':
|
||
|
+ out_lines.append('void\ndummy (void)\n{')
|
||
|
+ else:
|
||
|
+ out_lines.append(arg)
|
||
|
continue
|
||
|
name = arg[0]
|
||
|
value = arg[1]
|
||
|
- if not started:
|
||
|
- out_lines.append('void\ndummy (void)\n{')
|
||
|
- started = True
|
||
|
out_lines.append('asm ("@@@name@@@%s@@@value@@@%%0@@@end@@@" '
|
||
|
': : \"i\" ((long int) (%s)));'
|
||
|
% (name, value))
|
||
|
- if started:
|
||
|
- out_lines.append('}')
|
||
|
+ out_lines.append('}')
|
||
|
out_lines.append('')
|
||
|
out_text = '\n'.join(out_lines)
|
||
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||
|
@@ -89,32 +89,32 @@ def gen_test(sym_data):
|
||
|
|
||
|
"""
|
||
|
out_lines = []
|
||
|
- started = False
|
||
|
for arg in sym_data:
|
||
|
if isinstance(arg, str):
|
||
|
- out_lines.append(arg)
|
||
|
+ if arg == 'START':
|
||
|
+ out_lines.append('#include <stdint.h>\n'
|
||
|
+ '#include <stdio.h>\n'
|
||
|
+ '#include <bits/wordsize.h>\n'
|
||
|
+ '#if __WORDSIZE == 64\n'
|
||
|
+ 'typedef uint64_t c_t;\n'
|
||
|
+ '# define U(n) UINT64_C (n)\n'
|
||
|
+ '#else\n'
|
||
|
+ 'typedef uint32_t c_t;\n'
|
||
|
+ '# define U(n) UINT32_C (n)\n'
|
||
|
+ '#endif\n'
|
||
|
+ 'static int\n'
|
||
|
+ 'do_test (void)\n'
|
||
|
+ '{\n'
|
||
|
+ # Compilation test only, using static
|
||
|
+ # assertions.
|
||
|
+ ' return 0;\n'
|
||
|
+ '}\n'
|
||
|
+ '#include <support/test-driver.c>')
|
||
|
+ else:
|
||
|
+ out_lines.append(arg)
|
||
|
continue
|
||
|
name = arg[0]
|
||
|
value = arg[1]
|
||
|
- if not started:
|
||
|
- out_lines.append('#include <stdint.h>\n'
|
||
|
- '#include <stdio.h>\n'
|
||
|
- '#include <bits/wordsize.h>\n'
|
||
|
- '#if __WORDSIZE == 64\n'
|
||
|
- 'typedef uint64_t c_t;\n'
|
||
|
- '# define U(n) UINT64_C (n)\n'
|
||
|
- '#else\n'
|
||
|
- 'typedef uint32_t c_t;\n'
|
||
|
- '# define U(n) UINT32_C (n)\n'
|
||
|
- '#endif\n'
|
||
|
- 'static int\n'
|
||
|
- 'do_test (void)\n'
|
||
|
- '{\n'
|
||
|
- # Compilation test only, using static assertions.
|
||
|
- ' return 0;\n'
|
||
|
- '}\n'
|
||
|
- '#include <support/test-driver.c>')
|
||
|
- started = True
|
||
|
out_lines.append('_Static_assert (U (asconst_%s) == (c_t) (%s), '
|
||
|
'"value of %s");'
|
||
|
% (name, value, name))
|
||
|
@@ -134,6 +134,7 @@ def main():
|
||
|
args = parser.parse_args()
|
||
|
sym_data = []
|
||
|
with open(args.sym_file, 'r') as sym_file:
|
||
|
+ started = False
|
||
|
for line in sym_file:
|
||
|
line = line.strip()
|
||
|
if line == '':
|
||
|
@@ -143,12 +144,17 @@ def main():
|
||
|
sym_data.append(line)
|
||
|
continue
|
||
|
words = line.split(maxsplit=1)
|
||
|
+ if not started:
|
||
|
+ sym_data.append('START')
|
||
|
+ started = True
|
||
|
# Separator.
|
||
|
if words[0] == '--':
|
||
|
continue
|
||
|
name = words[0]
|
||
|
value = words[1] if len(words) > 1 else words[0]
|
||
|
sym_data.append((name, value))
|
||
|
+ if not started:
|
||
|
+ sym_data.append('START')
|
||
|
if args.test:
|
||
|
print(gen_test(sym_data))
|
||
|
else:
|