123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #! /bin/sh
- # CGEN generic assembler support code.
- #
- # Copyright (C) 2000-2022 Free Software Foundation, Inc.
- #
- # This file is part of the GNU opcodes library.
- #
- # This library 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, or (at your option)
- # any later version.
- #
- # It 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, write to the Free Software Foundation, Inc.,
- # 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
- #
- # Generate CGEN opcode files: arch-desc.[ch], arch-opc.[ch],
- # arch-asm.c, arch-dis.c, arch-opinst.c, arch-ibld.[ch].
- #
- # Usage:
- # cgen.sh action srcdir cgen cgendir cgenflags arch prefix \
- # arch-file opc-file options [extrafiles]
- #
- # ACTION is currently always "opcodes". It exists to be consistent with the
- # simulator.
- # ARCH is the name of the architecture.
- # It is substituted into @arch@ and @ARCH@ in the generated files.
- # PREFIX is both the generated file prefix and is substituted into
- # @prefix@ in the generated files.
- # ARCH-FILE is the name of the .cpu file (including path).
- # OPC-FILE is the name of the .opc file (including path).
- # OPTIONS is comma separated list of options (???).
- # EXTRAFILES is a space separated list (1 arg still) of extra files to build:
- # - opinst - arch-opinst.c is being made, causes semantic analysis
- #
- # 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
- prefix=$7
- archfile=$8
- opcfile=$9
- shift ; options=$9
- # List of extra files to build.
- # Values: opinst (only 1 extra file at present)
- shift ; extrafiles=$9
- rootdir=${srcdir}/..
- # $arch is $6, as passed on the command line.
- # $ARCH is the same argument but in all uppercase.
- # Both forms are used in this script.
- lowercase='abcdefghijklmnopqrstuvwxyz'
- uppercase='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- ARCH=`echo ${arch} | tr "${lowercase}" "${uppercase}"`
- # Allow parallel makes to run multiple cgen's without colliding.
- tmp=tmp-$$
- extrafile_args=""
- for ef in .. $extrafiles
- do
- case $ef in
- ..) ;;
- opinst) extrafile_args="-Q ${tmp}-opinst.c1 $extrafile_args" ;;
- esac
- done
- header="/* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */"
- case $action in
- opcodes)
- # Remove residual working files.
- rm -f ${tmp}-desc.h ${tmp}-desc.h1
- rm -f ${tmp}-desc.c ${tmp}-desc.c1
- rm -f ${tmp}-opc.h ${tmp}-opc.h1
- rm -f ${tmp}-opc.c ${tmp}-opc.c1
- rm -f ${tmp}-opinst.c ${tmp}-opinst.c1
- rm -f ${tmp}-ibld.h ${tmp}-ibld.h1
- rm -f ${tmp}-ibld.c ${tmp}-ibld.in1
- rm -f ${tmp}-asm.c ${tmp}-asm.in1
- rm -f ${tmp}-dis.c ${tmp}-dis.in1
- # Run CGEN.
- ${cgen} ${cgendir}/cgen-opc.scm \
- -s ${cgendir} \
- ${cgenflags} \
- -f "${options}" \
- -m all \
- -a ${archfile} \
- -OPC ${opcfile} \
- -H ${tmp}-desc.h1 \
- -C ${tmp}-desc.c1 \
- -O ${tmp}-opc.h1 \
- -P ${tmp}-opc.c1 \
- -L ${tmp}-ibld.in1 \
- -A ${tmp}-asm.in1 \
- -D ${tmp}-dis.in1 \
- ${extrafile_args}
- # Customise generated files for the particular architecture.
- sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e 's/[ ][ ]*$//' < ${tmp}-desc.h1 > ${tmp}-desc.h
- ${rootdir}/move-if-change ${tmp}-desc.h ${srcdir}/${prefix}-desc.h
- sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/" -e 's/[ ][ ]*$//' \
- < ${tmp}-desc.c1 > ${tmp}-desc.c
- ${rootdir}/move-if-change ${tmp}-desc.c ${srcdir}/${prefix}-desc.c
- sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e 's/[ ][ ]*$//' < ${tmp}-opc.h1 > ${tmp}-opc.h
- ${rootdir}/move-if-change ${tmp}-opc.h ${srcdir}/${prefix}-opc.h
- sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/" -e 's/[ ][ ]*$//' \
- < ${tmp}-opc.c1 > ${tmp}-opc.c
- ${rootdir}/move-if-change ${tmp}-opc.c ${srcdir}/${prefix}-opc.c
- case $extrafiles in
- *opinst*)
- sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/" -e 's/[ ][ ]*$//' \
- < ${tmp}-opinst.c1 >${tmp}-opinst.c
- ${rootdir}/move-if-change ${tmp}-opinst.c ${srcdir}/${prefix}-opinst.c
- ;;
- esac
- cat ${srcdir}/cgen-ibld.in ${tmp}-ibld.in1 | \
- sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/" -e 's/[ ][ ]*$//' > ${tmp}-ibld.c
- ${rootdir}/move-if-change ${tmp}-ibld.c ${srcdir}/${prefix}-ibld.c
- sed -e "/ -- assembler routines/ r ${tmp}-asm.in1" ${srcdir}/cgen-asm.in \
- | sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/" -e 's/[ ][ ]*$//' \
- > ${tmp}-asm.c
- ${rootdir}/move-if-change ${tmp}-asm.c ${srcdir}/${prefix}-asm.c
- sed -e "/ -- disassembler routines/ r ${tmp}-dis.in1" ${srcdir}/cgen-dis.in \
- | sed -e "1i$header" \
- -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/" -e 's/[ ][ ]*$//' \
- > ${tmp}-dis.c
- ${rootdir}/move-if-change ${tmp}-dis.c ${srcdir}/${prefix}-dis.c
- # Remove temporary files.
- rm -f ${tmp}-desc.h1 ${tmp}-desc.c1
- rm -f ${tmp}-opc.h1 ${tmp}-opc.c1
- rm -f ${tmp}-opinst.c1
- rm -f ${tmp}-ibld.h1 ${tmp}-ibld.in1
- rm -f ${tmp}-asm.in1 ${tmp}-dis.in1
- ;;
- desc)
- # For ports that only generate the desc module & opc header.
- 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 all \
- -a ${archfile} \
- -i all \
- -H ${tmp}-desc.h1 \
- -C ${tmp}-desc.c1 \
- -O ${tmp}-opc.h1
- sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/g" \
- < ${tmp}-desc.h1 > ${tmp}-desc.h
- ${rootdir}/move-if-change ${tmp}-desc.h ${srcdir}/${arch}-desc.h
- sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/g" \
- < ${tmp}-desc.c1 > ${tmp}-desc.c
- ${rootdir}/move-if-change ${tmp}-desc.c ${srcdir}/${arch}-desc.c
- sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \
- -e "s/@prefix@/${prefix}/g" \
- < ${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 "$0: bad action: ${action}" >&2
- exit 1
- ;;
- esac
- exit 0
|