X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fcgen.sh;h=ed729ed052254d534d5ce89432a52578dfdc800a;hb=50d036364fb2a71b3ac9a0b0cdbe58296832a1b2;hp=f6171f47aa7c30bd92a1ed13353fcf871277b073;hpb=3bdf92bdc82d41bcef037e85258d098d96eab4e9;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/cgen.sh b/opcodes/cgen.sh index f6171f47aa..ed729ed052 100644 --- a/opcodes/cgen.sh +++ b/opcodes/cgen.sh @@ -1,43 +1,185 @@ #! /bin/sh -# Generate CGEN opcode files: arch-opc.[ch], arch-asm.c, arch-asm.c. +# CGEN generic assembler support code. +# +# Copyright (C) 2000-2020 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 with gdb/binutils. Maybe we never will. +# 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 -srcdir=$1 -cgendir=$2 -cgenflags=$3 -scheme=$4 -schemeflags=$5 +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 + ;; + +*) + echo "$0: bad action: ${action}" >&2 + exit 1 + ;; + +esac -rm -f tmp-opc.h tmp-opc.c tmp-asm.c tmp-dis.c -rm -f tmp-opc.h1 tmp-opc.c1 tmp-asm.c1 tmp-dis.c1 -rm -f tmp-asm.in tmp-asm.in1 tmp-dis.in tmp-dis.in1 - -$scheme $schemeflags $cgendir/cgen-opc.scm \ - -s $cgendir \ - $cgenflags \ - -m all \ - -a $arch \ - -h tmp-opc.h1 \ - -t tmp-opc.c1 \ - -A tmp-asm.in1 \ - -D tmp-dis.in1 - -sed -e "s/@arch@/${arch}/g" < tmp-opc.h1 > tmp-opc.h -${srcdir}/../move-if-change tmp-opc.h ${srcdir}/${arch}-opc.h -sed -e "s/@arch@/${arch}/g" < tmp-opc.c1 > tmp-opc.c -${srcdir}/../move-if-change tmp-opc.c ${srcdir}/${arch}-opc.c -sed -e "/ -- assembler routines/ r tmp-asm.in1" ${srcdir}/cgen-asm.in \ - | sed -e "s/@arch@/${arch}/g" > tmp-asm.c -${srcdir}/../move-if-change tmp-asm.c ${srcdir}/${arch}-asm.c -sed -e "/ -- disassembler routines/ r tmp-dis.in1" ${srcdir}/cgen-dis.in \ - | sed -e "s/@arch@/${arch}/g" > tmp-dis.c -${srcdir}/../move-if-change tmp-dis.c ${srcdir}/${arch}-dis.c - -rm -f tmp-opc.h1 tmp-opc.c1 tmp-asm.c1 tmp-dis.c1 -rm -f tmp-asm.in tmp-asm.in1 tmp-dis.in tmp-dis.in1 +exit 0