| 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 |
| |
| |
| @@ -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: |