Hi!

On 2024-12-06T10:01:22+0100, I wrote:
> I recently learned that the exit status of the command invoked in a
> 'Makefile' via '$(shell [...])' effectively gets discarded (unless
> explicitly checking the GNU Make 4.2+ '.SHELLSTATUS' variable or jumping
> through other hoops).  I was under the assumption that an error in a
> 'shell' function would cause 'make' to error out, similarly to how it
> does in 'Makefile' rules...
>
> I learned this The Hard Way here:
>
> On 2022-06-15T23:18:10+0200, I wrote:
>> --- a/gcc/config/nvptx/t-nvptx
>> +++ b/gcc/config/nvptx/t-nvptx
>
>> +multilib_matches := $(shell $(srcdir)/config/nvptx/gen-multilib-matches.sh 
>> $(srcdir)/config/nvptx $(multilib_options_isa_default) 
>> "$(multilib_options_isa_list)")
>
> When recently working on changing nvptx multilib things, and for that
> enhancing nvptx' 'gen-multilib-matches.sh', I made an error in there, and
> then got confusing behavior in that I could still successfully 'make'
> GCC, and my changes "mostly appeared to work as expected", but not quite.
> This was due to garbage in 'MULTILIB_MATCHES', caused by a shell syntax
> error in 'gen-multilib-matches.sh' -- which '$(shell [...])' swept under
> the table.
>
> Pushed to trunk branch commit 490443357668a87e3c322f218873a7649a2552df
> "'gcc/config/nvptx/t-nvptx': Don't use the 'shell' function of 'make'",
> see attached.

To further improve reliability of nvptx 'gen-multilib-matches.sh', in
<https://inbox.sourceware.org/875xornmp9....@euler.schwinge.ddns.net>
"Re: [PATCH] v2: Run selftests for C++ as well as C", I recently
mentioned the idea of adding selftesting to this script and attaching a
new 's-selftest-nvptx_gen-multilib-matches' rule to the existing GCC
selftest framework rules.  Instead, in a simpler way, let's just invoke
the 'gen-multilib-matches.sh --selftest' before actual use here:

> --- a/gcc/config/nvptx/t-nvptx
> +++ b/gcc/config/nvptx/t-nvptx
> @@ -43,12 +43,24 @@ MULTILIB_OPTIONS += mgomp
>  multilib_options_isa_list := $(TM_MULTILIB_CONFIG)
>  multilib_options_isa_default := $(word 1,$(multilib_options_isa_list))
>  multilib_options_misa_list := $(addprefix misa=,$(multilib_options_isa_list))
> +
> +t-nvptx-gen-multilib-matches: $(srcdir)/config/nvptx/gen-multilib-matches.sh 
> \
> +  $(srcdir)/config/nvptx/t-nvptx \
> +  Makefile \
> +  $(srcdir)/config/nvptx/nvptx-sm.def
> +     $(SHELL) $< \
> +       $(dir $<) \
> +       $(multilib_options_isa_default) \
> +       '$(multilib_options_isa_list)' \
> +       > $@
> +
> +include t-nvptx-gen-multilib-matches

Pushed to trunk branch commit ccd6ec23177f7a4ed69fabad8e79d5d4da419fb2
"'gcc/config/nvptx/gen-multilib-matches.sh': Support '--selftest'", see
attached.


Grüße
 Thomas


>From ccd6ec23177f7a4ed69fabad8e79d5d4da419fb2 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <tschwi...@baylibre.com>
Date: Mon, 2 Dec 2024 16:50:16 +0100
Subject: [PATCH] 'gcc/config/nvptx/gen-multilib-matches.sh': Support
 '--selftest'

..., and invoke that before actual use.

	gcc/
	* config/nvptx/gen-multilib-matches.sh: Support '--selftest'.
	* config/nvptx/t-nvptx (t-nvptx-gen-multilib-matches:): Invoke it.
	* config/nvptx/gen-multilib-matches-tests: New.
---
 gcc/config/nvptx/gen-multilib-matches-tests | 77 +++++++++++++++++++
 gcc/config/nvptx/gen-multilib-matches.sh    | 82 ++++++++++++++++++++-
 gcc/config/nvptx/t-nvptx                    |  2 +
 3 files changed, 159 insertions(+), 2 deletions(-)
 create mode 100644 gcc/config/nvptx/gen-multilib-matches-tests

diff --git a/gcc/config/nvptx/gen-multilib-matches-tests b/gcc/config/nvptx/gen-multilib-matches-tests
new file mode 100644
index 000000000000..c2775f268354
--- /dev/null
+++ b/gcc/config/nvptx/gen-multilib-matches-tests
@@ -0,0 +1,77 @@
+# Test cases for 'gen-multilib-matches.sh'.
+
+# Blank lines and lines beginning with '#' are ignored.
+
+# 'BEGIN [name]': clear state, begin test [name].
+# 'SSMS 30 35 53': set 'sms' to '30 35 53'.  Default: per 'nvptx-sm.def'.
+# 'SMOID sm_30': set 'multilib_options_isa_default' to 'sm_30'.  Default: unset.
+# 'SMOIL sm_35 sm_30': set 'multilib_options_isa_list' to 'sm_35 sm_30'.  Default: unset.
+# 'AEMM .=misa?sm_30': append '.=misa?sm_30' to expected "multilib matches".  Default: unset.
+# 'CMMC': compute "multilib matches" per the current settings, and compare to the expected.
+
+
+BEGIN '--with-arch=sm_30'
+SMOID sm_30
+SMOIL sm_30
+AEMM .=misa?sm_30
+AEMM .=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+
+BEGIN '--with-arch=sm_35'
+SMOID sm_35
+SMOIL sm_35 sm_30
+AEMM .=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+
+BEGIN '--with-arch=sm_53'
+SMOID sm_53
+SMOIL sm_53 sm_30
+AEMM misa?sm_30=misa?sm_35
+AEMM .=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+
+BEGIN '--with-arch=sm_70'
+SMOID sm_70
+SMOIL sm_70 sm_30
+AEMM misa?sm_30=misa?sm_35
+AEMM misa?sm_30=misa?sm_53
+AEMM .=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+
+BEGIN '--with-arch=sm_75'
+SMOID sm_75
+SMOIL sm_75 sm_30
+AEMM misa?sm_30=misa?sm_35
+AEMM misa?sm_30=misa?sm_53
+AEMM misa?sm_30=misa?sm_70
+AEMM .=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
+
+
+BEGIN '--with-arch=sm_80'
+SMOID sm_80
+SMOIL sm_80 sm_30
+AEMM misa?sm_30=misa?sm_35
+AEMM misa?sm_30=misa?sm_53
+AEMM misa?sm_30=misa?sm_70
+AEMM misa?sm_30=misa?sm_75
+AEMM .=misa?sm_80
+CMMC
diff --git a/gcc/config/nvptx/gen-multilib-matches.sh b/gcc/config/nvptx/gen-multilib-matches.sh
index 09761a9e6907..f6f2ed079f68 100755
--- a/gcc/config/nvptx/gen-multilib-matches.sh
+++ b/gcc/config/nvptx/gen-multilib-matches.sh
@@ -27,6 +27,7 @@ nvptx_dir=$(dirname "$0")
 
 
 nvptx_sm_def="$nvptx_dir/nvptx-sm.def"
+gen_multilib_matches_tests="$nvptx_dir/gen-multilib-matches-tests"
 
 sms=$(grep ^NVPTX_SM $nvptx_sm_def | sed 's/.*(//;s/,.*//')
 
@@ -88,5 +89,82 @@ print_multilib_matches() {
     echo "$multilib_matches"
 }
 
-multilib_matches=$(print_multilib_matches "$sms" "$@")
-echo "multilib_matches := $multilib_matches"
+
+selftest() {
+    [ $# = 0 ]
+
+    local sms_default
+    sms_default=$sms
+
+    local name
+    unset name
+    local sms
+    unset sms
+    local multilib_options_isa_default
+    unset multilib_options_isa_default
+    local multilib_options_isa_list
+    unset multilib_options_isa_list
+    local multilib_matches_expected
+    unset multilib_matches_expected
+
+    local line
+    line=0
+    local f1 f2
+    unset f1 f2
+    while read -r f1 f2; do
+	line=$((line + 1))
+	case "$f1 $f2" in
+	    ' ' | '#'* )
+		:
+		;;
+	    'BEGIN '* )
+		name=$f2
+		sms=$sms_default
+		unset multilib_options_isa_default
+		unset multilib_options_isa_list
+		unset multilib_matches_expected
+		;;
+	    'SSMS '* )
+		sms=$f2
+		;;
+	    'SMOID '* )
+		multilib_options_isa_default=$f2
+		;;
+	    'SMOIL '* )
+		multilib_options_isa_list=$f2
+		;;
+	    'AEMM '* )
+		multilib_matches_expected="$multilib_matches_expected $f2"
+		;;
+	    'CMMC ' )
+		local multilib_matches
+		multilib_matches=$(print_multilib_matches "${sms?}" "${multilib_options_isa_default?}" "${multilib_options_isa_list?}")
+		if [ "$multilib_matches" = "$multilib_matches_expected" ]; then
+		    echo >&2 "$0": selftest PASS "${name?}" at "$gen_multilib_matches_tests:$line"
+		else
+		    echo >&2 "$0": selftest FAIL "${name?}" at "$gen_multilib_matches_tests:$line"
+		    echo >&2 expected:"$multilib_matches_expected"
+		    echo >&2 actual:"$multilib_matches"
+		    exit 1
+		fi
+		;;
+	    * )
+		echo >&2 "$0": selftest ERROR at "$gen_multilib_matches_tests:$line"
+		echo >&2 invalid directive: "$f1 $f2"
+		exit 1
+		;;
+	esac
+    done < "$gen_multilib_matches_tests"
+}
+
+
+case "${1?}" in
+    --selftest )
+	shift
+	selftest "$@"
+	:;;
+    * )
+	multilib_matches=$(print_multilib_matches "$sms" "$@")
+	echo "multilib_matches := $multilib_matches"
+	;;
+esac
diff --git a/gcc/config/nvptx/t-nvptx b/gcc/config/nvptx/t-nvptx
index 00a7b15496e0..563c7b30dab2 100644
--- a/gcc/config/nvptx/t-nvptx
+++ b/gcc/config/nvptx/t-nvptx
@@ -48,6 +48,8 @@ t-nvptx-gen-multilib-matches: $(srcdir)/config/nvptx/gen-multilib-matches.sh \
   $(srcdir)/config/nvptx/t-nvptx \
   Makefile \
   $(srcdir)/config/nvptx/nvptx-sm.def
+	$(SHELL) $< \
+	  --selftest
 	$(SHELL) $< \
 	  $(multilib_options_isa_default) \
 	  '$(multilib_options_isa_list)' \
-- 
2.34.1

Reply via email to