diff options
author | Mike Frysinger <vapier@gentoo.org> | 2023-12-19 20:04:34 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2023-12-21 20:16:26 -0500 |
commit | c0e97c852595b9516d54688643c08918a446f36c (patch) | |
tree | 3cca7534f3ba674f35d97439f6543c7647cc6571 | |
parent | 10df3b929c72245bf363c11d6236637b4dc43cbc (diff) | |
download | binutils-c0e97c852595b9516d54688643c08918a446f36c.zip binutils-c0e97c852595b9516d54688643c08918a446f36c.tar.gz binutils-c0e97c852595b9516d54688643c08918a446f36c.tar.bz2 |
sim: common: add $LINENO rewriting support to genmloop scripts
The generated mloop files can trigger compile time warnings. It can
be difficult to see/understand where the original code is coming from
as all the diagnostics point to the generated output. Using #line
pragmas, we can point people to the original source files.
Unfortunately, this code is written in POSIX shell, and that lacks
support for line number tracking. The $LINENO variable, even when
available, can just be plain wrong. For example, when using dash
and subshells, $LINENO can end up having negative values. Add a
wrapper script that will uses awk to rewrite the $LINENO variable
to the right value to avoid all that.
Basically lineno.sh takes an input script, rewrites all uses of
$LINENO into the actual line number (and $0 into the original file
name), and then executes the temporary script.
This commit doesn't actually add #line pragmas to any files. That
comes next.
-rw-r--r-- | sim/Makefile.in | 6 | ||||
-rwxr-xr-x | sim/common/genmloop.sh | 49 | ||||
-rwxr-xr-x | sim/common/lineno.sh | 44 | ||||
-rw-r--r-- | sim/common/local.mk | 6 |
4 files changed, 83 insertions, 22 deletions
diff --git a/sim/Makefile.in b/sim/Makefile.in index 29ab8da..604732c 100644 --- a/sim/Makefile.in +++ b/sim/Makefile.in @@ -1926,8 +1926,10 @@ CGEN_GEN_CPU_DESC = \ $(CGEN_ARCHFILE) ignored $$opcfile CGEN_GEN_MLOOP = \ - $(SHELL) $(srccom)/genmloop.sh \ - -shell $(SHELL) \ + $(SHELL) $(srccom)/lineno.sh \ + $(srccom)/genmloop.sh \ + $@.lineno.sh \ + -shell $(SHELL) -awk $(AWK) -lineno $(srccom)/lineno.sh \ -infile $< -outfile-prefix $(@D)/ diff --git a/sim/common/genmloop.sh b/sim/common/genmloop.sh index e9cb97d..007582e 100755 --- a/sim/common/genmloop.sh +++ b/sim/common/genmloop.sh @@ -142,6 +142,7 @@ infile="" prefix="unknown" outprefix="" outsuffix="" +lineno="" while test $# -gt 0 do @@ -166,6 +167,8 @@ do -cpu) shift ; cpu=$1 ;; -infile) shift ; infile=$1 ;; -shell) shift ; SHELL=$1 ;; + -awk) shift ; AWK=$1 ; export AWK ;; + -lineno) shift ; lineno=$1 ;; *) echo "unknown option: $1" >&2 ; exit 1 ;; esac shift @@ -199,6 +202,16 @@ PREFIX=`echo ${prefix} | tr "${lowercase}" "${uppercase}"` ########################################################################## +load_infile_section() { + if [ -n "${lineno}" ]; then + ${SHELL} ${lineno} \ + "${infile}" "${outprefix}mloop${outsuffix}.tmp" \ + "$@" + else + ${SHELL} ${infile} "$@" + fi +} + rm -f ${outprefix}eng${outsuffix}.hin exec 1>${outprefix}eng${outsuffix}.hin @@ -380,7 +393,7 @@ ATTRIBUTE_UNUSED static INLINE void EOF -${SHELL} $infile support +load_infile_section support ########################################################################## @@ -425,7 +438,7 @@ esac # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init if [ x$parallel = xread ] ; then cat << EOF @@ -466,7 +479,7 @@ cat << EOF /* begin full-exec-simple */ EOF -${SHELL} $infile full-exec-simple +load_infile_section full-exec-simple cat << EOF /* end full-exec-simple */ @@ -527,7 +540,7 @@ static INLINE SCACHE * /* begin extract-scache */ EOF -${SHELL} $infile extract-scache +load_infile_section extract-scache cat << EOF /* end extract-scache */ @@ -557,7 +570,7 @@ EOF # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init cat << EOF @@ -580,7 +593,7 @@ cat << EOF /* begin full-exec-scache */ EOF -${SHELL} $infile full-exec-scache +load_infile_section full-exec-scache cat << EOF /* end full-exec-scache */ @@ -618,7 +631,7 @@ EOF # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init cat << EOF @@ -647,7 +660,7 @@ cat << EOF /* begin fast-exec-scache */ EOF -${SHELL} $infile fast-exec-scache +load_infile_section fast-exec-scache cat << EOF /* end fast-exec-scache */ @@ -695,7 +708,7 @@ static INLINE SCACHE * /* begin extract-scache */ EOF -${SHELL} $infile extract-scache +load_infile_section extract-scache cat << EOF /* end extract-scache */ @@ -726,7 +739,7 @@ EOF # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init if [ x$parallel = xread ] ; then cat << EOF @@ -762,7 +775,7 @@ cat << EOF /* begin full-exec-scache */ EOF -${SHELL} $infile full-exec-scache +load_infile_section full-exec-scache cat << EOF /* end full-exec-scache */ @@ -798,7 +811,7 @@ EOF # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init if [ x$parallel = xread ] ; then cat << EOF @@ -841,7 +854,7 @@ cat << EOF /* begin fast-exec-scache */ EOF -${SHELL} $infile fast-exec-scache +load_infile_section fast-exec-scache cat << EOF /* end fast-exec-scache */ @@ -948,7 +961,7 @@ INLINE SEM_PC /* begin extract-pbb */ EOF -${SHELL} $infile extract-pbb +load_infile_section extract-pbb cat << EOF /* end extract-pbb */ @@ -1181,7 +1194,7 @@ esac # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init cat << EOF @@ -1224,7 +1237,7 @@ cat << EOF /* begin full-exec-pbb */ EOF -${SHELL} $infile full-exec-pbb +load_infile_section full-exec-pbb cat << EOF /* end full-exec-pbb */ @@ -1271,7 +1284,7 @@ esac # Any initialization code before looping starts. # Note that this code may declare some locals. -${SHELL} $infile init +load_infile_section init cat << EOF @@ -1314,7 +1327,7 @@ cat << EOF /* begin fast-exec-pbb */ EOF -${SHELL} $infile fast-exec-pbb +load_infile_section fast-exec-pbb cat << EOF /* end fast-exec-pbb */ diff --git a/sim/common/lineno.sh b/sim/common/lineno.sh new file mode 100755 index 0000000..3332f37 --- /dev/null +++ b/sim/common/lineno.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# Replace $LINENO on the fly. +# Copyright (C) 2023 Free Software Foundation, Inc. +# +# This file is part of the GNU simulators. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Since $LINENO is not reliable in shells/subshells, generate it on the fly. + +if [ $# -lt 2 ]; then + cat <<EOF >&2 +Usage: $0 <script> <tempfile> [script args] + +Rewrite the $LINENO usage in <script> with the line number. The temp script is +written to <tempfile>, and then removed when done. +EOF + exit 1 +fi + +input=$1 +shift +output=$1 +shift + +${AWK:-awk} '{ + gsub("[$]LINENO", NR + 1) + gsub("\"[$]0\"", "\"" FILENAME "\"") + print +}' "${input}" >"${output}" +${SHELL} "${output}" "$@" + +rm -f "${output}" diff --git a/sim/common/local.mk b/sim/common/local.mk index 8124910..6414ad1 100644 --- a/sim/common/local.mk +++ b/sim/common/local.mk @@ -234,6 +234,8 @@ CGEN_GEN_CPU_DESC = \ $(CGEN_ARCHFILE) ignored $$opcfile CGEN_GEN_MLOOP = \ - $(SHELL) $(srccom)/genmloop.sh \ - -shell $(SHELL) \ + $(SHELL) $(srccom)/lineno.sh \ + $(srccom)/genmloop.sh \ + $@.lineno.sh \ + -shell $(SHELL) -awk $(AWK) -lineno $(srccom)/lineno.sh \ -infile $< -outfile-prefix $(@D)/ |