Use autoconf correctly; provide more stats with -I
This commit is contained in:
parent
183e1f0d7c
commit
c494cadde6
19 changed files with 1590 additions and 326 deletions
|
@ -1,10 +1,43 @@
|
|||
Thu Nov 2 08:54:04 1995 Michael Meissner <meissner@tiktok.cygnus.com>
|
||||
|
||||
* configure.in: Rewrite --enable-sim switch handling to use the
|
||||
autoconf builtins so it works correctly if the configure or
|
||||
Makefile.in files are modified and make decides to rebuild
|
||||
Makefile. Also document all of the --enable-sim switches
|
||||
supported. Check whether getrusage and sys/resource.h are
|
||||
supported.
|
||||
* config.in: Regenerate.
|
||||
* configure: Regenerate.
|
||||
* Makefile.in: Add support for all of the variables set with
|
||||
--enable-sim switches.
|
||||
|
||||
* Makefile.in (clean): make clean now removes all built sources as
|
||||
well.
|
||||
|
||||
* cpu.c: Use HAVE_STRING_H, HAVE_STRINGS_H, HAVE_UNISTD_H,
|
||||
HAVE_TIME_H, HAVE_SYS_TIMES_H, HAVE_SYS_RESOURCE_H defined in
|
||||
the generated config.h.
|
||||
* debug.c: Ditto.
|
||||
* device_tree.c: Ditto.
|
||||
* devices.c: Ditto.
|
||||
* dgen.c: Ditto.
|
||||
* emul_netbsd.c: Ditto.
|
||||
* igen.c: Ditto.
|
||||
* lf.c: Ditto.
|
||||
* misc.c: Ditto.
|
||||
* psim.c: Ditto.
|
||||
* registers.c: Ditto.
|
||||
* sim_calls.c: Ditt.
|
||||
* table.c: Ditto.
|
||||
|
||||
|
||||
* main.c (main): Call psim_print_info with verbose == 2.
|
||||
|
||||
* mon.c (mon_print_info): Align the cpu number and number of
|
||||
instructions fields. Do not print an instruction category if the
|
||||
CPU did not execute any of those instructions.
|
||||
CPU did not execute any of those instructions. Print out number
|
||||
of reads and writes. If getrusage is supported, print out number
|
||||
of simulated instructins per second.
|
||||
|
||||
* configure.in: Add support for --enable-sim-opcode=stupid.
|
||||
* configure: Regenerate.
|
||||
|
|
|
@ -66,6 +66,40 @@ BISON = bison
|
|||
MAKEINFO = makeinfo
|
||||
RANLIB = @RANLIB@
|
||||
|
||||
SIM_CFLAGS = @sim_cflags@
|
||||
INLINE_CFLAGS = @sim_inline@
|
||||
BSWAP_CFLAGS = @sim_bswap@
|
||||
ENDIAN_CFLAGS = @sim_endian@
|
||||
HOSTENDIAN_CFLAGS = @sim_hostendian@
|
||||
SMP_CFLAGS = @sim_smp@
|
||||
BITSIZE_CFLAGS = @sim_bitsize@
|
||||
HOSTBITSIZE_CFLAGS = @sim_hostbitsize@
|
||||
ENV_CFLAGS = @sim_env@
|
||||
TIMEBASE_CFLAGS = @sim_timebase@
|
||||
ALIGNMENT_CFLAGS = @sim_alignment@
|
||||
FLOAT_CFLAGS = @sim_float@
|
||||
TRACE_CFLAGS = @sim_trace@
|
||||
ASSERT_CFLAGS = @sim_assert@
|
||||
MONITOR_CFLAGS = @sim_monitor@
|
||||
CONFIG_CFLAGS = $(BSWAP_CFLAGS) \
|
||||
$(ENDIAN_CFLAGS) \
|
||||
$(HOSTENDIAN_CFLAGS) \
|
||||
$(SMP_CFLAGS) \
|
||||
$(BITSIZE_CFLAGS) \
|
||||
$(HOSTBITSIZE_CFLAGS) \
|
||||
$(ENV_CFLAGS) \
|
||||
$(FLOAT_CFLAGS) \
|
||||
$(TRACE_CFLAGS) \
|
||||
$(ASSERT_CFLAGS) \
|
||||
$(MONITOR_CFLAGS)
|
||||
|
||||
CONFIG_FILE = @sim_config@
|
||||
IGEN_OPCODE_RULES = @sim_opcode@
|
||||
IGEN_DUPLICATE = @sim_dup@
|
||||
IGEN_FILTER = @sim_filter@
|
||||
IGEN_ICACHE = @sim_icache@
|
||||
DGEN_FLAGS = @sim_switch@
|
||||
|
||||
HDEFINES = @HDEFINES@
|
||||
TDEFINES =
|
||||
IGEN_FLAGS = $(IGEN_DUPLICATE) $(IGEN_FILTER) $(IGEN_ICACHE)
|
||||
|
@ -86,7 +120,7 @@ TARGETLIB = libsim.a
|
|||
all: run $(TARGETLIB) $(GDB_OBJ)
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(CFLAGS) $(INLINE_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES) $<
|
||||
$(CC) -c $(CFLAGS) $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(SIM_CFLAGS) $(HDEFINES) $(TDEFINES) $(INCLUDES) $<
|
||||
|
||||
|
||||
|
||||
|
@ -327,10 +361,10 @@ TAGS: tmp-igen tmp-dgen config.h ppc-config.h
|
|||
etags $(srcdir)/*.h $(srcdir)/*.c $(BUILT_SRC)
|
||||
|
||||
clean mostlyclean:
|
||||
rm -f tmp-* *.[oas] core psim run igen dgen config.log
|
||||
rm -f tmp-* *.[oas] core psim run igen dgen config.log $(BUILT_SRC)
|
||||
|
||||
distclean maintainer-clean realclean: clean
|
||||
rm -f TAGS $(BUILT_SRC) Makefile config.cache config.status config.h stamp-h
|
||||
rm -f TAGS Makefile config.cache config.status config.h stamp-h
|
||||
|
||||
Makefile: Makefile.in config.status
|
||||
CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
@ -345,5 +379,3 @@ config.status: configure config.make config.hdr
|
|||
install:
|
||||
$(INSTALL_XFORM) run $(bindir)/run
|
||||
|
||||
|
||||
# Make variables generated automatically by configure follow this
|
||||
|
|
534
sim/ppc/configure
vendored
534
sim/ppc/configure
vendored
|
@ -11,6 +11,53 @@
|
|||
ac_help=
|
||||
ac_default_prefix=/usr/local
|
||||
# Any additions from configure.in:
|
||||
ac_help="$ac_help
|
||||
--enable-sim-cflags=opts Extra CFLAGS for use in building simulator"
|
||||
ac_help="$ac_help
|
||||
--enable-sim-config=file Override default config file"
|
||||
ac_help="$ac_help
|
||||
--enable-sim-opcode=which Override default opcode lookup."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-switch Use a switch instead of a table for instruction call."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-duplicate Expand (duplicate) semantic functions."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-filter=rule Specify filter rules."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-icache=size Specify instruction cache size."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-inline=inlines Specify which functions should be inlined."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-bswap Use the BSWAP instruction on Intel 486s and Pentiums."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-endian=endian Specify target byte endian orientation."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-hostendain=end Specify host byte endian orientation."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-smp=n Specify number of processors to configure for."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-bitsize=n Specify target bitsize (32 or 64)."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-hostbitsize=n Specify host bitsize (32 or 64)."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-env=env Specify target environment (operating, virtual, user)."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-timebase Specify whether the PPC timebase is supported."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-alignment=align Specify strict or nonstrict alignment.
|
||||
case "${enableval}" in
|
||||
yes | strict | STRICT) sim_alignment="-DWITH_ALIGNMENT=STRICT_ALIGNMENT";;
|
||||
no | nonstrict | NONSTRICT) sim_alignment="-DWITH_ALIGNMENT=NOSTRICT_ALIGNMENT";;
|
||||
*) sim_alignment="-DWITH_ALIGNMENT=$enableval";;
|
||||
esac"
|
||||
ac_help="$ac_help
|
||||
--enable-sim-trace Specify whether tracing is supported."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-assert Specify whether to perform random assertions."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-float Specify whether to use host floating point or simulate."
|
||||
ac_help="$ac_help
|
||||
--enable-sim-monitor=mon Specify whether to enable monitoring events."
|
||||
|
||||
# Initialize some variables set by options.
|
||||
# The variables have the same names as the options, with
|
||||
|
@ -399,6 +446,274 @@ fi
|
|||
|
||||
|
||||
|
||||
# Check whether --enable-sim-cflags or --disable-sim-cflags was given.
|
||||
enableval="$enable_sim_cflags"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_cflags="-O2 -fomit-frame-pointer";;
|
||||
no) sim_cflags="";;
|
||||
*) sim_cflags=`echo "${enableval}" | sed -e "s/,/ /"`;;
|
||||
esac
|
||||
else
|
||||
sim_cflags=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-config or --disable-sim-config was given.
|
||||
enableval="$enable_sim_config"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_config="std-config.h";;
|
||||
no) sim_config="std-config.h";;
|
||||
*) sim_config="${enableval}";;
|
||||
esac
|
||||
else
|
||||
sim_config="std-config.h"
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-opcode or --disable-sim-opcode was given.
|
||||
enableval="$enable_sim_opcode"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_opcode="ppc-opcode-simple";;
|
||||
no) sim_opcode="ppc-opcode-simple";;
|
||||
*) sim_opcode="ppc-opcode-${enableval}";;
|
||||
esac
|
||||
else
|
||||
sim_opcode="ppc-opcode-simple"
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-switch or --disable-sim-switch was given.
|
||||
enableval="$enable_sim_switch"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_switch="-s";;
|
||||
*) sim_switch="";;
|
||||
esac
|
||||
else
|
||||
sim_switch=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-duplicate or --disable-sim-duplicate was given.
|
||||
enableval="$enable_sim_duplicate"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_dup="-e";;
|
||||
*) sim_dup="";;
|
||||
esac
|
||||
else
|
||||
sim_dup=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-filter or --disable-sim-filter was given.
|
||||
enableval="$enable_sim_filter"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_filter="";;
|
||||
*) sim_filter="-f $enableval";;
|
||||
esac
|
||||
else
|
||||
sim_filter="-f 64"
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-icache or --disable-sim-icache was given.
|
||||
enableval="$enable_sim_icache"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_icache="-r 1024";;
|
||||
*) sim_icache="";;
|
||||
esac
|
||||
else
|
||||
sim_icache=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-inline or --disable-sim-inline was given.
|
||||
enableval="$enable_sim_inline"
|
||||
if test -n "$enableval"; then
|
||||
sim_inline=""
|
||||
case "$enableval" in
|
||||
no) flags="";;
|
||||
0) flags="-DDEFAULT_INLINE=0";;
|
||||
yes | 2) flags="-DDEFAULT_INLINE=2";;
|
||||
1) flags="-DDEFAULT_INLINE=1";;
|
||||
*) for x in `echo "$enableval" | sed -e "s/,/ /g"`; do
|
||||
new_flag=""
|
||||
case "$x" in
|
||||
*_INLINE=*) new_flag="-D$x";;
|
||||
*_INLINE) new_flag="-D$x=2";;
|
||||
*=*) new_flag=`sed -e "s/=/_INLINE=/" -e "s/^/-D/"`;;
|
||||
*) new_flag="-D$x""_INLINE=2";;
|
||||
esac
|
||||
if x"$sim_inline" = x""; then
|
||||
sim_inline="$new_flag"
|
||||
else
|
||||
sim_inline="$flags $new_flag"
|
||||
fi
|
||||
done;;
|
||||
esac
|
||||
else
|
||||
sim_inline=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-bswap or --disable-sim-bswap was given.
|
||||
enableval="$enable_sim_bswap"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_bswap="-DWITH_BSWAP=1";;
|
||||
no) sim_bswap="-DWITH_BSWAP=0";;
|
||||
*) sim_bswap="";;
|
||||
esac
|
||||
else
|
||||
sim_bswap=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-endian or --disable-sim-endian was given.
|
||||
enableval="$enable_sim_endian"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) case "$target" in
|
||||
*powerpc-*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
|
||||
*powerpcle-*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
|
||||
*) echo "Unknown target $target" 1>&6; sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
|
||||
esac;;
|
||||
no) sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
|
||||
b*|B*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
|
||||
l*|L*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
|
||||
*) sim_endian="";;
|
||||
esac
|
||||
else
|
||||
sim_endian=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-hostendian or --disable-sim-hostendian was given.
|
||||
enableval="$enable_sim_hostendian"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
no) sim_hostendian="-DWITH_HOST_BYTE_ORDER=0";;
|
||||
b*|B*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=BIG_ENDIAN";;
|
||||
l*|L*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN";;
|
||||
*) sim_hostendian="";;
|
||||
esac
|
||||
else
|
||||
sim_hostendian=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-smp or --disable-sim-smp was given.
|
||||
enableval="$enable_sim_smp"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_smp="-DWITH_SMP=2";;
|
||||
no) sim_smp="-DWITH_SMP=0";;
|
||||
*) sim_smp="-DWITH_SMP=$enableval";;
|
||||
esac
|
||||
else
|
||||
sim_smp=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-bitsize or --disable-sim-bitsize was given.
|
||||
enableval="$enable_sim_bitsize"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_bitsize="";;
|
||||
no) sim_bitsize="";;
|
||||
*) sim_bitsize="-DWITH_TARGET_WORD_BITSIZE=$enableval";;
|
||||
esac
|
||||
else
|
||||
sim_bitsize=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-hostbitsize or --disable-sim-hostbitsize was given.
|
||||
enableval="$enable_sim_hostbitsize"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_hostbitsize="";;
|
||||
no) sim_hostbitsize="";;
|
||||
*) sim_hostbitsize="-DWITH_HOST_WORD_BITSIZE=$enableval";;
|
||||
esac
|
||||
else
|
||||
sim_hostbitsize=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-env or --disable-sim-env was given.
|
||||
enableval="$enable_sim_env"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
operating | os | oea) sim_env="-DWITH_ENVIRONMENT=OPERATING_ENVIRONMENT";;
|
||||
virtual | vea) sim_env="-DWITH_ENVIRONMENT=VIRTUAL_ENVIRONMENT";;
|
||||
user | uea) sim_env="-DWITH_ENVIRONMENT=USER_ENVIRONMENT";;
|
||||
*) sim_env="";;
|
||||
esac
|
||||
else
|
||||
sim_env=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-timebase or --disable-sim-timebase was given.
|
||||
enableval="$enable_sim_timebase"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_timebase="-DWITH_TIME_BASE=1";;
|
||||
no) sim_timebase="-DWITH_TIME_BASE=0";;
|
||||
*) sim_timebase="";;
|
||||
esac
|
||||
else
|
||||
sim_timebase=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-alignment or --disable-sim-alignment was given.
|
||||
enableval="$enable_sim_alignment"
|
||||
if test -n "$enableval"; then
|
||||
sim_alignment=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-trace or --disable-sim-trace was given.
|
||||
enableval="$enable_sim_trace"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_trace="-DWITH_TRACE=1";;
|
||||
no) sim_trace="-DWITH_TRACE=0";;
|
||||
*) sim_trace="";;
|
||||
esac
|
||||
else
|
||||
sim_trace=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-assert or --disable-sim-assert was given.
|
||||
enableval="$enable_sim_assert"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_assert="-DWITH_ASSERT=1";;
|
||||
no) sim_assert="-DWITH_ASSERT=0";;
|
||||
*) sim_assert="";;
|
||||
esac
|
||||
else
|
||||
sim_assert=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-float or --disable-sim-float was given.
|
||||
enableval="$enable_sim_float"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes | hard) sim_float="-DWITH_FLOATING_POINT=HARD_FLOATING_POINT";;
|
||||
no | soft) sim_float="-DWITH_FLOATING_POINT=SOFT_FLOATING_POINT";;
|
||||
*) sim_float="";;
|
||||
esac
|
||||
else
|
||||
sim_float=""
|
||||
fi
|
||||
|
||||
# Check whether --enable-sim-monitor or --disable-sim-monitor was given.
|
||||
enableval="$enable_sim_monitor"
|
||||
if test -n "$enableval"; then
|
||||
case "${enableval}" in
|
||||
yes) sim_mon="-DWITH_MON='MONITOR_INSTRUCTION_ISSUE | MONITOR_LOAD_STORE_UNIT'";;
|
||||
no) sim_mon="-DWITH_MON=0";;
|
||||
instruction) sim_mon="-DWITH_MON=MONITOR_INSTRUCTION_ISSUE";;
|
||||
memory) sim_mon="-DWITH_MON=MONITOR_LOAD_STORE_UNIT";;
|
||||
*) sim_mon="-DWITH_MON='$enableval'";;
|
||||
esac
|
||||
else
|
||||
sim_float=""
|
||||
fi
|
||||
|
||||
|
||||
|
||||
ac_aux_dir=
|
||||
|
@ -632,6 +947,79 @@ else
|
|||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
for ac_func in getrusage
|
||||
do
|
||||
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
||||
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 979 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func(); below. */
|
||||
#include <assert.h>
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
char $ac_func();
|
||||
|
||||
int main() { return 0; }
|
||||
int t() {
|
||||
|
||||
/* The GNU C library defines this for functions which it implements
|
||||
to always fail with ENOSYS. Some functions are actually named
|
||||
something starting with __ and the normal name is an alias. */
|
||||
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
|
||||
choke me
|
||||
#else
|
||||
$ac_func();
|
||||
#endif
|
||||
|
||||
; return 0; }
|
||||
EOF
|
||||
if eval $ac_link; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_$ac_func=yes"
|
||||
else
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_func_$ac_func=no"
|
||||
fi
|
||||
rm -f conftest*
|
||||
|
||||
fi
|
||||
if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
|
||||
echo "$ac_t""yes" 1>&6
|
||||
ac_tr_func=HAVE_`echo $ac_func | tr '[a-z]' '[A-Z]'`
|
||||
cat >> confdefs.h <<EOF
|
||||
#define $ac_tr_func 1
|
||||
EOF
|
||||
|
||||
else
|
||||
echo "$ac_t""no" 1>&6
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Put a plausible default for CC_FOR_BUILD in Makefile.
|
||||
# If we cannot run a trivial program, we must be cross compiling.
|
||||
echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6
|
||||
|
@ -642,7 +1030,7 @@ else
|
|||
ac_cv_c_cross=yes
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 646 "configure"
|
||||
#line 1034 "configure"
|
||||
#include "confdefs.h"
|
||||
main(){return(0);}
|
||||
EOF
|
||||
|
@ -680,7 +1068,7 @@ else
|
|||
# On the NeXT, cc -E runs the code through the compiler's parser,
|
||||
# not just through cpp.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 684 "configure"
|
||||
#line 1072 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
|
@ -694,7 +1082,7 @@ else
|
|||
rm -rf conftest*
|
||||
CPP="${CC-cc} -E -traditional-cpp"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 698 "configure"
|
||||
#line 1086 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
|
@ -719,7 +1107,7 @@ else
|
|||
fi
|
||||
echo "$ac_t""$CPP" 1>&6
|
||||
|
||||
for ac_hdr in string.h strings.h stdlib.h time.h sys/times.h
|
||||
for ac_hdr in string.h strings.h stdlib.h time.h sys/times.h unistd.h sys/resource.h
|
||||
do
|
||||
ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
|
||||
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
|
||||
|
@ -727,7 +1115,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 731 "configure"
|
||||
#line 1119 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$ac_hdr>
|
||||
EOF
|
||||
|
@ -877,6 +1265,27 @@ s%@CC@%$CC%g
|
|||
s%@HDEFINES@%$HDEFINES%g
|
||||
s%@AR@%$AR%g
|
||||
s%@RANLIB@%$RANLIB%g
|
||||
s%@sim_cflags@%$sim_cflags%g
|
||||
s%@sim_config@%$sim_config%g
|
||||
s%@sim_opcode@%$sim_opcode%g
|
||||
s%@sim_switch@%$sim_switch%g
|
||||
s%@sim_dup@%$sim_dup%g
|
||||
s%@sim_filter@%$sim_filter%g
|
||||
s%@sim_icache@%$sim_icache%g
|
||||
s%@sim_inline@%$sim_inline%g
|
||||
s%@sim_bswap@%$sim_bswap%g
|
||||
s%@sim_endian@%$sim_endian%g
|
||||
s%@sim_hostendian@%$sim_hostendian%g
|
||||
s%@sim_smp@%$sim_smp%g
|
||||
s%@sim_bitsize@%$sim_bitsize%g
|
||||
s%@sim_hostbitsize@%$sim_hostbitsize%g
|
||||
s%@sim_env@%$sim_env%g
|
||||
s%@sim_timebase@%$sim_timebase%g
|
||||
s%@sim_alignment@%$sim_alignment%g
|
||||
s%@sim_float@%$sim_float%g
|
||||
s%@sim_trace@%$sim_trace%g
|
||||
s%@sim_assert@%$sim_assert%g
|
||||
s%@sim_monitor@%$sim_monitor%g
|
||||
s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g
|
||||
s%@CPP@%$CPP%g
|
||||
|
||||
|
@ -1039,118 +1448,3 @@ chmod +x $CONFIG_STATUS
|
|||
rm -fr confdefs* $ac_clean_files
|
||||
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
|
||||
|
||||
|
||||
if test x"$enable_sim_cflags" != x"" -a x"$enable_sim_cflags" != x"no"; then
|
||||
if test "$enable_sim_cflags" = "yes"; then
|
||||
enable_sim_cflags="-fomit-frame-pointer,-O2"
|
||||
fi
|
||||
echo "Setting SIM_CFLAGS=$enable_sim_cflags" | sed -e "s/,/ /g" 1>&6
|
||||
(echo; echo "# --enable-sim-cflags=$enable_sim_cflags";
|
||||
echo "SIM_CFLAGS = $enable_sim_cflags" | sed -e "s/,/ /g") >> Makefile
|
||||
else
|
||||
echo "Setting SIM_CFLAGS=" 1>&6
|
||||
(echo; echo "# no --enable-sim-cflags"; echo "SIM_CFLAGS =") >> Makefile
|
||||
fi
|
||||
|
||||
$srcdir/config.make Makefile CONFIG_FILE --enable-sim-config "$enable_sim_config" \
|
||||
"" "std-config.h" "no" "std-config.h" "yes" "std-config.h" "*" "$enable_sim_config" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_OPCODE_RULES --enable-sim-opcode "$enable_sim_opcode" \
|
||||
"" "ppc-opcode-simple" "no" "ppc-opcode-simple" "yes" "ppc-opcode-simple" \
|
||||
"complex" "ppc-opcode-complex" "simple" "ppc-opcode-simple" "stupid" "ppc-opcode-stupid" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile DGEN_FLAGS --enable-sim-switch "$enable_sim_switch" \
|
||||
"" "" "no" "" "yes" "-s" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_DUPLICATE --enable-sim-duplicate "$enable_sim_duplicate" \
|
||||
"" "" "no" "" "yes" "-e" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_FILTER --enable-sim-filter "$enable_sim_filter" \
|
||||
"" "-f 64" "no" "" "yes" "-f 64" "*" "$enable_sim_filter" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_ICACHE --enable-sim-icache "$enable_sim_icache" \
|
||||
"" "" "no" "" "yes" "-r 1024" "*" "-r $enable_sim_icache" 1>&6
|
||||
|
||||
flags=""
|
||||
if test x"$enable_sim_inline" != x""; then
|
||||
case "$enable_sim_inline" in
|
||||
no) flags="";;
|
||||
0) flags=" -DDEFAULT_INLINE=0";;
|
||||
yes | 2) flags=" -DDEFAULT_INLINE=2";;
|
||||
1) flags=" -DDEFAULT_INLINE=1";;
|
||||
*) for x in `echo "$enable_sim_inline" | sed -e "s/,/ /g"`; do
|
||||
case "$x" in
|
||||
*_INLINE=*) flags="$flags -D$x";;
|
||||
*_INLINE) flags="$flags -D$x=2";;
|
||||
*=*) x=`sed -e "s/=/_INLINE=/"`; flags="$flags -D$x";;
|
||||
*) flags="$flags -D$x""_INLINE=2";;
|
||||
esac
|
||||
done;;
|
||||
esac
|
||||
fi
|
||||
if test x"$flags" != x""; then
|
||||
echo "Setting INLINE_CFLAGS=$flags" 1>&6
|
||||
(echo; echo "# --enable-sim-inline=$enable_sim_inline"; echo "INLINE_CFLAGS =$flags") >> Makefile
|
||||
else
|
||||
echo "Setting INLINE_CFLAGS=" 1>&6
|
||||
(echo; echo "# no --enable-sim-inline"; echo "INLINE_CFLAGS =") >> Makefile
|
||||
fi
|
||||
|
||||
$srcdir/config.hdr config.h WITH_BSWAP --enable-sim-bswap "$enable_sim_bswap" "yes" 1
|
||||
|
||||
case "$target" in
|
||||
*powerpc-*) endian="BIG_ENDIAN";;
|
||||
*powerpcle-*) endian="LITTLE_ENDIAN";;
|
||||
*) echo "Unknown $target" 1>&6; endian="0";;
|
||||
esac
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TARGET_BYTE_ORDER --enable-sim-endian "$enable_sim_endian" \
|
||||
"" "0" "no" "0" "yes" "$endian" \
|
||||
"b" "BIG_ENDIAN" "big" "BIG_ENDIAN" "big-endian" "BIG_ENDIAN" \
|
||||
"B" "BIG_ENDIAN" "BIG" "BIG_ENDIAN" "BIG-ENDIAN" "BIG_ENDIAN" \
|
||||
"l" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" \
|
||||
"L" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_HOST_BYTE_ORDER --enable-sim-hostendian "$enable_sim_hostendian" \
|
||||
"b" "BIG_ENDIAN" "big" "BIG_ENDIAN" "big-endian" "BIG_ENDIAN" \
|
||||
"B" "BIG_ENDIAN" "BIG" "BIG_ENDIAN" "BIG-ENDIAN" "BIG_ENDIAN" \
|
||||
"l" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" \
|
||||
"L" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_SMP --enable-sim-smp "$enable_sim_smp" \
|
||||
"" "0" "no" "0" "yes" "2" "*" "$enable_sim_smp" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TARGET_WORD_BITSIZE --enable-sim-bitsize "$enable_sim_bitsize" \
|
||||
"yes" "32" "32" "32" "32" "64" "64" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_HOST_WORD_BITSIZE --enable-sim-hostbitsize "$enable_sim_hostbitsize" \
|
||||
"yes" "32" "32" "32" "32" "64" "64" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_ENVIRONMENT --enable-sim-env "$enable_sim_env" \
|
||||
"yes" "0" \
|
||||
"operating" "OPERATING_ENVIRONMENT" "os" "OPERATING_ENVIRONMENT" "oea" "OPERATING_ENVIRONMENT" \
|
||||
"virtual" "VIRTUAL_ENVIRONMENT" "vea" "VIRTUAL_ENVIRONMENT" \
|
||||
"user" "USER_ENVIRONMENT" "uea" "USER_ENVIRONMENT" \
|
||||
1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TIME_BASE --enable-sim-timebase "$enable_sim_timebase" \
|
||||
"no" "0" "yes" "1" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_ALIGNMENT --enable-sim-alignment "$enable_sim_alignment" \
|
||||
"no" "NONSTRICT_ALIGNMENT" "nonstrict" "NONSTRICT_ALIGNMENT" \
|
||||
"yes" "STRICT_ALIGNMENT" "strict" "STRICT_ALIGNMENT" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_FLOATING_POINT --enable-sim-float "$enable_sim_float" \
|
||||
"no" "SOFT_FLOATING_POINT" "soft" "SOFT_FLOATING_POINT" \
|
||||
"yes" "HARD_FLOATING_POINT" "hard" "HARD_FLOATING_POINT" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TRACE --enable-sim-trace "$enable_sim_trace" \
|
||||
"no" "0" "yes" "1" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_ASSERT --enable-sim-assert "$enable_sim_assert" \
|
||||
"no" "0" "yes" "1" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_MON --enable-sim-monitor "$enable_sim_monitor" \
|
||||
"no" "0" "yes" "MONITOR_INSTRUCTION_ISSUE|MONITOR_LOAD_STORE_UNIT" \
|
||||
"instruction" "MONITOR_INSTRUCTION_ISSUE" \
|
||||
"memory" "MONITOR_LOAD_STORE_UNIT" 1>&6
|
||||
|
|
|
@ -2,6 +2,196 @@ dnl Process this file with autoconf to produce a configure script.
|
|||
AC_PREREQ(2.3)dnl
|
||||
AC_INIT(Makefile.in)
|
||||
|
||||
AC_ARG_ENABLE(sim-cflags,
|
||||
[ --enable-sim-cflags=opts Extra CFLAGS for use in building simulator],
|
||||
[case "${enableval}" in
|
||||
yes) sim_cflags="-O2 -fomit-frame-pointer";;
|
||||
no) sim_cflags="";;
|
||||
*) sim_cflags=`echo "${enableval}" | sed -e "s/,/ /"`;;
|
||||
esac],[sim_cflags=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-config,
|
||||
[ --enable-sim-config=file Override default config file],
|
||||
[case "${enableval}" in
|
||||
yes) sim_config="std-config.h";;
|
||||
no) sim_config="std-config.h";;
|
||||
*) sim_config="${enableval}";;
|
||||
esac],[sim_config="std-config.h]")dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-opcode,
|
||||
[ --enable-sim-opcode=which Override default opcode lookup.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_opcode="ppc-opcode-simple";;
|
||||
no) sim_opcode="ppc-opcode-simple";;
|
||||
*) sim_opcode="ppc-opcode-${enableval}";;
|
||||
esac],[sim_opcode="ppc-opcode-simple"])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-switch,
|
||||
[ --enable-sim-switch Use a switch instead of a table for instruction call.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_switch="-s";;
|
||||
*) sim_switch="";;
|
||||
esac],[sim_switch=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-duplicate,
|
||||
[ --enable-sim-duplicate Expand (duplicate) semantic functions.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_dup="-e";;
|
||||
*) sim_dup="";;
|
||||
esac],[sim_dup=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-filter,
|
||||
[ --enable-sim-filter=rule Specify filter rules.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_filter="";;
|
||||
*) sim_filter="-f $enableval";;
|
||||
esac],[sim_filter="-f 64"])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-icache,
|
||||
[ --enable-sim-icache=size Specify instruction cache size.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_icache="-r 1024";;
|
||||
*) sim_icache="";;
|
||||
esac],[sim_icache=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-inline,
|
||||
[ --enable-sim-inline=inlines Specify which functions should be inlined.],
|
||||
[sim_inline=""
|
||||
case "$enableval" in
|
||||
no) flags="";;
|
||||
0) flags="-DDEFAULT_INLINE=0";;
|
||||
yes | 2) flags="-DDEFAULT_INLINE=2";;
|
||||
1) flags="-DDEFAULT_INLINE=1";;
|
||||
*) for x in `echo "$enableval" | sed -e "s/,/ /g"`; do
|
||||
new_flag=""
|
||||
case "$x" in
|
||||
*_INLINE=*) new_flag="-D$x";;
|
||||
*_INLINE) new_flag="-D$x=2";;
|
||||
*=*) new_flag=`sed -e "s/=/_INLINE=/" -e "s/^/-D/"`;;
|
||||
*) new_flag="-D$x""_INLINE=2";;
|
||||
esac
|
||||
if x"$sim_inline" = x""; then
|
||||
sim_inline="$new_flag"
|
||||
else
|
||||
sim_inline="$flags $new_flag"
|
||||
fi
|
||||
done;;
|
||||
esac],[sim_inline=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-bswap,
|
||||
[ --enable-sim-bswap Use the BSWAP instruction on Intel 486s and Pentiums.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_bswap="-DWITH_BSWAP=1";;
|
||||
no) sim_bswap="-DWITH_BSWAP=0";;
|
||||
*) sim_bswap="";;
|
||||
esac],[sim_bswap=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-endian,
|
||||
[ --enable-sim-endian=endian Specify target byte endian orientation.],
|
||||
[case "${enableval}" in
|
||||
yes) case "$target" in
|
||||
*powerpc-*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
|
||||
*powerpcle-*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
|
||||
*) echo "Unknown target $target" 1>&6; sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
|
||||
esac;;
|
||||
no) sim_endian="-DWITH_TARGET_BYTE_ORDER=0";;
|
||||
b*|B*) sim_endian="-DWITH_TARGET_BYTE_ORDER=BIG_ENDIAN";;
|
||||
l*|L*) sim_endian="-DWITH_TARGET_BYTE_ORDER=LITTLE_ENDIAN";;
|
||||
*) sim_endian="";;
|
||||
esac],[sim_endian=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-hostendian,
|
||||
[ --enable-sim-hostendain=end Specify host byte endian orientation.],
|
||||
[case "${enableval}" in
|
||||
no) sim_hostendian="-DWITH_HOST_BYTE_ORDER=0";;
|
||||
b*|B*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=BIG_ENDIAN";;
|
||||
l*|L*) sim_hostendian="-DWITH_HOST_BYTE_ORDER=LITTLE_ENDIAN";;
|
||||
*) sim_hostendian="";;
|
||||
esac],[sim_hostendian=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-smp,
|
||||
[ --enable-sim-smp=n Specify number of processors to configure for.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_smp="-DWITH_SMP=2";;
|
||||
no) sim_smp="-DWITH_SMP=0";;
|
||||
*) sim_smp="-DWITH_SMP=$enableval";;
|
||||
esac],[sim_smp=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-bitsize,
|
||||
[ --enable-sim-bitsize=n Specify target bitsize (32 or 64).],
|
||||
[case "${enableval}" in
|
||||
yes) sim_bitsize="";;
|
||||
no) sim_bitsize="";;
|
||||
*) sim_bitsize="-DWITH_TARGET_WORD_BITSIZE=$enableval";;
|
||||
esac],[sim_bitsize=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-hostbitsize,
|
||||
[ --enable-sim-hostbitsize=n Specify host bitsize (32 or 64).],
|
||||
[case "${enableval}" in
|
||||
yes) sim_hostbitsize="";;
|
||||
no) sim_hostbitsize="";;
|
||||
*) sim_hostbitsize="-DWITH_HOST_WORD_BITSIZE=$enableval";;
|
||||
esac],[sim_hostbitsize=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-env,
|
||||
[ --enable-sim-env=env Specify target environment (operating, virtual, user).],
|
||||
[case "${enableval}" in
|
||||
operating | os | oea) sim_env="-DWITH_ENVIRONMENT=OPERATING_ENVIRONMENT";;
|
||||
virtual | vea) sim_env="-DWITH_ENVIRONMENT=VIRTUAL_ENVIRONMENT";;
|
||||
user | uea) sim_env="-DWITH_ENVIRONMENT=USER_ENVIRONMENT";;
|
||||
*) sim_env="";;
|
||||
esac],[sim_env=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-timebase,
|
||||
[ --enable-sim-timebase Specify whether the PPC timebase is supported.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_timebase="-DWITH_TIME_BASE=1";;
|
||||
no) sim_timebase="-DWITH_TIME_BASE=0";;
|
||||
*) sim_timebase="";;
|
||||
esac],[sim_timebase=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-alignment,
|
||||
[ --enable-sim-alignment=align Specify strict or nonstrict alignment.]
|
||||
[case "${enableval}" in
|
||||
yes | strict | STRICT) sim_alignment="-DWITH_ALIGNMENT=STRICT_ALIGNMENT";;
|
||||
no | nonstrict | NONSTRICT) sim_alignment="-DWITH_ALIGNMENT=NOSTRICT_ALIGNMENT";;
|
||||
*) sim_alignment="-DWITH_ALIGNMENT=$enableval";;
|
||||
esac],[sim_alignment=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-trace,
|
||||
[ --enable-sim-trace Specify whether tracing is supported.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_trace="-DWITH_TRACE=1";;
|
||||
no) sim_trace="-DWITH_TRACE=0";;
|
||||
*) sim_trace="";;
|
||||
esac],[sim_trace=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-assert,
|
||||
[ --enable-sim-assert Specify whether to perform random assertions.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_assert="-DWITH_ASSERT=1";;
|
||||
no) sim_assert="-DWITH_ASSERT=0";;
|
||||
*) sim_assert="";;
|
||||
esac],[sim_assert=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-float,
|
||||
[ --enable-sim-float Specify whether to use host floating point or simulate.],
|
||||
[case "${enableval}" in
|
||||
yes | hard) sim_float="-DWITH_FLOATING_POINT=HARD_FLOATING_POINT";;
|
||||
no | soft) sim_float="-DWITH_FLOATING_POINT=SOFT_FLOATING_POINT";;
|
||||
*) sim_float="";;
|
||||
esac],[sim_float=""])dnl
|
||||
|
||||
AC_ARG_ENABLE(sim-monitor,
|
||||
[ --enable-sim-monitor=mon Specify whether to enable monitoring events.],
|
||||
[case "${enableval}" in
|
||||
yes) sim_mon="-DWITH_MON='MONITOR_INSTRUCTION_ISSUE | MONITOR_LOAD_STORE_UNIT'";;
|
||||
no) sim_mon="-DWITH_MON=0";;
|
||||
instruction) sim_mon="-DWITH_MON=MONITOR_INSTRUCTION_ISSUE";;
|
||||
memory) sim_mon="-DWITH_MON=MONITOR_LOAD_STORE_UNIT";;
|
||||
*) sim_mon="-DWITH_MON='$enableval'";;
|
||||
esac],[sim_float=""])dnl
|
||||
|
||||
AC_CONFIG_HEADER(config.h:config.in)
|
||||
|
||||
AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../..)
|
||||
|
@ -16,6 +206,29 @@ AC_SUBST(HDEFINES)
|
|||
AR=${AR-ar}
|
||||
AC_SUBST(AR)
|
||||
AC_PROG_RANLIB
|
||||
AC_SUBST(sim_cflags)
|
||||
AC_SUBST(sim_config)
|
||||
AC_SUBST(sim_opcode)
|
||||
AC_SUBST(sim_switch)
|
||||
AC_SUBST(sim_dup)
|
||||
AC_SUBST(sim_filter)
|
||||
AC_SUBST(sim_icache)
|
||||
AC_SUBST(sim_inline)
|
||||
AC_SUBST(sim_bswap)
|
||||
AC_SUBST(sim_endian)
|
||||
AC_SUBST(sim_hostendian)
|
||||
AC_SUBST(sim_smp)
|
||||
AC_SUBST(sim_bitsize)
|
||||
AC_SUBST(sim_hostbitsize)
|
||||
AC_SUBST(sim_env)
|
||||
AC_SUBST(sim_timebase)
|
||||
AC_SUBST(sim_alignment)
|
||||
AC_SUBST(sim_float)
|
||||
AC_SUBST(sim_trace)
|
||||
AC_SUBST(sim_assert)
|
||||
AC_SUBST(sim_monitor)
|
||||
|
||||
AC_CHECK_FUNCS(getrusage)
|
||||
|
||||
# Put a plausible default for CC_FOR_BUILD in Makefile.
|
||||
AC_C_CROSS
|
||||
|
@ -26,122 +239,7 @@ else
|
|||
fi
|
||||
AC_SUBST(CC_FOR_BUILD)
|
||||
|
||||
AC_CHECK_HEADERS(string.h strings.h stdlib.h time.h sys/times.h)
|
||||
AC_CHECK_HEADERS(string.h strings.h stdlib.h time.h sys/times.h unistd.h sys/resource.h)
|
||||
|
||||
AC_OUTPUT(Makefile,
|
||||
[case x$CONFIG_HEADERS in xconfig.h:config.in) echo > stamp-h ;; esac])
|
||||
|
||||
if test x"$enable_sim_cflags" != x"" -a x"$enable_sim_cflags" != x"no"; then
|
||||
if test "$enable_sim_cflags" = "yes"; then
|
||||
enable_sim_cflags="-fomit-frame-pointer,-O2"
|
||||
fi
|
||||
echo "Setting SIM_CFLAGS=$enable_sim_cflags" | sed -e "s/,/ /g" 1>&6
|
||||
(echo; echo "# --enable-sim-cflags=$enable_sim_cflags";
|
||||
echo "SIM_CFLAGS = $enable_sim_cflags" | sed -e "s/,/ /g") >> Makefile
|
||||
else
|
||||
echo "Setting SIM_CFLAGS=" 1>&6
|
||||
(echo; echo "# no --enable-sim-cflags"; echo "SIM_CFLAGS =") >> Makefile
|
||||
fi
|
||||
|
||||
$srcdir/config.make Makefile CONFIG_FILE --enable-sim-config "$enable_sim_config" \
|
||||
"" "std-config.h" "no" "std-config.h" "yes" "std-config.h" "*" "$enable_sim_config" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_OPCODE_RULES --enable-sim-opcode "$enable_sim_opcode" \
|
||||
"" "ppc-opcode-simple" "no" "ppc-opcode-simple" "yes" "ppc-opcode-simple" \
|
||||
"complex" "ppc-opcode-complex" "simple" "ppc-opcode-simple" "stupid" "ppc-opcode-stupid" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile DGEN_FLAGS --enable-sim-switch "$enable_sim_switch" \
|
||||
"" "" "no" "" "yes" "-s" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_DUPLICATE --enable-sim-duplicate "$enable_sim_duplicate" \
|
||||
"" "" "no" "" "yes" "-e" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_FILTER --enable-sim-filter "$enable_sim_filter" \
|
||||
"" "-f 64" "no" "" "yes" "-f 64" "*" "$enable_sim_filter" 1>&6
|
||||
|
||||
$srcdir/config.make Makefile IGEN_ICACHE --enable-sim-icache "$enable_sim_icache" \
|
||||
"" "" "no" "" "yes" "-r 1024" "*" "-r $enable_sim_icache" 1>&6
|
||||
|
||||
flags=""
|
||||
if test x"$enable_sim_inline" != x""; then
|
||||
case "$enable_sim_inline" in
|
||||
no) flags="";;
|
||||
0) flags=" -DDEFAULT_INLINE=0";;
|
||||
yes | 2) flags=" -DDEFAULT_INLINE=2";;
|
||||
1) flags=" -DDEFAULT_INLINE=1";;
|
||||
*) for x in `echo "$enable_sim_inline" | sed -e "s/,/ /g"`; do
|
||||
case "$x" in
|
||||
*_INLINE=*) flags="$flags -D$x";;
|
||||
*_INLINE) flags="$flags -D$x=2";;
|
||||
*=*) x=`sed -e "s/=/_INLINE=/"`; flags="$flags -D$x";;
|
||||
*) flags="$flags -D$x""_INLINE=2";;
|
||||
esac
|
||||
done;;
|
||||
esac
|
||||
fi
|
||||
if test x"$flags" != x""; then
|
||||
echo "Setting INLINE_CFLAGS=$flags" 1>&6
|
||||
(echo; echo "# --enable-sim-inline=$enable_sim_inline"; echo "INLINE_CFLAGS =$flags") >> Makefile
|
||||
else
|
||||
echo "Setting INLINE_CFLAGS=" 1>&6
|
||||
(echo; echo "# no --enable-sim-inline"; echo "INLINE_CFLAGS =") >> Makefile
|
||||
fi
|
||||
|
||||
$srcdir/config.hdr config.h WITH_BSWAP --enable-sim-bswap "$enable_sim_bswap" "yes" 1
|
||||
|
||||
case "$target" in
|
||||
*powerpc-*) endian="BIG_ENDIAN";;
|
||||
*powerpcle-*) endian="LITTLE_ENDIAN";;
|
||||
*) echo "Unknown $target" 1>&6; endian="0";;
|
||||
esac
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TARGET_BYTE_ORDER --enable-sim-endian "$enable_sim_endian" \
|
||||
"" "0" "no" "0" "yes" "$endian" \
|
||||
"b" "BIG_ENDIAN" "big" "BIG_ENDIAN" "big-endian" "BIG_ENDIAN" \
|
||||
"B" "BIG_ENDIAN" "BIG" "BIG_ENDIAN" "BIG-ENDIAN" "BIG_ENDIAN" \
|
||||
"l" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" \
|
||||
"L" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_HOST_BYTE_ORDER --enable-sim-hostendian "$enable_sim_hostendian" \
|
||||
"b" "BIG_ENDIAN" "big" "BIG_ENDIAN" "big-endian" "BIG_ENDIAN" \
|
||||
"B" "BIG_ENDIAN" "BIG" "BIG_ENDIAN" "BIG-ENDIAN" "BIG_ENDIAN" \
|
||||
"l" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" \
|
||||
"L" "LITTLE_ENDIAN" "little" "LITTLE_ENDIAN" "little-endian" "LITTLE_ENDIAN" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_SMP --enable-sim-smp "$enable_sim_smp" \
|
||||
"" "0" "no" "0" "yes" "2" "*" "$enable_sim_smp" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TARGET_WORD_BITSIZE --enable-sim-bitsize "$enable_sim_bitsize" \
|
||||
"yes" "32" "32" "32" "32" "64" "64" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_HOST_WORD_BITSIZE --enable-sim-hostbitsize "$enable_sim_hostbitsize" \
|
||||
"yes" "32" "32" "32" "32" "64" "64" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_ENVIRONMENT --enable-sim-env "$enable_sim_env" \
|
||||
"yes" "0" \
|
||||
"operating" "OPERATING_ENVIRONMENT" "os" "OPERATING_ENVIRONMENT" "oea" "OPERATING_ENVIRONMENT" \
|
||||
"virtual" "VIRTUAL_ENVIRONMENT" "vea" "VIRTUAL_ENVIRONMENT" \
|
||||
"user" "USER_ENVIRONMENT" "uea" "USER_ENVIRONMENT" \
|
||||
1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TIME_BASE --enable-sim-timebase "$enable_sim_timebase" \
|
||||
"no" "0" "yes" "1" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_ALIGNMENT --enable-sim-alignment "$enable_sim_alignment" \
|
||||
"no" "NONSTRICT_ALIGNMENT" "nonstrict" "NONSTRICT_ALIGNMENT" \
|
||||
"yes" "STRICT_ALIGNMENT" "strict" "STRICT_ALIGNMENT" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_FLOATING_POINT --enable-sim-float "$enable_sim_float" \
|
||||
"no" "SOFT_FLOATING_POINT" "soft" "SOFT_FLOATING_POINT" \
|
||||
"yes" "HARD_FLOATING_POINT" "hard" "HARD_FLOATING_POINT" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_TRACE --enable-sim-trace "$enable_sim_trace" \
|
||||
"no" "0" "yes" "1" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_ASSERT --enable-sim-assert "$enable_sim_assert" \
|
||||
"no" "0" "yes" "1" 1>&6
|
||||
|
||||
$srcdir/config.hdr config.h WITH_MON --enable-sim-monitor "$enable_sim_monitor" \
|
||||
"no" "0" "yes" "MONITOR_INSTRUCTION_ISSUE|MONITOR_LOAD_STORE_UNIT" \
|
||||
"instruction" "MONITOR_INSTRUCTION_ISSUE" \
|
||||
"memory" "MONITOR_LOAD_STORE_UNIT" 1>&6
|
||||
|
|
|
@ -31,6 +31,14 @@
|
|||
#include "cpu.h"
|
||||
#include "idecode.h"
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct _cpu {
|
||||
|
||||
/* the registers */
|
||||
|
@ -49,13 +57,14 @@ struct _cpu {
|
|||
int external_exception_pending;
|
||||
|
||||
/* the system this processor is contained within */
|
||||
cpu_mon *monitor;
|
||||
psim *system;
|
||||
event_queue *events;
|
||||
int cpu_nr;
|
||||
|
||||
/* if required, a cache to store decoded instructions */
|
||||
#if WITH_IDECODE_CACHE
|
||||
idecode_cache icache[IDECODE_CACHE_SIZE];
|
||||
#if WITH_IDECODE_CACHE_SIZE
|
||||
/* a cache to store cracked instructions */
|
||||
idecode_cache icache[WITH_IDECODE_CACHE_SIZE];
|
||||
#endif
|
||||
|
||||
/* address reservation: keep the physical address and the contents
|
||||
|
@ -67,8 +76,6 @@ struct _cpu {
|
|||
signed64 decrementer_local_time;
|
||||
event_entry_tag decrementer_event;
|
||||
|
||||
/* Counts of number of instructions executed. */
|
||||
long number_of_insns;
|
||||
};
|
||||
|
||||
|
||||
|
@ -76,6 +83,7 @@ INLINE_CPU cpu *
|
|||
cpu_create(psim *system,
|
||||
core *memory,
|
||||
event_queue *events,
|
||||
cpu_mon *monitor,
|
||||
int cpu_nr)
|
||||
{
|
||||
cpu *processor = ZALLOC(cpu);
|
||||
|
@ -90,11 +98,20 @@ cpu_create(psim *system,
|
|||
processor->system = system;
|
||||
processor->events = events;
|
||||
processor->cpu_nr = cpu_nr;
|
||||
processor->monitor = monitor;
|
||||
|
||||
return processor;
|
||||
}
|
||||
|
||||
|
||||
INLINE_CPU void
|
||||
cpu_init(cpu *processor)
|
||||
{
|
||||
bzero(&processor->regs, sizeof(processor->regs));
|
||||
/* FIXME - should any of VM be inited also ? */
|
||||
}
|
||||
|
||||
|
||||
/* find ones way home */
|
||||
|
||||
INLINE_CPU psim *
|
||||
|
@ -115,6 +132,11 @@ cpu_event_queue(cpu *processor)
|
|||
return processor->events;
|
||||
}
|
||||
|
||||
INLINE_CPU cpu_mon *
|
||||
cpu_monitor(cpu *processor)
|
||||
{
|
||||
return processor->monitor;
|
||||
}
|
||||
|
||||
/* The processors local concept of time */
|
||||
|
||||
|
@ -219,12 +241,23 @@ cpu_halt(cpu *processor,
|
|||
}
|
||||
|
||||
|
||||
#if WITH_IDECODE_CACHE
|
||||
#if WITH_IDECODE_CACHE_SIZE
|
||||
/* allow access to the cpu's instruction cache */
|
||||
INLINE_CPU idecode_cache *
|
||||
cpu_icache(cpu *processor)
|
||||
cpu_icache_entry(cpu *processor,
|
||||
unsigned_word cia)
|
||||
{
|
||||
return processor->icache;
|
||||
return &processor->icache[cia / 4 % WITH_IDECODE_CACHE_SIZE];
|
||||
}
|
||||
|
||||
|
||||
INLINE_CPU void
|
||||
cpu_flush_icache(cpu *processor)
|
||||
{
|
||||
int i;
|
||||
/* force all addresses to 0xff... so that they never hit */
|
||||
for (i = 0; i < WITH_IDECODE_CACHE_SIZE; i++)
|
||||
processor->icache[i].address = MASK(0, 63);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -264,11 +297,9 @@ cpu_registers(cpu *processor)
|
|||
INLINE_CPU void
|
||||
cpu_synchronize_context(cpu *processor)
|
||||
{
|
||||
#if WITH_IDECODE_CACHE
|
||||
/* kill off the contents of the cache */
|
||||
int i;
|
||||
for (i = 0; i < IDECODE_CACHE_SIZE; i++)
|
||||
processor->icache[i].address = MASK(0,63);
|
||||
#if (WITH_IDECODE_CACHE)
|
||||
/* kill of the cache */
|
||||
cpu_flush_icache(processor);
|
||||
#endif
|
||||
|
||||
/* don't allow the processor to change endian modes */
|
||||
|
@ -285,47 +316,11 @@ cpu_synchronize_context(cpu *processor)
|
|||
}
|
||||
|
||||
|
||||
/* # of instructions counter access */
|
||||
|
||||
INLINE_CPU void
|
||||
cpu_increment_number_of_insns(cpu *processor)
|
||||
{
|
||||
processor->number_of_insns++;
|
||||
}
|
||||
|
||||
INLINE_CPU long
|
||||
cpu_get_number_of_insns(cpu *processor)
|
||||
{
|
||||
return processor->number_of_insns;
|
||||
}
|
||||
|
||||
static INLINE_CPU char *
|
||||
cpu_add_commas(char *endbuf, long value)
|
||||
{
|
||||
int comma = 3;
|
||||
|
||||
*--endbuf = '\0';
|
||||
do {
|
||||
if (comma-- == 0)
|
||||
{
|
||||
*--endbuf = ',';
|
||||
comma = 2;
|
||||
}
|
||||
|
||||
*--endbuf = (value % 10) + '0';
|
||||
} while ((value /= 10) != 0);
|
||||
|
||||
return endbuf;
|
||||
}
|
||||
/* might again be useful one day */
|
||||
|
||||
INLINE_CPU void
|
||||
cpu_print_info(cpu *processor, int verbose)
|
||||
{
|
||||
char buffer[20];
|
||||
|
||||
printf_filtered("CPU #%d executed %s instructions.\n",
|
||||
processor->cpu_nr+1,
|
||||
cpu_add_commas(buffer + sizeof(buffer), processor->number_of_insns));
|
||||
}
|
||||
|
||||
#endif /* _CPU_C_ */
|
||||
|
|
|
@ -23,7 +23,10 @@
|
|||
#define _DEBUG_C_
|
||||
|
||||
#include "basics.h"
|
||||
|
||||
#ifdef HAVE_STDLIB
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
int ppc_trace[nr_trace_options];
|
||||
int print_info;
|
||||
|
|
|
@ -26,13 +26,23 @@
|
|||
#define STATIC_INLINE_DEVICE_TREE STATIC_INLINE
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "basics.h"
|
||||
#include "device_tree.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
node_any = 0,
|
||||
node_device,
|
||||
|
|
|
@ -26,10 +26,7 @@
|
|||
#define STATIC_INLINE_DEVICES STATIC_INLINE
|
||||
#endif
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
|
@ -38,6 +35,22 @@
|
|||
#include "devices.h"
|
||||
#include "events.h"
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
#include "bfd.h"
|
||||
|
|
|
@ -22,18 +22,32 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <getopt.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "misc.h"
|
||||
#include "lf.h"
|
||||
#include "table.h"
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
int spreg_lookup_table = 1;
|
||||
|
|
|
@ -22,14 +22,21 @@
|
|||
#ifndef _EMUL_NETBSD_C_
|
||||
#define _EMUL_NETBSD_C_
|
||||
|
||||
#include "emul_generic.h"
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
|
@ -38,6 +45,14 @@
|
|||
#include <sys/mount.h>
|
||||
#include <sys/dirent.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#define WITH_NetBSD_HOST (NetBSD >= 199306)
|
||||
#if WITH_NetBSD_HOST /* here NetBSD as that is what we're emulating */
|
||||
#include <sys/syscall.h> /* FIXME - should not be including this one */
|
||||
|
@ -49,9 +64,6 @@ extern int getdirentries(int fd, char *buf, int nbytes, long *basep);
|
|||
extern int errno;
|
||||
#endif
|
||||
|
||||
#include "emul_generic.h"
|
||||
|
||||
|
||||
#ifndef STATIC_INLINE_EMUL_NETBSD
|
||||
#define STATIC_INLINE_EMUL_NETBSD STATIC_INLINE
|
||||
#endif
|
||||
|
|
|
@ -20,12 +20,21 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include "misc.h"
|
||||
#include "lf.h"
|
||||
#include "table.h"
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
|
|
273
sim/ppc/lf.c
Normal file
273
sim/ppc/lf.c
Normal file
|
@ -0,0 +1,273 @@
|
|||
/* This file is part of the program psim.
|
||||
|
||||
Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
|
||||
|
||||
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 2 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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "misc.h"
|
||||
#include "lf.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
struct _lf {
|
||||
FILE *stream;
|
||||
int line_nr; /* nr complete lines written, curr line is line_nr+1 */
|
||||
int indent;
|
||||
int line_blank;
|
||||
char *file_name;
|
||||
int number_lines;
|
||||
};
|
||||
|
||||
|
||||
lf *
|
||||
lf_open(char *name,
|
||||
char *real_name,
|
||||
int number_lines)
|
||||
{
|
||||
/* create a file object */
|
||||
lf *new_lf = ZALLOC(lf);
|
||||
ASSERT(new_lf != NULL);
|
||||
new_lf->number_lines = number_lines;
|
||||
new_lf->file_name = (real_name == NULL
|
||||
? name
|
||||
: real_name);
|
||||
|
||||
/* attach to stdout if pipe */
|
||||
if (!strcmp(name, "-")) {
|
||||
new_lf->stream = stdout;
|
||||
}
|
||||
else {
|
||||
/* create a new file */
|
||||
new_lf->stream = fopen(name, "w");
|
||||
ASSERT(new_lf->stream != NULL);
|
||||
}
|
||||
return new_lf;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_close(lf *file)
|
||||
{
|
||||
if (file->stream != stdout) {
|
||||
if (fclose(file->stream)) {
|
||||
perror("lf_close.fclose");
|
||||
exit(1);
|
||||
}
|
||||
free(file);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_putchr(lf *file,
|
||||
const char chr)
|
||||
{
|
||||
if (chr == '\n') {
|
||||
file->line_nr += 1;
|
||||
file->line_blank = 1;
|
||||
}
|
||||
else if (file->line_blank) {
|
||||
int pad;
|
||||
for (pad = file->indent; pad > 0; pad--)
|
||||
putc(' ', file->stream);
|
||||
file->line_blank = 0;
|
||||
}
|
||||
putc(chr, file->stream);
|
||||
}
|
||||
|
||||
void
|
||||
lf_indent_suppress(lf *file)
|
||||
{
|
||||
file->line_blank = 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_putstr(lf *file,
|
||||
const char *string)
|
||||
{
|
||||
const char *chp;
|
||||
if (string != NULL) {
|
||||
for (chp = string; *chp != '\0'; chp++) {
|
||||
lf_putchr(file, *chp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_lf_putunsigned(lf *file,
|
||||
unsigned u)
|
||||
{
|
||||
if (u > 0) {
|
||||
do_lf_putunsigned(file, u / 10);
|
||||
lf_putchr(file, (u % 10) + '0');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_putint(lf *file,
|
||||
int decimal)
|
||||
{
|
||||
if (decimal == 0)
|
||||
lf_putchr(file, '0');
|
||||
else if (decimal < 0) {
|
||||
lf_putchr(file, '-');
|
||||
do_lf_putunsigned(file, -decimal);
|
||||
}
|
||||
else if (decimal > 0) {
|
||||
do_lf_putunsigned(file, decimal);
|
||||
}
|
||||
else
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_printf(lf *file,
|
||||
const char *fmt,
|
||||
...)
|
||||
{
|
||||
char buf[1024];
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsprintf(buf, fmt, ap);
|
||||
/* FIXME - this is really stuffed but so is vsprintf() on a sun! */
|
||||
ASSERT(strlen(buf) > 0 && strlen(buf) < sizeof(buf));
|
||||
lf_putstr(file, buf);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_print_c_code(lf *file, char *code)
|
||||
{
|
||||
char *chp = code;
|
||||
int in_bit_field = 0;
|
||||
while (*chp != '\0') {
|
||||
if (*chp == '\t')
|
||||
chp++;
|
||||
if (*chp == '#')
|
||||
lf_indent_suppress(file);
|
||||
while (*chp != '\0' && *chp != '\n') {
|
||||
if (chp[0] == '{' && !isspace(chp[1])) {
|
||||
in_bit_field = 1;
|
||||
lf_putchr(file, '_');
|
||||
}
|
||||
else if (in_bit_field && chp[0] == ':') {
|
||||
lf_putchr(file, '_');
|
||||
}
|
||||
else if (in_bit_field && *chp == '}') {
|
||||
lf_putchr(file, '_');
|
||||
in_bit_field = 0;
|
||||
}
|
||||
else {
|
||||
lf_putchr(file, *chp);
|
||||
}
|
||||
chp++;
|
||||
}
|
||||
if (in_bit_field)
|
||||
error("bit field paren miss match some where\n");
|
||||
if (*chp == '\n') {
|
||||
lf_putchr(file, '\n');
|
||||
chp++;
|
||||
}
|
||||
}
|
||||
lf_putchr(file, '\n');
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_print_c_line_nr(lf *file,
|
||||
int line_nr,
|
||||
char *file_name)
|
||||
{
|
||||
if (file->number_lines) {
|
||||
lf_indent_suppress(file);
|
||||
lf_putstr(file, "#line ");
|
||||
lf_putint(file, line_nr);
|
||||
lf_putstr(file, " \"");
|
||||
lf_putstr(file, file_name);
|
||||
lf_putstr(file, "\"\n");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
lf_print_lf_c_line_nr(lf *file)
|
||||
{
|
||||
lf_print_c_line_nr(file, file->line_nr+2, file->file_name);
|
||||
/* line_nr == last_line, want to number from next */
|
||||
}
|
||||
|
||||
void
|
||||
lf_indent(lf *file, int delta)
|
||||
{
|
||||
file->indent += delta;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_print_copyleft(lf *file)
|
||||
{
|
||||
lf_putstr(file, "\
|
||||
/* This file is part of the program psim.
|
||||
|
||||
Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
|
||||
|
||||
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 2 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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
--
|
||||
|
||||
This file was generated by the program gen */
|
||||
");
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lf_print_binary(lf *file, int decimal, int width)
|
||||
{
|
||||
int bit;
|
||||
ASSERT(width > 0);
|
||||
|
||||
for (bit = 1 << (width-1); bit != 0; bit >>= 1) {
|
||||
if (decimal & bit)
|
||||
lf_putchr(file, '1');
|
||||
else
|
||||
lf_putchr(file, '0');
|
||||
}
|
||||
|
||||
}
|
|
@ -20,12 +20,22 @@
|
|||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "psim.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern char **environ;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
|
|
@ -26,12 +26,34 @@
|
|||
#define STATIC_INLINE_MON STATIC_INLINE
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "basics.h"
|
||||
#include "cpu.h"
|
||||
#include "mon.h"
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TIME_H
|
||||
#include <time.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TIMES_H
|
||||
#include <sys/times.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
|
||||
struct _cpu_mon {
|
||||
unsigned issue_count[nr_itable_entries];
|
||||
unsigned read_count;
|
||||
|
@ -149,11 +171,15 @@ mon_print_info(mon *monitor,
|
|||
int len_cpu;
|
||||
int len_num = 0;
|
||||
int len;
|
||||
long total_insns = 0;
|
||||
long cpu_insns_second;
|
||||
double cpu_time = 0.0;
|
||||
|
||||
for (cpu_nr = 0; cpu_nr < monitor->nr_cpus; cpu_nr++) {
|
||||
len = strlen (mon_add_commas(buffer,
|
||||
sizeof(buffer),
|
||||
mon_get_number_of_insns(&monitor->cpu_monitor[cpu_nr])));
|
||||
unsigned num_insns = mon_get_number_of_insns(&monitor->cpu_monitor[cpu_nr]);
|
||||
|
||||
total_insns += num_insns;
|
||||
len = strlen (mon_add_commas(buffer, sizeof(buffer), num_insns));
|
||||
if (len_num < len)
|
||||
len_num = len;
|
||||
}
|
||||
|
@ -161,10 +187,27 @@ mon_print_info(mon *monitor,
|
|||
sprintf (buffer, "%d", (int)monitor->nr_cpus + 1);
|
||||
len_cpu = strlen (buffer);
|
||||
|
||||
#ifdef HAVE_GETRUSAGE
|
||||
if (total_insns && verbose > 1)
|
||||
{
|
||||
struct rusage mytime;
|
||||
if (getrusage (RUSAGE_SELF, &mytime) == 0
|
||||
&& (mytime.ru_utime.tv_sec > 0 || mytime.ru_utime.tv_usec > 0)) {
|
||||
|
||||
cpu_time = (double)mytime.ru_utime.tv_sec + (((double)mytime.ru_utime.tv_usec) / 1000000.0);
|
||||
cpu_insns_second = (long)(((double)total_insns / cpu_time) + 0.5);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (cpu_nr = 0; cpu_nr < monitor->nr_cpus; cpu_nr++) {
|
||||
|
||||
if (verbose > 1) {
|
||||
itable_index index;
|
||||
|
||||
if (cpu_nr)
|
||||
printf_filtered ("\n");
|
||||
|
||||
for (index = 0; index < nr_itable_entries; index++) {
|
||||
if (monitor->cpu_monitor[cpu_nr].issue_count[index])
|
||||
printf_filtered("CPU #%*d executed %*s %s instruction%s.\n",
|
||||
|
@ -175,15 +218,36 @@ mon_print_info(mon *monitor,
|
|||
itable[index].name,
|
||||
(monitor->cpu_monitor[cpu_nr].issue_count[index] == 1) ? "" : "s");
|
||||
}
|
||||
|
||||
if (monitor->cpu_monitor[cpu_nr].read_count)
|
||||
printf_filtered ("CPU #%*d executed %*s data reads.\n",
|
||||
len_cpu, cpu_nr+1,
|
||||
len_num, mon_add_commas(buffer,
|
||||
sizeof(buffer),
|
||||
monitor->cpu_monitor[cpu_nr].read_count));
|
||||
|
||||
if (monitor->cpu_monitor[cpu_nr].write_count)
|
||||
printf_filtered ("CPU #%*d executed %*s data writes.\n",
|
||||
len_cpu, cpu_nr+1,
|
||||
len_num, mon_add_commas(buffer,
|
||||
sizeof(buffer),
|
||||
monitor->cpu_monitor[cpu_nr].write_count));
|
||||
}
|
||||
|
||||
printf_filtered("CPU #%d executed %s instructions in total.\n",
|
||||
cpu_nr+1,
|
||||
mon_add_commas(buffer,
|
||||
sizeof(buffer),
|
||||
mon_get_number_of_insns(&monitor->cpu_monitor[cpu_nr])));
|
||||
|
||||
printf_filtered("CPU #%*d executed %*s instructions in total.\n",
|
||||
len_cpu, cpu_nr+1,
|
||||
len_num, mon_add_commas(buffer,
|
||||
sizeof(buffer),
|
||||
mon_get_number_of_insns(&monitor->cpu_monitor[cpu_nr])));
|
||||
}
|
||||
|
||||
if (monitor->nr_cpus > 1)
|
||||
printf_filtered("\nAll CPUs executed %s instructions in total.\n",
|
||||
mon_add_commas(buffer, sizeof(buffer), total_insns));
|
||||
|
||||
if (cpu_insns_second)
|
||||
printf_filtered ("\nSimulator speed was %s instructions/second\n",
|
||||
mon_add_commas(buffer, sizeof(buffer), cpu_insns_second));
|
||||
}
|
||||
|
||||
#endif /* _MON_C_ */
|
||||
|
|
|
@ -24,22 +24,32 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "ppc-config.h"
|
||||
#include "inline.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifndef STATIC_INLINE_PSIM
|
||||
#define STATIC_INLINE_PSIM STATIC_INLINE
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#include "cpu.h" /* includes psim.h */
|
||||
#include "idecode.h"
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "bfd.h"
|
||||
|
||||
|
||||
|
|
150
sim/ppc/registers.c
Normal file
150
sim/ppc/registers.c
Normal file
|
@ -0,0 +1,150 @@
|
|||
/* This file is part of the program psim.
|
||||
|
||||
Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
|
||||
|
||||
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 2 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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _REGISTERS_C_
|
||||
#define _REGISTERS_C_
|
||||
|
||||
#ifndef STATIC_INLINE_REGISTERS
|
||||
#define STATIC_INLINE_REGISTERS STATIC_INLINE
|
||||
#endif
|
||||
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#include "basics.h"
|
||||
#include "registers.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
INLINE_REGISTERS void
|
||||
registers_dump(registers *registers)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
for (i = 0; i < 8; i++) {
|
||||
printf_filtered("GPR %2d:", i*4);
|
||||
for (j = 0; j < 4; j++) {
|
||||
printf_filtered(" 0x%08x", registers->gpr[i*4 + j]);
|
||||
}
|
||||
printf_filtered("\n");
|
||||
}
|
||||
}
|
||||
|
||||
STATIC_INLINE_REGISTERS sprs
|
||||
find_spr(const char name[])
|
||||
{
|
||||
sprs spr;
|
||||
for (spr = 0; spr < nr_of_sprs; spr++)
|
||||
if (spr_is_valid(spr)
|
||||
&& !strcmp(name, spr_name(spr))
|
||||
&& spr_index(spr) == spr)
|
||||
return spr;
|
||||
return nr_of_sprs;
|
||||
}
|
||||
|
||||
STATIC_INLINE_REGISTERS int
|
||||
are_digits(const char *digits)
|
||||
{
|
||||
while (isdigit(*digits))
|
||||
digits++;
|
||||
return *digits == '\0';
|
||||
}
|
||||
|
||||
|
||||
INLINE_REGISTERS register_descriptions
|
||||
register_description(const char reg[])
|
||||
{
|
||||
register_descriptions description;
|
||||
|
||||
/* try for a general-purpose integer or floating point register */
|
||||
if (reg[0] == 'r' && are_digits(reg + 1)) {
|
||||
description.type = reg_gpr;
|
||||
description.index = atoi(reg+1);
|
||||
description.size = sizeof(gpreg);
|
||||
}
|
||||
else if (reg[0] == 'f' && are_digits(reg + 1)) {
|
||||
description.type = reg_fpr;
|
||||
description.index = atoi(reg+1);
|
||||
description.size = sizeof(fpreg);
|
||||
}
|
||||
else if (!strcmp(reg, "pc") || !strcmp(reg, "nia")) {
|
||||
description.type = reg_pc;
|
||||
description.index = 0;
|
||||
description.size = sizeof(unsigned_word);
|
||||
}
|
||||
else if (!strcmp(reg, "sp")) {
|
||||
description.type = reg_gpr;
|
||||
description.index = 1;
|
||||
description.size = sizeof(gpreg);
|
||||
}
|
||||
else if (!strcmp(reg, "toc")) {
|
||||
description.type = reg_gpr;
|
||||
description.index = 2;
|
||||
description.size = sizeof(gpreg);
|
||||
}
|
||||
else if (!strcmp(reg, "cr") || !strcmp(reg, "cnd")) {
|
||||
description.type = reg_cr;
|
||||
description.index = 0;
|
||||
description.size = sizeof(creg); /* FIXME */
|
||||
}
|
||||
else if (!strcmp(reg, "msr") || !strcmp(reg, "ps")) {
|
||||
description.type = reg_msr;
|
||||
description.index = 0;
|
||||
description.size = sizeof(msreg);
|
||||
}
|
||||
else if (!strncmp(reg, "sr", 2) && are_digits(reg + 2)) {
|
||||
description.type = reg_sr;
|
||||
description.index = atoi(reg+2);
|
||||
description.size = sizeof(sreg);
|
||||
}
|
||||
else if (!strcmp(reg, "cnt")) {
|
||||
description.type = reg_spr;
|
||||
description.index = spr_ctr;
|
||||
description.size = sizeof(spreg);
|
||||
}
|
||||
else {
|
||||
sprs spr = find_spr(reg);
|
||||
if (spr != nr_of_sprs) {
|
||||
description.type = reg_spr;
|
||||
description.index = spr;
|
||||
description.size = sizeof(spreg);
|
||||
}
|
||||
else {
|
||||
description.type = reg_invalid;
|
||||
description.index = 0;
|
||||
description.size = 0;
|
||||
}
|
||||
}
|
||||
return description;
|
||||
}
|
||||
|
||||
#endif /* _REGISTERS_C_ */
|
|
@ -21,13 +21,23 @@
|
|||
|
||||
#include <signal.h> /* FIXME - should be machine dependant version */
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "basics.h"
|
||||
#include "psim.h"
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "../../gdb/defs.h"
|
||||
|
||||
#include "devices.h"
|
||||
|
|
|
@ -22,13 +22,27 @@
|
|||
* Imported declarations.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#include <string.h>
|
||||
#else
|
||||
#ifdef HAVE_STRINGS_H
|
||||
#include <strings.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/ptrace.h>
|
||||
|
|
220
sim/ppc/table.c
Normal file
220
sim/ppc/table.c
Normal file
|
@ -0,0 +1,220 @@
|
|||
/* This file is part of the program psim.
|
||||
|
||||
Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
|
||||
|
||||
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 2 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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "misc.h"
|
||||
#include "lf.h"
|
||||
#include "table.h"
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
struct _table {
|
||||
size_t size;
|
||||
char *buffer;
|
||||
char *pos;
|
||||
int line_nr;
|
||||
int nr_fields;
|
||||
char *file_name;
|
||||
};
|
||||
|
||||
extern table *
|
||||
table_open(char *file_name,
|
||||
int nr_fields)
|
||||
{
|
||||
int fd;
|
||||
struct stat stat_buf;
|
||||
table *file;
|
||||
|
||||
/* create a file descriptor */
|
||||
file = ZALLOC(table);
|
||||
ASSERT(file != NULL);
|
||||
file->nr_fields = nr_fields;
|
||||
|
||||
/* save the file name */
|
||||
file->file_name = (char*)zalloc(strlen(file_name) + 1);
|
||||
ASSERT(file->file_name != NULL);
|
||||
strcpy(file->file_name, file_name);
|
||||
|
||||
/* open the file */
|
||||
fd = open(file->file_name, O_RDONLY, 0);
|
||||
ASSERT(fd >= 0);
|
||||
|
||||
/* determine the size */
|
||||
if (fstat(fd, &stat_buf) < 0) {
|
||||
perror("table_open.fstat");
|
||||
exit(1);
|
||||
}
|
||||
file->size = stat_buf.st_size;
|
||||
|
||||
/* allocate this much memory */
|
||||
file->buffer = (char*)zalloc(file->size+1);
|
||||
if(file->buffer == NULL) {
|
||||
perror("table_open.calloc.file->size+1");
|
||||
exit(1);
|
||||
}
|
||||
file->pos = file->buffer;
|
||||
|
||||
/* read it in */
|
||||
if (read(fd, file->buffer, file->size) < file->size) {
|
||||
perror("table_open.read");
|
||||
exit(1);
|
||||
}
|
||||
file->buffer[file->size] = '\0';
|
||||
|
||||
/* done */
|
||||
close(fd);
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
extern table_entry *
|
||||
table_entry_read(table *file)
|
||||
{
|
||||
int field;
|
||||
table_entry *entry;
|
||||
|
||||
/* skip comments/blanks */
|
||||
while(1) {
|
||||
/* leading white space */
|
||||
while (*file->pos != '\0'
|
||||
&& *file->pos != '\n'
|
||||
&& isspace(*file->pos))
|
||||
file->pos++;
|
||||
/* comment */
|
||||
if (*file->pos == '#') {
|
||||
do {
|
||||
file->pos++;
|
||||
} while (*file->pos != '\0' && *file->pos != '\n');
|
||||
}
|
||||
/* end of line? */
|
||||
if (*file->pos == '\n') {
|
||||
file->pos++;
|
||||
file->line_nr++;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (*file->pos == '\0')
|
||||
return NULL;
|
||||
|
||||
/* create this new entry */
|
||||
entry = (table_entry*)zalloc(sizeof(table_entry)
|
||||
+ (file->nr_fields + 1) * sizeof(char*));
|
||||
ASSERT(entry != NULL);
|
||||
entry->file_name = file->file_name;
|
||||
entry->nr_fields = file->nr_fields;
|
||||
|
||||
/* break the line into its colon delimitered fields */
|
||||
for (field = 0; field < file->nr_fields-1; field++) {
|
||||
entry->fields[field] = file->pos;
|
||||
while(*file->pos && *file->pos != ':' && *file->pos != '\n')
|
||||
file->pos++;
|
||||
if (*file->pos == ':') {
|
||||
*file->pos = '\0';
|
||||
file->pos++;
|
||||
}
|
||||
}
|
||||
|
||||
/* any trailing stuff not the last field */
|
||||
ASSERT(field == file->nr_fields-1);
|
||||
entry->fields[field] = file->pos;
|
||||
while (*file->pos && *file->pos != '\n') {
|
||||
file->pos++;
|
||||
}
|
||||
if (*file->pos == '\n') {
|
||||
*file->pos = '\0';
|
||||
file->pos++;
|
||||
}
|
||||
file->line_nr++;
|
||||
entry->line_nr = file->line_nr;
|
||||
|
||||
/* if following lines tab indented, put in the annex */
|
||||
if (*file->pos == '\t') {
|
||||
entry->annex = file->pos;
|
||||
do {
|
||||
do {
|
||||
file->pos++;
|
||||
} while (*file->pos != '\0' && *file->pos != '\n');
|
||||
if (*file->pos == '\n') {
|
||||
file->pos++;
|
||||
file->line_nr++;
|
||||
}
|
||||
} while (*file->pos != '\0' && *file->pos == '\t');
|
||||
if (file->pos[-1] == '\n')
|
||||
file->pos[-1] = '\0';
|
||||
}
|
||||
else
|
||||
entry->annex = NULL;
|
||||
|
||||
/* return it */
|
||||
return entry;
|
||||
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
dump_table_entry(table_entry *entry,
|
||||
int indent)
|
||||
{
|
||||
printf("(table_entry*)%p\n", entry);
|
||||
|
||||
if (entry != NULL) {
|
||||
int field;
|
||||
char sep;
|
||||
|
||||
sep = ' ';
|
||||
dumpf(indent, "(fields");
|
||||
for (field = 0; field < entry->nr_fields; field++) {
|
||||
printf("%c%s", sep, entry->fields[field]);
|
||||
sep = ':';
|
||||
}
|
||||
printf(")\n");
|
||||
|
||||
dumpf(indent, "(line_nr %d)\n", entry->line_nr);
|
||||
|
||||
dumpf(indent, "(file_name %s)\n", entry->file_name);
|
||||
|
||||
dumpf(indent, "(annex\n%s\n", entry->annex);
|
||||
dumpf(indent, " )\n");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extern void
|
||||
table_entry_lf_c_line_nr(lf *file,
|
||||
table_entry *entry)
|
||||
{
|
||||
lf_print_c_line_nr(file, entry->line_nr, entry->file_name);
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Reference in a new issue