From patchwork Mon Dec 3 18:25:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 30525 Received: (qmail 96988 invoked by alias); 3 Dec 2018 18:25:50 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 96966 invoked by uid 89); 3 Dec 2018 18:25:48 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, RCVD_IN_DNSWL_NONE, SPF_PASS, T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.2 spammy=responsibility, sole, stdint.h, arise X-HELO: relay1.mentorg.com Date: Mon, 3 Dec 2018 18:25:38 +0000 From: Joseph Myers To: Samuel Thibault CC: Subject: Re: [PATCH] Fix test-as-const-jmp_buf-ssp.c generation on gnu-i386 In-Reply-To: <20181201234419.w2vd74tfgtktzllq@function> Message-ID: References: <20181201231247.p7z3veulcqxfd2o2@function> <20181201234419.w2vd74tfgtktzllq@function> User-Agent: Alpine 2.21 (DEB 202 2017-01-01) MIME-Version: 1.0 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? Make gen-as-const.py handle '--' consistently with awk script. It was reported in 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 * 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 \n' + '#include \n' + '#include \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 ') + else: + out_lines.append(arg) continue name = arg[0] value = arg[1] - if not started: - out_lines.append('#include \n' - '#include \n' - '#include \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 ') - 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: