This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix test-as-const-jmp_buf-ssp.c generation on gnu-i386


Joseph Myers, le lun. 03 déc. 2018 18:25:38 +0000, a ecrit:
> On Sat, 1 Dec 2018, Samuel Thibault wrote:
> 
> > That said, it's not enough, gen_test() does not emit a main() function,
> > and thus the test build fails with missing reference to main(). Is there
> > a strong reason for making the emission of code lazy with the started
> > boolean?
> 
> The text can't be emitted at the start of the file, in the case of 
> computing constants, because that would mean #includes from the .sym file 
> end up inside a function.  It so happens that with this version (not with 
> the previous one) that's not an issue for test generation, but it seems 
> best to me to keep the logic for test generation and constant computation 
> as similar as possible.
> 
> How does this patch seem to fix the unintended difference from the awk 
> script?

That should be doing it indeed.

Thanks!
Samuel

> 
> 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).
> 
> 2018-12-03  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* 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 cabf401ed1..eb85ef1aa0 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:
> 
> -- 
> Joseph S. Myers
> joseph@codesourcery.com
> 

-- 
Samuel
Who wants to remember that escape-x-alt-control-left shift-b puts you into
super-edit-debug-compile mode?
(Discussion in comp.os.linux.misc on the intuitiveness of commands, especially
Emacs.)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]