aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/common/ChangeLog6
-rw-r--r--sim/common/cgen-utils.c142
-rw-r--r--sim/common/genmloop.sh97
3 files changed, 124 insertions, 121 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index 094acb9..cb96fda 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -7,6 +7,12 @@ Tue Feb 24 22:45:39 1998 Doug Evans <devans@seba.cygnus.com>
* sim-core.h (sim_core_map_to_str): Declare.
* sim-core.c (sim_core_map_to_str): Make non-static.
+ * genmloop.sh (engine_resume): Update insn_count before exiting.
+ (engine_resume_full): Keep accurate core profile data.
+
+ * cgen-utils.c (sim_disassemble_insn): Don't use
+ sim_core_read_aligned_N, it messes up profiling results.
+
Mon Feb 23 20:45:57 1998 Mark Alexander <marka@cygnus.com>
* nltvals.def: Regenerate with MN10300 additions.
diff --git a/sim/common/cgen-utils.c b/sim/common/cgen-utils.c
index 6aa9107..c7919d5 100644
--- a/sim/common/cgen-utils.c
+++ b/sim/common/cgen-utils.c
@@ -1,5 +1,5 @@
/* Support code for various pieces of CGEN simulators.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Cygnus Support.
This file is part of GDB, the GNU debugger.
@@ -19,16 +19,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "sim-main.h"
-#include <signal.h>
#include "dis-asm.h"
#include "cpu-opc.h"
-#include "decode.h"
#define MEMOPS_DEFINE_INLINE
-#include "mem-ops.h"
+#include "cgen-mem.h"
#define SEMOPS_DEFINE_INLINE
-#include "sem-ops.h"
+#include "cgen-ops.h"
const char *mode_names[] = {
"VM",
@@ -80,106 +78,6 @@ cgen_init (SIM_DESC sd)
STATE_RUN_FAST_P (sd) = run_fast_p;
}
-void
-engine_halt (cpu, reason, sigrc)
- sim_cpu *cpu;
- enum exec_state reason;
- int sigrc;
-{
- CPU_EXEC_STATE (cpu) = reason;
- CPU_HALT_SIGRC (cpu) = sigrc;
-
- longjmp (STATE_HALT_JMP_BUF (CPU_STATE (cpu)), 1);
-}
-
-void
-engine_signal (cpu, sig)
- sim_cpu *cpu;
- enum sim_signal_type sig;
-{
- engine_halt (cpu, EXEC_STATE_STOPPED, sig);
-}
-
-/* Convert SIM_SIGFOO to SIGFOO. */
-
-int
-sim_signal_to_host (sig)
- int sig;
-{
- switch (sig)
- {
- case SIM_SIGILL :
-#ifdef SIGILL
- return SIGILL;
-#endif
- break;
-
- case SIM_SIGTRAP :
-#ifdef SIGTRAP
- return SIGTRAP;
-#else
-#ifdef _MSC_VER
- /* Wingdb uses this value. */
- return 5;
-#endif
-#endif
- break;
-
- case SIM_SIGALIGN :
- case SIM_SIGACCESS :
-#ifdef SIGSEGV
- return SIGSEGV;
-#endif
- break;
-
- case SIM_SIGXCPU :
-#ifdef SIGXCPU
- return SIGXCPU;
-#endif
- break;
- }
- return 1;
-}
-
-/* FIXME: Add "no return" attribute to illegal insn handlers.
- They all call longjmp. */
-/* FIXME: May wish to call a target supplied routine which can then call
- sim_halt if it wants: to allow target to gain control for moment. */
-
-void
-ex_illegal (SIM_CPU *cpu, PCADDR pc, insn_t insn, ARGBUF *abuf)
-{
- abuf->length = CGEN_BASE_INSN_SIZE;
- abuf->addr = pc;
- /* Leave signalling to semantic fn. */
-}
-
-void
-exc_illegal (SIM_CPU *cpu, PCADDR pc, insn_t insn, ARGBUF *abuf)
-{
- abuf->length = CGEN_BASE_INSN_SIZE;
- abuf->addr = pc;
- /* Leave signalling to semantic fn. */
-}
-
-PCADDR
-sem_illegal (current_cpu, sem_arg)
- SIM_CPU *current_cpu;
- struct argbuf *sem_arg;
-{
- engine_halt (current_cpu, EXEC_STATE_SIGNALLED, SIM_SIGILL);
- return 0;
-}
-
-PCADDR
-semc_illegal (current_cpu, sem_arg)
- SIM_CPU *current_cpu;
- struct scache *sem_arg;
-{
- engine_halt (current_cpu, EXEC_STATE_SIGNALLED, SIM_SIGILL);
- return 0;
-}
-
/* Disassembly support.
??? While executing an instruction, the insn has been decoded and all its
fields have been extracted. It is certainly possible to do the disassembly
@@ -219,12 +117,16 @@ void
sim_disassemble_insn (SIM_CPU *cpu, const struct cgen_insn *insn,
const struct argbuf *abuf, PCADDR pc, char *buf)
{
- int length;
+ unsigned int length;
unsigned long insn_value;
struct disassemble_info disasm_info;
struct cgen_fields fields;
SFILE sfile;
- char insn_buf[20];
+ union {
+ unsigned8 bytes[16];
+ unsigned16 shorts[8];
+ unsigned32 words[4];
+ } insn_buf;
SIM_DESC sd = CPU_STATE (cpu);
sfile.buffer = sfile.current = buf;
@@ -235,23 +137,23 @@ sim_disassemble_insn (SIM_CPU *cpu, const struct cgen_insn *insn,
: bfd_little_endian (STATE_PROG_BFD (sd)) ? BFD_ENDIAN_LITTLE
: BFD_ENDIAN_UNKNOWN);
- switch (abuf->length)
+ length = sim_core_read_buffer (sd, cpu, sim_core_read_map, &insn_buf, pc,
+ CGEN_INSN_BITSIZE (insn) / 8);
+
+ switch (length)
{
- case 1 :
- insn_value = sim_core_read_1 (CPU_STATE (cpu), sim_core_read_map, pc, NULL, NULL_CIA);
- break;
- case 2 :
- insn_value = sim_core_read_2 (CPU_STATE (cpu), sim_core_read_map, pc, NULL, NULL_CIA);
- break;
- case 4 :
- insn_value = sim_core_read_4 (CPU_STATE (cpu), sim_core_read_map, pc, NULL, NULL_CIA);
- break;
- default:
- abort ();
+ case 1 : insn_value = insn_buf.bytes[0]; break;
+ case 2 : insn_value = T2H_2 (insn_buf.shorts[0]); break;
+ case 4 : insn_value = T2H_4 (insn_buf.words[0]); break;
+ default: abort ();
}
length = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, insn_value, &fields);
- if (length != abuf->length)
+ /* Result of extract fn is in bits. */
+ /* ??? This assumes that each instruction has a fixed length (and thus
+ for insns with multiple versions of variable lengths they would each
+ have their own table entry). */
+ if (length == CGEN_INSN_BITSIZE (insn))
{
(*CGEN_PRINT_FN (insn)) (&disasm_info, insn, &fields, pc, length);
}
diff --git a/sim/common/genmloop.sh b/sim/common/genmloop.sh
index 31716d1..e2a283c 100644
--- a/sim/common/genmloop.sh
+++ b/sim/common/genmloop.sh
@@ -48,7 +48,7 @@ cat <<EOF
/* This file is is generated by the genmloop script. DO NOT EDIT! */
/* Main loop for CGEN-based simulators.
- Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Cygnus Support.
This file is part of the GNU simulators.
@@ -188,12 +188,16 @@ engine_resume (SIM_DESC sd, int step, int siggnal)
engine->jmpbuf = &buf;
if (setjmp (buf))
{
+ /* Account for the last insn executed. */
+ ++insn_count;
+
engine->jmpbuf = NULL;
TRACE_INSN_FINI ((sim_cpu *) cpu);
PROFILE_EXEC_TIME (CPU_PROFILE_DATA (cpu))
+= sim_elapsed_time_since (start_time);
PROFILE_TOTAL_INSN_COUNT (CPU_PROFILE_DATA (cpu))
+= insn_count;
+
return;
}
@@ -232,6 +236,8 @@ cat <<EOF
EOF
+##########################################################################
+
if [ x$scache = xyes ] ; then
cat <<EOF
@@ -247,8 +253,28 @@ ${parallel+ int icount = 0;}
EOF
# Any initialization code before looping starts.
+# Note that this code may declare some locals.
${SHELL} $file init
+if [ x$parallel = xyes ] ; then
+cat << EOF
+
+#if defined (HAVE_PARALLEL_EXEC) && defined (__GNUC__)
+ {
+ static read_init_p = 0;
+ if (! read_init_p)
+ {
+/* ??? Later maybe paste read.c in when building mainloop.c. */
+#define DEFINE_LABELS
+#include "readx.c"
+ read_init_p = 1;
+ }
+ }
+#endif
+
+EOF
+fi
+
cat <<EOF
do
@@ -285,6 +311,9 @@ cat <<EOF
else
{
PROFILE_COUNT_SCACHE_HIT (current_cpu);
+ /* Make core access statistics come out right.
+ The size is a guess, but it's currently not used either. */
+ PROFILE_COUNT_CORE (current_cpu, pc, 2, sim_core_execute_map);
}
/* begin full-exec-scache */
@@ -305,6 +334,8 @@ cat <<EOF
}
EOF
+##########################################################################
+
else # ! WITH_SCACHE
cat <<EOF
@@ -321,8 +352,28 @@ ${parallel+ int icount = 0;}
EOF
# Any initialization code before looping starts.
+# Note that this code may declare some locals.
${SHELL} $file init
+if [ x$parallel = xyes ] ; then
+cat << EOF
+
+#if defined (HAVE_PARALLEL_EXEC) && defined (__GNUC__)
+ {
+ static read_init_p = 0;
+ if (! read_init_p)
+ {
+/* ??? Later maybe paste read.c in when building mainloop.c. */
+#define DEFINE_LABELS
+#include "readx.c"
+ read_init_p = 1;
+ }
+ }
+#endif
+
+EOF
+fi
+
cat <<EOF
do
@@ -354,6 +405,8 @@ cat <<EOF
EOF
fi # ! WITH_SCACHE
+##########################################################################
+
if [ x$fast = xyes ] ; then
if [ x$scache = xyes ] ; then
cat <<EOF
@@ -369,8 +422,28 @@ ${parallel+ int icount = 0;}
EOF
# Any initialization code before looping starts.
+# Note that this code may declare some locals.
${SHELL} $file init
+if [ x$parallel = xyes ] ; then
+cat << EOF
+
+#if defined (HAVE_PARALLEL_EXEC) && defined (__GNUC__)
+ {
+ static read_init_p = 0;
+ if (! read_init_p)
+ {
+/* ??? Later maybe paste read.c in when building mainloop.c. */
+#define DEFINE_LABELS
+#include "readx.c"
+ read_init_p = 1;
+ }
+ }
+#endif
+
+EOF
+fi
+
cat <<EOF
#if defined (WITH_SEM_SWITCH_FAST) && defined (__GNUC__)
@@ -430,6 +503,8 @@ cat <<EOF
EOF
+##########################################################################
+
else # ! WITH_SCACHE
cat <<EOF
@@ -446,8 +521,28 @@ ${parallel+ int icount = 0;}
EOF
# Any initialization code before looping starts.
+# Note that this code may declare some locals.
${SHELL} $file init
+if [ x$parallel = xyes ] ; then
+cat << EOF
+
+#if defined (HAVE_PARALLEL_EXEC) && defined (__GNUC__)
+ {
+ static read_init_p = 0;
+ if (! read_init_p)
+ {
+/* ??? Later maybe paste read.c in when building mainloop.c. */
+#define DEFINE_LABELS
+#include "readx.c"
+ read_init_p = 1;
+ }
+ }
+#endif
+
+EOF
+fi
+
cat <<EOF
do