From patchwork Tue Sep 12 08:45:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Thomas Schwinge X-Patchwork-Id: 1832779 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4RlHH46Kvrz1ygM for ; Tue, 12 Sep 2023 18:45:52 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A3FDD3858024 for ; Tue, 12 Sep 2023 08:45:50 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 4327A3858D3C for ; Tue, 12 Sep 2023 08:45:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4327A3858D3C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-CSE-ConnectionGUID: 7S/DrLSRSJC6taLcA2uTaw== X-CSE-MsgGUID: hHhWOUtKQZusjo11rhQWzQ== X-IronPort-AV: E=Sophos;i="6.02,245,1688457600"; d="scan'208,223";a="18845538" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa1.mentor.iphmx.com with ESMTP; 12 Sep 2023 00:45:33 -0800 IronPort-SDR: qQCAXF4EE15+gwpFYME8x9ll/gpa5CD4FEX+orzijYWbCh4klZeI37tz+0so88wKS1mKhgTee6 p/klGLYNmvH2xavBFB2iEZrAxvuY2hVUnkT8DoDtVE+/uwBdiBEDsGNkZ5OtvdTFTPNKeQCE6t 3R8CunKEG/wVM25qtsJCyxpwLwvr8y6qdfXr+jxHX5BBBplnN7wSclx8UcxRF3AH9EyU0FzUjD jDpL647poujYppMq+e31eWyg61EbxdzDrIc1+AKSWICC1RWl0ATlD3vEvWQBJCXNU6dtB9Caok 6dQ= From: Thomas Schwinge To: Richard Sandiford , Subject: testsuite: Port 'check-function-bodies' to nvptx In-Reply-To: References: <874jk9wsxq.fsf@euler.schwinge.homeip.net> <87zg20vmka.fsf@euler.schwinge.homeip.net> User-Agent: Notmuch/0.29.3+94~g74c3f1b (https://notmuchmail.org) Emacs/28.2 (x86_64-pc-linux-gnu) Date: Tue, 12 Sep 2023 10:45:27 +0200 Message-ID: <87edj3zsns.fsf@euler.schwinge.homeip.net> MIME-Version: 1.0 X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-15.mgc.mentorg.com (139.181.222.15) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Roger Sayle Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi! On 2023-09-05T15:28:20+0100, Richard Sandiford via Gcc-patches wrote: > Thomas Schwinge writes: >> On 2023-09-04T23:05:05+0200, I wrote: >>> On 2019-07-16T15:04:49+0100, Richard Sandiford wrote: >>>> This patch therefore adds a new check-function-bodies dg-final test >> >>>> The regexps in parse_function_bodies are fairly general, but might >>>> still need to be extended in future for targets like Darwin or AIX. >>> >>> ..., or nvptx. [...] >> Any comments before I push the attached >> "testsuite: Port 'check-function-bodies' to nvptx"? > LGTM. Just a minor comment: >> --- a/gcc/doc/sourcebuild.texi >> +++ b/gcc/doc/sourcebuild.texi >> @@ -3327,9 +3327,12 @@ The first line of the expected output for a function @var{fn} has the form: >> Subsequent lines of the expected output also start with @var{prefix}. >> In both cases, whitespace after @var{prefix} is not significant. >> >> -The test discards assembly directives such as @code{.cfi_startproc} >> -and local label definitions such as @code{.LFB0} from the compiler's >> -assembly output. It then matches the result against the expected >> +Depending on the configuration (see >> +@code{gcc/testsuite/lib/scanasm.exp:configure_check-function-bodies}), > > I can imagine such a long string wouldn't format well in the output. > How about: @code{configure_check-function-bodies} in > @filename{gcc/testsuite/lib/scanasm.exp}? Thanks, good suggestion. Also, I've backed out the 'gcc.target/nvptx/abort.c' change to use 'check-function-bodies', leaving that for a later commit to translate more of 'gcc.target/nvptx/[...]'. Pushed to master branch commit 50410234a3d2e1b85203d97fe6f65fd9d1f0e100 "testsuite: Port 'check-function-bodies' to nvptx", see attached. Grüße Thomas ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955 From 50410234a3d2e1b85203d97fe6f65fd9d1f0e100 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Mon, 4 Sep 2023 22:28:12 +0200 Subject: [PATCH] testsuite: Port 'check-function-bodies' to nvptx This extends commit 4d706ff86ea86868615558e92407674a4f4b4af9 "Add dg test for matching function bodies" for nvptx. gcc/testsuite/ * lib/scanasm.exp (configure_check-function-bodies): New proc. (parse_function_bodies, check-function-bodies): Use it. gcc/ * doc/sourcebuild.texi (check-function-bodies): Update. --- gcc/doc/sourcebuild.texi | 9 +++-- gcc/testsuite/lib/scanasm.exp | 76 +++++++++++++++++++++++++++-------- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 1a78b3c1abb..de1aa8c2dba 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -3327,9 +3327,12 @@ The first line of the expected output for a function @var{fn} has the form: Subsequent lines of the expected output also start with @var{prefix}. In both cases, whitespace after @var{prefix} is not significant. -The test discards assembly directives such as @code{.cfi_startproc} -and local label definitions such as @code{.LFB0} from the compiler's -assembly output. It then matches the result against the expected +Depending on the configuration (see +@code{configure_check-function-bodies} in +@file{gcc/testsuite/lib/scanasm.exp}), the test may discard from the +compiler's assembly output directives such as @code{.cfi_startproc}, +local label definitions such as @code{.LFB0}, and more. +It then matches the result against the expected output for a function as a single regular expression. This means that later lines can use backslashes to refer back to @samp{(@dots{})} captures on earlier lines. For example: diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp index 0685de1d641..5df80325dff 100644 --- a/gcc/testsuite/lib/scanasm.exp +++ b/gcc/testsuite/lib/scanasm.exp @@ -777,33 +777,73 @@ proc scan-lto-assembler { args } { dg-scan "scan-lto-assembler" 1 $testcase $output_file $args } -# Read assembly file FILENAME and store a mapping from function names -# to function bodies in array RESULT. FILENAME has already been uploaded -# locally where necessary and is known to exist. -proc parse_function_bodies { filename result } { - upvar $result up_result +# Set up CONFIG for check-function-bodies. + +proc configure_check-function-bodies { config } { + upvar $config up_config # Regexp for the start of a function definition (name in \1). - set label {^([a-zA-Z_]\S+):$} + if { [istarget nvptx*-*-*] } { + set up_config(start) {^// BEGIN(?: GLOBAL|) FUNCTION DEF: ([a-zA-Z_]\S+)$} + } else { + set up_config(start) {^([a-zA-Z_]\S+):$} + } # Regexp for the end of a function definition. - set terminator {^\s*\.size} - + if { [istarget nvptx*-*-*] } { + set up_config(end) {^\}$} + } else { + set up_config(end) {^\s*\.size} + } + # Regexp for lines that aren't interesting. - set fluff {^\s*(?:\.|//|@|$)} + if { [istarget nvptx*-*-*] } { + # Skip lines beginning with '//' comments ('-fverbose-asm', for + # example). + set up_config(fluff) {^\s*(?://)} + } else { + # Skip lines beginning with labels ('.L[...]:') or other directives + # ('.align', '.cfi_startproc', '.quad [...]', '.text', etc.), '//' or + # '@' comments ('-fverbose-asm' or ARM-style, for example), or empty + # lines. + set up_config(fluff) {^\s*(?:\.|//|@|$)} + } + + # Regexp for expected output lines prefix. + if { [istarget nvptx*-*-*] } { + # Certain instructions (such as predicable ones) are emitted with + # additional whitespace prefixed. On the other hand, labels don't get + # any whitespace prefixed, and we'd like to be able to match these, + # too. We thereare expect any amount of whitespace here. + set up_config(line_prefix) {\t*} + } else { + set up_config(line_prefix) {\t} + } +} + +# Per CONFIG, read assembly file FILENAME and store a mapping from function +# names to function bodies in array RESULT. FILENAME has already been uploaded +# locally where necessary and is known to exist. + +proc parse_function_bodies { config filename result } { + upvar $config up_config + upvar $result up_result set fd [open $filename r] set in_function 0 while { [gets $fd line] >= 0 } { - if { [regexp $label $line dummy function_name] } { + if { [regexp $up_config(start) $line dummy function_name] } { set in_function 1 set function_body "" } elseif { $in_function } { - if { [regexp $terminator $line] } { + if { [regexp $up_config(end) $line] } { + verbose "parse_function_bodies: $function_name:\n$function_body" set up_result($function_name) $function_body set in_function 0 - } elseif { ![regexp $fluff $line] } { + } elseif { [regexp $up_config(fluff) $line] } { + verbose "parse_function_bodies: $function_name: ignoring fluff line: $line" + } else { append function_body $line "\n" } } @@ -893,13 +933,18 @@ proc check-function-bodies { args } { set terminator "*/" } set terminator_len [string length $terminator] + # Regexp for the start of a function definition in expected output lines + # (name in \1). This may be different from '$config(start)'. + set start_expected {^(\S+):$} + + configure_check-function-bodies config set have_bodies 0 if { [is_remote host] } { remote_upload host "$filename" } if { [file exists $output_filename] } { - parse_function_bodies $output_filename functions + parse_function_bodies config $output_filename functions set have_bodies 1 } else { verbose -log "$testcase: output file does not exist" @@ -907,7 +952,6 @@ proc check-function-bodies { args } { set count 0 set function_regexp "" - set label {^(\S+):$} set lineno 1 set fd [open $input_filename r] @@ -922,7 +966,7 @@ proc check-function-bodies { args } { } else { set selector "P" } - if { ![regexp $label $line dummy function_name] } { + if { ![regexp $start_expected $line dummy function_name] } { close $fd error "check-function-bodies: line $lineno does not have a function label" } @@ -937,7 +981,7 @@ proc check-function-bodies { args } { } elseif { [string equal $line "..."] } { append function_regexp ".*" } else { - append function_regexp "\t" $line "\n" + append function_regexp $config(line_prefix) $line "\n" } } elseif { [string equal -length $terminator_len $line $terminator] } { if { ![string equal $selector "N"] } { -- 2.34.1