old-cross-binutils/sim/common/cgen.sh
Mike Frysinger 248d23e82b sim: gennltvals.sh: handle split out newlib source tree
Since newlib no longer shares the same repo as binutils/gdb, we have to go
searching further afield to locate the sources.  We still look at the top
level for newlib, but if that is not found, we also try up one dir outside
of this source tree.  It sucks, but better than the status quo (no workie).
2015-04-21 03:10:16 -04:00

235 lines
5.9 KiB
Bash
Executable file

#! /bin/sh
# Generate CGEN simulator files.
#
# Usage: /bin/sh cgen.sh {"arch"|"cpu"|"decode"|"defs"|"cpu-decode"} \
# srcdir cgen cgendir cgenflags \
# arch archflags cpu mach suffix archfile extrafiles opcfile
#
# We store the generated files in the source directory until we decide to
# ship a Scheme interpreter (or other implementation) with gdb/binutils.
# Maybe we never will.
# We want to behave like make, any error forces us to stop.
set -e
action=$1
srcdir=$2
cgen="$3"
cgendir=$4
cgenflags=$5
arch=$6
archflags=$7
cpu=$8
isa=$9
# portably bring parameters beyond $9 into view
shift ; mach=$9
shift ; suffix=$9
shift ; archfile=$9
shift ; extrafiles=$9
shift ; opcfile=$9
rootdir=${srcdir}/../..
test -z "${opcfile}" && opcfile=/dev/null
if test -z "$isa" ; then
isa=all
prefix=$cpu
else
prefix=${cpu}_$isa
fi
lowercase='abcdefghijklmnopqrstuvwxyz'
uppercase='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ARCH=`echo ${arch} | tr "${lowercase}" "${uppercase}"`
CPU=`echo ${cpu} | tr "${lowercase}" "${uppercase}"`
PREFIX=`echo ${prefix} | tr "${lowercase}" "${uppercase}"`
sedscript="\
-e s/@ARCH@/${ARCH}/g -e s/@arch@/${arch}/g \
-e s/@CPU@/${CPU}/g -e s/@cpu@/${cpu}/g \
-e s/@PREFIX@/${PREFIX}/g -e s/@prefix@/${prefix}/g"
# avoid collisions in parallel makes
tmp=tmp-$$
case $action in
arch)
rm -f ${tmp}-arch.h1 ${tmp}-arch.h
rm -f ${tmp}-arch.c1 ${tmp}-arch.c
rm -f ${tmp}-all.h1 ${tmp}-all.h
${cgen} ${cgendir}/cgen-sim.scm \
-s ${cgendir} \
${cgenflags} \
-f "${archflags}" \
-m ${mach} \
-a ${archfile} \
-i ${isa} \
-A ${tmp}-arch.h1 \
-B ${tmp}-arch.c1 \
-N ${tmp}-all.h1
sed $sedscript < ${tmp}-arch.h1 > ${tmp}-arch.h
${rootdir}/move-if-change ${tmp}-arch.h ${srcdir}/arch.h
sed $sedscript < ${tmp}-arch.c1 > ${tmp}-arch.c
${rootdir}/move-if-change ${tmp}-arch.c ${srcdir}/arch.c
sed $sedscript < ${tmp}-all.h1 > ${tmp}-all.h
${rootdir}/move-if-change ${tmp}-all.h ${srcdir}/cpuall.h
rm -f ${tmp}-arch.h1 ${tmp}-arch.c1 ${tmp}-all.h1
;;
cpu | decode | cpu-decode)
fileopts=""
case $action in
*cpu*)
rm -f ${tmp}-cpu.h1 ${tmp}-cpu.c1
rm -f ${tmp}-ext.c1 ${tmp}-read.c1 ${tmp}-write.c1
rm -f ${tmp}-sem.c1 ${tmp}-semsw.c1
rm -f ${tmp}-mod.c1
rm -f ${tmp}-cpu.h ${tmp}-cpu.c
rm -f ${tmp}-ext.c ${tmp}-read.c ${tmp}-write.c
rm -f ${tmp}-sem.c ${tmp}-semsw.c ${tmp}-mod.c
fileopts="$fileopts \
-C ${tmp}-cpu.h1 \
-U ${tmp}-cpu.c1 \
-M ${tmp}-mod.c1"
;;
esac
case $action in
*decode*)
rm -f ${tmp}-dec.h1 ${tmp}-dec.h ${tmp}-dec.c1 ${tmp}-dec.c
fileopts="$fileopts \
-T ${tmp}-dec.h1 \
-D ${tmp}-dec.c1"
;;
esac
case "$extrafiles" in
*/extr/*) fileopts="${fileopts} -E ${tmp}-ext.c1" ;;
esac
case "$extrafiles" in
*/read/*) fileopts="${fileopts} -R ${tmp}-read.c1" ;;
esac
case "$extrafiles" in
*/write/*) fileopts="${fileopts} -W ${tmp}-write.c1" ;;
esac
case "$extrafiles" in
*/sem/*) fileopts="${fileopts} -S ${tmp}-sem.c1" ;;
esac
case "$extrafiles" in
*/semsw/*) fileopts="${fileopts} -X ${tmp}-semsw.c1" ;;
esac
${cgen} ${cgendir}/cgen-sim.scm \
-s ${cgendir} \
${cgenflags} \
-f "${archflags}" \
-m ${mach} \
-a ${archfile} \
-i ${isa} \
${fileopts}
case $action in
*cpu*)
sed $sedscript < ${tmp}-cpu.h1 > ${tmp}-cpu.h
${rootdir}/move-if-change ${tmp}-cpu.h ${srcdir}/cpu${suffix}.h
sed $sedscript < ${tmp}-cpu.c1 > ${tmp}-cpu.c
${rootdir}/move-if-change ${tmp}-cpu.c ${srcdir}/cpu${suffix}.c
sed $sedscript < ${tmp}-mod.c1 > ${tmp}-mod.c
${rootdir}/move-if-change ${tmp}-mod.c ${srcdir}/model${suffix}.c
rm -f ${tmp}-cpu.h1 ${tmp}-cpu.c1 ${tmp}-mod.c1
;;
esac
case $action in
*decode*)
sed $sedscript < ${tmp}-dec.h1 > ${tmp}-dec.h
${rootdir}/move-if-change ${tmp}-dec.h ${srcdir}/decode${suffix}.h
sed $sedscript < ${tmp}-dec.c1 > ${tmp}-dec.c
${rootdir}/move-if-change ${tmp}-dec.c ${srcdir}/decode${suffix}.c
rm -f ${tmp}-dec.h1 ${tmp}-dec.c1
;;
esac
if test -f ${tmp}-ext.c1 ; then \
sed $sedscript < ${tmp}-ext.c1 > ${tmp}-ext.c ; \
${rootdir}/move-if-change ${tmp}-ext.c ${srcdir}/extract${suffix}.c ; \
rm -f ${tmp}-ext.c1
fi
if test -f ${tmp}-read.c1 ; then \
sed $sedscript < ${tmp}-read.c1 > ${tmp}-read.c ; \
${rootdir}/move-if-change ${tmp}-read.c ${srcdir}/read${suffix}.c ; \
rm -f ${tmp}-read.c1
fi
if test -f ${tmp}-write.c1 ; then \
sed $sedscript < ${tmp}-write.c1 > ${tmp}-write.c ; \
${rootdir}/move-if-change ${tmp}-write.c ${srcdir}/write${suffix}.c ; \
rm -f ${tmp}-write.c1
fi
if test -f ${tmp}-sem.c1 ; then \
sed $sedscript < ${tmp}-sem.c1 > ${tmp}-sem.c ; \
${rootdir}/move-if-change ${tmp}-sem.c ${srcdir}/sem${suffix}.c ; \
rm -f ${tmp}-sem.c1
fi
if test -f ${tmp}-semsw.c1 ; then \
sed $sedscript < ${tmp}-semsw.c1 > ${tmp}-semsw.c ; \
${rootdir}/move-if-change ${tmp}-semsw.c ${srcdir}/sem${suffix}-switch.c ; \
rm -f ${tmp}-semsw.c1
fi
;;
defs)
rm -f ${tmp}-defs.h1 ${tmp}-defs.h
${cgen} ${cgendir}/cgen-sim.scm \
-s ${cgendir} \
${cgenflags} \
-f "${archflags}" \
-m ${mach} \
-a ${archfile} \
-i ${isa} \
-G ${tmp}-defs.h1
sed $sedscript < ${tmp}-defs.h1 > ${tmp}-defs.h
${rootdir}/move-if-change ${tmp}-defs.h ${srcdir}/defs${suffix}.h
rm -f ${tmp}-defs.h1
;;
desc)
rm -f ${tmp}-desc.h1 ${tmp}-desc.h
rm -f ${tmp}-desc.c1 ${tmp}-desc.c
rm -f ${tmp}-opc.h1 ${tmp}-opc.h
${cgen} ${cgendir}/cgen-opc.scm \
-s ${cgendir} \
${cgenflags} \
-OPC ${opcfile} \
-f "${archflags}" \
-m ${mach} \
-a ${archfile} \
-i ${isa} \
-H ${tmp}-desc.h1 \
-C ${tmp}-desc.c1 \
-O ${tmp}-opc.h1
sed $sedscript < ${tmp}-desc.h1 > ${tmp}-desc.h
${rootdir}/move-if-change ${tmp}-desc.h ${srcdir}/${arch}-desc.h
sed $sedscript < ${tmp}-desc.c1 > ${tmp}-desc.c
${rootdir}/move-if-change ${tmp}-desc.c ${srcdir}/${arch}-desc.c
sed $sedscript < ${tmp}-opc.h1 > ${tmp}-opc.h
${rootdir}/move-if-change ${tmp}-opc.h ${srcdir}/${arch}-opc.h
rm -f ${tmp}-desc.h1 ${tmp}-desc.c1 ${tmp}-opc.h1
;;
*)
echo "`basename $0`: unknown action: ${action}" >&2
exit 1
;;
esac
exit 0