From c0e97c852595b9516d54688643c08918a446f36c Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Tue, 19 Dec 2023 20:04:34 -0500 Subject: [PATCH] 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. --- sim/Makefile.in | 6 ++++-- sim/common/genmloop.sh | 49 ++++++++++++++++++++++++++---------------- sim/common/lineno.sh | 44 +++++++++++++++++++++++++++++++++++++ sim/common/local.mk | 6 ++++-- 4 files changed, 83 insertions(+), 22 deletions(-) create mode 100755 sim/common/lineno.sh diff --git a/sim/Makefile.in b/sim/Makefile.in index 29ab8da14dc..604732c698c 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 e9cb97d07a5..007582ec8fc 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 00000000000..3332f375287 --- /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 . + +# Since $LINENO is not reliable in shells/subshells, generate it on the fly. + +if [ $# -lt 2 ]; then + cat <&2 +Usage: $0