| #! /bin/sh |
| # CGEN generic assembler support code. |
| # |
| # Copyright 2000, 2003, 2005, 2007, 2009 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 |
| |
| 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 "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" < ${tmp}-desc.h1 > ${tmp}-desc.h |
| ${rootdir}/move-if-change ${tmp}-desc.h ${srcdir}/${prefix}-desc.h |
| |
| sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \ |
| -e "s/@prefix@/${prefix}/" < ${tmp}-desc.c1 > ${tmp}-desc.c |
| ${rootdir}/move-if-change ${tmp}-desc.c ${srcdir}/${prefix}-desc.c |
| |
| sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" < ${tmp}-opc.h1 > ${tmp}-opc.h |
| ${rootdir}/move-if-change ${tmp}-opc.h ${srcdir}/${prefix}-opc.h |
| |
| sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \ |
| -e "s/@prefix@/${prefix}/" < ${tmp}-opc.c1 > ${tmp}-opc.c |
| ${rootdir}/move-if-change ${tmp}-opc.c ${srcdir}/${prefix}-opc.c |
| |
| case $extrafiles in |
| *opinst*) |
| sed -e "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \ |
| -e "s/@prefix@/${prefix}/" < ${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 "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \ |
| -e "s/@prefix@/${prefix}/" > ${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 "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \ |
| -e "s/@prefix@/${prefix}/" > ${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 "s/@ARCH@/${ARCH}/g" -e "s/@arch@/${arch}/g" \ |
| -e "s/@prefix@/${prefix}/" > ${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 |
| ;; |
| |
| *) |
| echo "$0: bad action: ${action}" >&2 |
| exit 1 |
| ;; |
| |
| esac |
| |
| exit 0 |