import gdb-1999-10-11 snapshot
This commit is contained in:
parent
50a6e31f58
commit
2df3850c7b
68 changed files with 14667 additions and 511 deletions
193
gdb/ChangeLog
193
gdb/ChangeLog
|
@ -1,3 +1,195 @@
|
||||||
|
1999-10-11 Jim Blandy <jimb@zwingli.cygnus.com>
|
||||||
|
|
||||||
|
* config/pa/tm-hppa.h (SYMBOLS_CAN_START_WITH_DOLLAR): It's not
|
||||||
|
enough to #define this; you have to give it a non-zero value.
|
||||||
|
|
||||||
|
1999-10-11 Jim Blandy <jimb@zenia.red-bean.com>
|
||||||
|
|
||||||
|
Fix from Jim Kingdon <kingdon@redhat.com>, with tweaks to make it
|
||||||
|
gdbarch- and bigendian-friendly:
|
||||||
|
* valops.c (PARM_BOUNDARY): If not #defined, default to zero.
|
||||||
|
(value_push): If PARM_BOUNDARY is not zero, align arguments to
|
||||||
|
that boundary.
|
||||||
|
* config/i386/tm-i386.h: Define PARM_BOUNDARY.
|
||||||
|
|
||||||
|
Mon Oct 11 14:23:55 1999 Fred Fish <fnf@cygnus.com>
|
||||||
|
|
||||||
|
* config/mips/tm-irix3.h (PS_REGNUM): Don't undef if we aren't
|
||||||
|
going to redefine it to something else.
|
||||||
|
|
||||||
|
1999-10-11 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* dwarfread.c (read_func_scope): Don't try to set main_func_*;
|
||||||
|
we handle that in blockframe.c:inside_main_func.
|
||||||
|
* dwarf2read.c (read_func_scope): Likewise.
|
||||||
|
(dwarf2_add_field, dwarf2_add_member_fn): Get member function name
|
||||||
|
directly, not from mangled name.
|
||||||
|
(skip_member_fn_name): Lose.
|
||||||
|
|
||||||
|
Mon Oct 11 12:24:52 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* serial.h (enum serial_rc): Clarify SERIAL_TIMEOUT and
|
||||||
|
restrictions on TIMEOUT in ASYNC mode.
|
||||||
|
|
||||||
|
* serial.c (serial_readchar): Check for invalid timeout when in
|
||||||
|
async mode. Disable test.
|
||||||
|
|
||||||
|
Thu Oct 7 17:20:01 1999 Andrew Cagney <cagney@amy.cygnus.com>
|
||||||
|
|
||||||
|
* monitor.c (monitor_printable_string): Add length argument. Don't
|
||||||
|
return final string length.
|
||||||
|
(monitor_printf_noecho, monitor_printf, monitor_expect): Update.
|
||||||
|
(monitor_error): Pass real_len to monitor_printable_string.
|
||||||
|
(monitor_error): Rewrite. Replace printf fmt string parameter with
|
||||||
|
function name and message parameters.
|
||||||
|
(monitor_read_memory_single, monitor_read_memory): Update.
|
||||||
|
|
||||||
|
1999-10-07 Stan Shebs <shebs@andros.cygnus.com>
|
||||||
|
|
||||||
|
* main.c (print_gdb_help): Fix bug reporting address.
|
||||||
|
* gnu-regex.h, gnu-regex.c: Ditto.
|
||||||
|
|
||||||
|
1999-10-07 Jim Blandy <jimb@zwingli.cygnus.com>
|
||||||
|
|
||||||
|
* parse.c (SYMBOLS_CAN_START_WITH_DOLLAR): New macro,
|
||||||
|
whose value can be overridden by target files.
|
||||||
|
(write_dollar_variable): Don't check the symbol table for
|
||||||
|
identifiers beginning with `$' unless
|
||||||
|
SYMBOLS_CAN_START_WITH_DOLLAR is non-zero.
|
||||||
|
* config/pa/tm-hppa.h (SYMBOLS_CAN_START_WITH_DOLLAR): Define.
|
||||||
|
* doc/gdbint.texinfo (SYMBOLS_CAN_START_WITH_DOLLAR): Document.
|
||||||
|
|
||||||
|
Remove all traces of the BINOP_SCOPE operator. It's never
|
||||||
|
generated, and not implemented.
|
||||||
|
* expression.h (enum exp_opcode): Delete BINOP_SCOPE.
|
||||||
|
* c-lang.c (c_op_print_tab): Delete entry for BINOP_SCOPE.
|
||||||
|
* eval.c (evaluate_subexp_standard): Doc fix.
|
||||||
|
* expprint.c (op_name): Remove case for BINOP_SCOPE.
|
||||||
|
(dump_subexp): Same.
|
||||||
|
|
||||||
|
* dwarf2read.c (dwarf2_const_value): Treat DW_FORM_data1,
|
||||||
|
DW_FORM_data2, DW_FORM_data4, and DW_FORM_data8 as signed values,
|
||||||
|
since that's what read_var_value will do anyway.
|
||||||
|
|
||||||
|
1999-10-07 Fred Fish <fnf@cygnus.com>
|
||||||
|
|
||||||
|
* objfiles.h (struct objfile): Delete is_solib member, now handled
|
||||||
|
by OBJF_SHARED bit in struct objfile's flags.
|
||||||
|
* objfiles.c (objfile_purge_solibs): Check OBJF_SHARED bit in flags
|
||||||
|
instead of old is_solib int member in objfile struct.
|
||||||
|
|
||||||
|
* objfiles.c (allocate_objfile): Remove is_solib arg. Now passed
|
||||||
|
as a bit in combined flags arg.
|
||||||
|
* symfile.c (symbol_file_add): Ditto.
|
||||||
|
* objfiles.h (allocate_objfile): Adjust prototype after removal
|
||||||
|
of is_solib arg.
|
||||||
|
* symtab.h (symbol_file_add): Ditto.
|
||||||
|
|
||||||
|
* cxux-nat.c (add_shared_symbol_files): Remove zero passed to
|
||||||
|
symbol_file_add in old is_solib arg, defaults to zero now in
|
||||||
|
flags.
|
||||||
|
* irix5-nat.c (symbol_add_stub): Ditto.
|
||||||
|
* remote-mm.c (mm_load): Ditto.
|
||||||
|
* remote-udi.c (udi_load): Ditto.
|
||||||
|
* remote-vx.c (vx_add_symbols): Ditto.
|
||||||
|
* symfile.c (symbol_file_command): Ditto.
|
||||||
|
(add_symbol_file_command): Ditto.
|
||||||
|
|
||||||
|
* coff-solib.c (coff_solib_add): Call symbol_file_add with
|
||||||
|
OBJF_SHARED in flags bit, rather than 1 in old is_solib
|
||||||
|
arg.
|
||||||
|
* osfsolib.c (symbol_add_stub): Ditto.
|
||||||
|
* pa64solib.c (pa64_solib_add_solib_objfile): Ditto.
|
||||||
|
* solib.c (symbol_add_stub): Ditto.
|
||||||
|
* somsolib.c (som_solib_add_solib_objfile): Ditto.
|
||||||
|
* win32-nat.c (handle_load_dll): Ditto.
|
||||||
|
|
||||||
|
* objfiles.c (allocate_objfile): Remove old args "mapped" and
|
||||||
|
"user_loaded". Replaced with new arg "flags" containing specific
|
||||||
|
If global var mapped_symbol_files is nonzero
|
||||||
|
then set OBJF_MAPPED in flags arg. Check for OBJF_MAPPED bit in
|
||||||
|
flags where we used to check mapped arg.
|
||||||
|
Pass flags to open_mapped_file instead of mapped arg.
|
||||||
|
Ensure that OBJF_MAPPED bit is reset in flags when the objfile
|
||||||
|
is not mapped. Add passed flags bits to objfile's flags bits.
|
||||||
|
(open_mapped_file): Replace "mapped" arg with new "flags" arg.
|
||||||
|
Adjust prototype. Pass flags to open_existing_mapped_file.
|
||||||
|
(open_existing_mapped_file): Replace "mapped" arg with new "flags".
|
||||||
|
Check flags for OBJF_MAPPED.
|
||||||
|
* objfiles.h (allocate_objfile): Adjust prototype.
|
||||||
|
* rs6000-nat.c (add_vmap): Pass zero for combined flags, rather
|
||||||
|
than separate zero ints for old "mapped" and "user_loaded" flags.
|
||||||
|
* symfile.c (symbol_file_add): Pass allocate_objfile combined flags
|
||||||
|
rather than individual mapped and user loaded bits.
|
||||||
|
|
||||||
|
* symfile.c (symbol_file_add): Delete user_loaded arg.
|
||||||
|
* symtab.h (symbol_file_add): Adjust prototype for deleted
|
||||||
|
user_loaded arg.
|
||||||
|
* objfiles.h (struct objfile): Delete user_loaded member.
|
||||||
|
(OBJF_USERLOADED): New flag bit to replace user_loaded.
|
||||||
|
|
||||||
|
* symfile.c (symbol_file_command): Add OBJF_USER_LOADED to flags
|
||||||
|
passed to symbol_file_add. Delete previous passing of explicit 1
|
||||||
|
for user_loaded.
|
||||||
|
(add_symbol_file_command): Ditto.
|
||||||
|
|
||||||
|
* coff-solib.c (coff_solib_add): No longer pass zero for user loaded,
|
||||||
|
now defaults to zero in flags.
|
||||||
|
* cxux-nat.c (add_shared_symbol_files): Ditto.
|
||||||
|
* irix5-nat.c (symbol_add_stub): Ditto.
|
||||||
|
* osfsolib.c (symbol_add_stub): Ditto.
|
||||||
|
* remote-mm.c (mm_load): Ditto.
|
||||||
|
* pa64solib.c (pa64_solib_add_solib_objfile): Ditto.
|
||||||
|
* remote-udi.c (udi_load): Ditto.
|
||||||
|
* remote-vx.c (vx_add_symbols): Ditto.
|
||||||
|
* solib.c (symbol_add_stub): Ditto.
|
||||||
|
* somsolib.c (som_solib_add_solib_objfile): Ditto.
|
||||||
|
* win32-nat.c (handle_load_dll): Ditto.
|
||||||
|
|
||||||
|
Thu Oct 7 19:24:05 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (monitor.o): Allow monitor.o to be compiled with
|
||||||
|
-Werror.
|
||||||
|
|
||||||
|
* monitor.c (monitor_debug_p): New variable. Replaces macro.
|
||||||
|
(EXTRA_RDEBUG): Delete. Update all uses.
|
||||||
|
(monitor_debug): New function. Replaces macro.
|
||||||
|
(RDEBUG): Delete macro. Update all uses.
|
||||||
|
debug output to gdb_stdlog and not the console.
|
||||||
|
|
||||||
|
* monitor.c: Fix printf formating. Replace printf calls with
|
||||||
|
fprintf_unfiltered.
|
||||||
|
|
||||||
|
1999-10-06 Stan Shebs <shebs@andros.cygnus.com>
|
||||||
|
|
||||||
|
* MAINTAINERS: Switch ARM target maintenance from Elena
|
||||||
|
Zannoni to Jim Ingham.
|
||||||
|
|
||||||
|
1999-10-06 Frank Ch. Eigler <fche@cygnus.com>
|
||||||
|
|
||||||
|
* remote.c (hexnumnstr): New function. Allow setting of width.
|
||||||
|
(hexnumstr): Call the above.
|
||||||
|
(remote_write_bytes): Fill in X-protocol address field more
|
||||||
|
reliably.
|
||||||
|
|
||||||
|
1999-10-06 Fred Fish <fnf@cygnus.com>
|
||||||
|
|
||||||
|
* xcoffread.c (xcoff_symfile_offsets): Fix typo, addr->addrs.
|
||||||
|
|
||||||
|
1999-10-06 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* remote.c (handle_remote_sigint_twice): Make this signal be
|
||||||
|
handled by inferior_event_handler, via the wrapper function.
|
||||||
|
(async_remote_interrupt_twice): Make not static. Add debug print.
|
||||||
|
* remote.h (async_remote_interrupt_twice): Export for use in
|
||||||
|
inf-loop.c.
|
||||||
|
|
||||||
|
* inf-loop.c (inferior_event_handler_wrapper): New function.
|
||||||
|
(inferior_event_handler): Handle a request to quit and kill the
|
||||||
|
target.
|
||||||
|
Include remote.h.
|
||||||
|
* inf-loop.h (inferior_event_handler_wrapper): Export.
|
||||||
|
|
||||||
1999-10-04 James Ingham <jingham@leda.cygnus.com>
|
1999-10-04 James Ingham <jingham@leda.cygnus.com>
|
||||||
|
|
||||||
* remote-rdi.c (arm_rdi_open): If the angel_RDI_Open fails, close
|
* remote-rdi.c (arm_rdi_open): If the angel_RDI_Open fails, close
|
||||||
|
@ -300,7 +492,6 @@ Wed Sep 29 21:27:16 1999 Jeffrey A Law (law@cygnus.com)
|
||||||
* remote-sim.c (gdbsim_create_inferior): Ditto.
|
* remote-sim.c (gdbsim_create_inferior): Ditto.
|
||||||
* target.c (target_link): Ditto.
|
* target.c (target_link): Ditto.
|
||||||
* win32-nat.c (child_create_inferior): Ditto.
|
* win32-nat.c (child_create_inferior): Ditto.
|
||||||
* varobj.c (varobj_create, new_root_variable): Ditto.
|
|
||||||
|
|
||||||
Thu Sep 30 10:36:19 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
Thu Sep 30 10:36:19 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ djgpp native DJ Delorie dj@cygnus.com
|
||||||
win32 host & native Chris Faylor cgf@cygnus.com
|
win32 host & native Chris Faylor cgf@cygnus.com
|
||||||
main (main.c, top.c) Elena Zannoni ezannoni@cygnus.com
|
main (main.c, top.c) Elena Zannoni ezannoni@cygnus.com
|
||||||
readline Elena Zannoni ezannoni@cygnus.com
|
readline Elena Zannoni ezannoni@cygnus.com
|
||||||
arm target Elena Zannoni ezannoni@cygnus.com
|
|
||||||
powerpc target Elena Zannoni ezannoni@cygnus.com
|
powerpc target Elena Zannoni ezannoni@cygnus.com
|
||||||
command interpreter Fernando Nasser fnasser@cygnus.com
|
command interpreter Fernando Nasser fnasser@cygnus.com
|
||||||
generic symtabs Jim Blandy jimb@cygnus.com
|
generic symtabs Jim Blandy jimb@cygnus.com
|
||||||
|
@ -20,6 +19,7 @@ stabs reader Jim Blandy jimb@cygnus.com
|
||||||
x86 linux native Jim Blandy jimb@cygnus.com
|
x86 linux native Jim Blandy jimb@cygnus.com
|
||||||
Scheme support Jim Blandy jimb@cygnus.com
|
Scheme support Jim Blandy jimb@cygnus.com
|
||||||
svr4 shlibs (solib.c) Jim Blandy jimb@cygnus.com
|
svr4 shlibs (solib.c) Jim Blandy jimb@cygnus.com
|
||||||
|
arm target Jim Ingham jingham@cygnus.com
|
||||||
hurd native Mark Kettenis kettenis@wins.va.nl
|
hurd native Mark Kettenis kettenis@wins.va.nl
|
||||||
hpux, hp pa native Jeff Law law@cygnus.com
|
hpux, hp pa native Jeff Law law@cygnus.com
|
||||||
m32r target Michael Snyder msnyder@cygnus.com
|
m32r target Michael Snyder msnyder@cygnus.com
|
||||||
|
|
|
@ -229,7 +229,7 @@ CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE) \
|
||||||
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
||||||
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
||||||
|
|
||||||
VERSION = 19991004
|
VERSION = 19991011
|
||||||
DIST=gdb
|
DIST=gdb
|
||||||
|
|
||||||
LINT=/usr/5bin/lint
|
LINT=/usr/5bin/lint
|
||||||
|
@ -1336,14 +1336,8 @@ mipsread.o: mipsread.c buildsym.h complaints.h $(bfd_h) $(defs_h) \
|
||||||
|
|
||||||
mipsv4-nat.o: mipsv4-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) target.h
|
mipsv4-nat.o: mipsv4-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) target.h
|
||||||
|
|
||||||
# FIXME: Monitor.c has -Wformat problems. The code using the macros
|
|
||||||
# RDEBUG and EXTRA_RDEBUG needs be replaced with something that:
|
|
||||||
# doesn't cause -Wformat errors; sends all output to gdb_stdlog
|
|
||||||
# instead of stdout; and controls the output throug a ``set
|
|
||||||
# monitordebug'' command/variable. cagney, 1999-09-01.
|
|
||||||
monitor.o: monitor.c monitor.h $(bfd_h) $(wait_h) $(defs_h) $(gdbcmd_h) \
|
monitor.o: monitor.c monitor.h $(bfd_h) $(wait_h) $(defs_h) $(gdbcmd_h) \
|
||||||
$(inferior_h) target.h serial.h terminal.h gdb_string.h
|
$(inferior_h) target.h serial.h terminal.h gdb_string.h
|
||||||
$(CC) -c $(INTERNAL_WARN_CFLAGS) $(NO_WERROR_CFLAGS) $<
|
|
||||||
|
|
||||||
news-xdep.o: news-xdep.c
|
news-xdep.o: news-xdep.c
|
||||||
|
|
||||||
|
|
|
@ -389,8 +389,6 @@ const struct op_print c_op_print_tab[] =
|
||||||
{"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
|
{"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
|
||||||
{"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
|
{"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
|
||||||
{"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
|
{"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
|
||||||
/* C++ */
|
|
||||||
{"::", BINOP_SCOPE, PREC_PREFIX, 0},
|
|
||||||
{NULL, 0, 0, 0}
|
{NULL, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -94,9 +94,7 @@ coff_solib_add (arg_string, from_tty, target)
|
||||||
objfile = symbol_file_add (filename, from_tty,
|
objfile = symbol_file_add (filename, from_tty,
|
||||||
NULL, /* no offsets */
|
NULL, /* no offsets */
|
||||||
0, /* not mainline */
|
0, /* not mainline */
|
||||||
0, /* flags */
|
OBJF_SHARED); /* flags */
|
||||||
0, /* Not user loaded */
|
|
||||||
1); /* Is a solib */
|
|
||||||
|
|
||||||
libsize -= len * 4;
|
libsize -= len * 4;
|
||||||
lib += len * 4;
|
lib += len * 4;
|
||||||
|
|
|
@ -250,6 +250,11 @@ extern void i386_frame_find_saved_regs PARAMS ((struct frame_info *,
|
||||||
|
|
||||||
/* Things needed for making the inferior call functions. */
|
/* Things needed for making the inferior call functions. */
|
||||||
|
|
||||||
|
/* "An argument's size is increased, if necessary, to make it a
|
||||||
|
multiple of [32 bit] words. This may require tail padding,
|
||||||
|
depending on the size of the argument" - from the x86 ABI. */
|
||||||
|
#define PARM_BOUNDARY 32
|
||||||
|
|
||||||
/* Push an empty stack frame, to record the current PC, etc. */
|
/* Push an empty stack frame, to record the current PC, etc. */
|
||||||
|
|
||||||
#define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); }
|
#define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); }
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#undef MIPS_REGISTER_NAMES
|
#undef MIPS_REGISTER_NAMES
|
||||||
#undef FP0_REGNUM
|
#undef FP0_REGNUM
|
||||||
#undef PC_REGNUM
|
#undef PC_REGNUM
|
||||||
#undef PS_REGNUM
|
|
||||||
#undef HI_REGNUM
|
#undef HI_REGNUM
|
||||||
#undef LO_REGNUM
|
#undef LO_REGNUM
|
||||||
#undef CAUSE_REGNUM
|
#undef CAUSE_REGNUM
|
||||||
|
|
|
@ -799,3 +799,9 @@ PARAMS ((CORE_ADDR, int))
|
||||||
/* Here's how to step off a permanent breakpoint. */
|
/* Here's how to step off a permanent breakpoint. */
|
||||||
#define SKIP_PERMANENT_BREAKPOINT (hppa_skip_permanent_breakpoint)
|
#define SKIP_PERMANENT_BREAKPOINT (hppa_skip_permanent_breakpoint)
|
||||||
extern void hppa_skip_permanent_breakpoint (void);
|
extern void hppa_skip_permanent_breakpoint (void);
|
||||||
|
|
||||||
|
/* On HP-UX, certain system routines (millicode) have names beginning
|
||||||
|
with $ or $$, e.g. $$dyncall, which handles inter-space procedure
|
||||||
|
calls on PA-RISC. Tell the expression parser to check for those
|
||||||
|
when parsing tokens that begin with "$". */
|
||||||
|
#define SYMBOLS_CAN_START_WITH_DOLLAR (1)
|
||||||
|
|
|
@ -368,7 +368,7 @@ add_shared_symbol_files ()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW, 0, 0);
|
objfile = symbol_file_add (LIBC_FILE, 0, NULL, 0, OBJF_READNOW);
|
||||||
minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile);
|
minsym = lookup_minimal_symbol (LINKS_MAP_POINTER, objfile);
|
||||||
|
|
||||||
ld_map = (struct link_map *)
|
ld_map = (struct link_map *)
|
||||||
|
@ -387,7 +387,7 @@ add_shared_symbol_files ()
|
||||||
struct section_addr_info section_addrs;
|
struct section_addr_info section_addrs;
|
||||||
memset (§ion_addrs, 0, sizeof (section_addrs));
|
memset (§ion_addrs, 0, sizeof (section_addrs));
|
||||||
section_addrs.text_addr = lms.l_addr;
|
section_addrs.text_addr = lms.l_addr;
|
||||||
symbol_file_add (path_name, 1, §ion_addrs, 0, 0, 0, 0);
|
symbol_file_add (path_name, 1, §ion_addrs, 0, 0);
|
||||||
free (path_name);
|
free (path_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
1999-10-11 Jim Kingdon <kingdon@redhat.com>
|
||||||
|
|
||||||
|
* gdbint.texinfo (Target Architecture Definition): Add PARM_BOUNDARY.
|
||||||
|
|
||||||
|
1999-10-05 Stan Shebs <shebs@andros.cygnus.com>
|
||||||
|
|
||||||
|
From Dmitry Sivachenko <demon@gpad.ac.ru>:
|
||||||
|
* gdb.texinfo: Use GDBP and GDBN everywhere, fix a couple other
|
||||||
|
typos.
|
||||||
|
|
||||||
|
* gdb.texinfo: Various minor wording and formatting improvements,
|
||||||
|
mentions of additional command-line options.
|
||||||
|
|
||||||
1999-09-30 Fred Fish <fnf@cygnus.com>
|
1999-09-30 Fred Fish <fnf@cygnus.com>
|
||||||
|
|
||||||
* gdb.texinfo: Document additional forms of specifying section
|
* gdb.texinfo: Document additional forms of specifying section
|
||||||
|
|
|
@ -347,19 +347,19 @@ information in this manual.
|
||||||
|
|
||||||
Cygnus Solutions has sponsored GDB maintenance and much of its
|
Cygnus Solutions has sponsored GDB maintenance and much of its
|
||||||
development since 1991. Cygnus engineers who have worked on GDB
|
development since 1991. Cygnus engineers who have worked on GDB
|
||||||
fulltime include Mark Alexander, Jim Blandy, Per Bothner, Edith Epstein,
|
fulltime include Mark Alexander, Jim Blandy, Per Bothner, Kevin
|
||||||
Chris Faylor, Fred Fish, Martin Hunt, Jim Ingham, John Gilmore, Stu
|
Buettner, Edith Epstein, Chris Faylor, Fred Fish, Martin Hunt, Jim
|
||||||
Grossman, Kung Hsu, Jim Kingdon, John Metzler, Fernando Nasser, Geoffrey
|
Ingham, John Gilmore, Stu Grossman, Kung Hsu, Jim Kingdon, John Metzler,
|
||||||
Noer, Dawn Perchik, Rich Pixley, Zdenek Radouch, Keith Seitz, Stan
|
Fernando Nasser, Geoffrey Noer, Dawn Perchik, Rich Pixley, Zdenek
|
||||||
Shebs, David Taylor, and Elena Zannoni. In addition, Dave Brolley, Ian
|
Radouch, Keith Seitz, Stan Shebs, David Taylor, and Elena Zannoni. In
|
||||||
Carmichael, Steve Chamberlain, Nick Clifton, JT Conklin, Stan Cox, DJ
|
addition, Dave Brolley, Ian Carmichael, Steve Chamberlain, Nick Clifton,
|
||||||
Delorie, Ulrich Drepper, Frank Eigler, Doug Evans, Sean Fagan, David
|
JT Conklin, Stan Cox, DJ Delorie, Ulrich Drepper, Frank Eigler, Doug
|
||||||
Henkel-Wallace, Richard Henderson, Jeff Holcomb, Jeff Law, Jim Lemke,
|
Evans, Sean Fagan, David Henkel-Wallace, Richard Henderson, Jeff
|
||||||
Tom Lord, Bob Manson, Michael Meissner, Jason Merrill, Catherine Moore,
|
Holcomb, Jeff Law, Jim Lemke, Tom Lord, Bob Manson, Michael Meissner,
|
||||||
Drew Moseley, Ken Raeburn, Gavin Romig-Koch, Rob Savoye, Jamie Smith,
|
Jason Merrill, Catherine Moore, Drew Moseley, Ken Raeburn, Gavin
|
||||||
Mike Stump, Ian Taylor, Angela Thomas, Michael Tiemann, Tom Tromey, Ron
|
Romig-Koch, Rob Savoye, Jamie Smith, Mike Stump, Ian Taylor, Angela
|
||||||
Unrau, Jim Wilson, and David Zuhn have made contributions both large
|
Thomas, Michael Tiemann, Tom Tromey, Ron Unrau, Jim Wilson, and David
|
||||||
and small.
|
Zuhn have made contributions both large and small.
|
||||||
|
|
||||||
|
|
||||||
@node Sample Session
|
@node Sample Session
|
||||||
|
@ -690,9 +690,10 @@ would attach @value{GDBN} to process @code{1234} (unless you also have a file
|
||||||
named @file{1234}; @value{GDBN} does check for a core file first).
|
named @file{1234}; @value{GDBN} does check for a core file first).
|
||||||
|
|
||||||
Taking advantage of the second command-line argument requires a fairly
|
Taking advantage of the second command-line argument requires a fairly
|
||||||
complete operating system; when you use @value{GDBN} as a remote debugger
|
complete operating system; when you use @value{GDBN} as a remote
|
||||||
attached to a bare board, there may not be any notion of ``process'',
|
debugger attached to a bare board, there may not be any notion of
|
||||||
and there is often no way to get a core dump.
|
``process'', and there is often no way to get a core dump. @value{GDBN}
|
||||||
|
will warn you if it is unable to attach or to read core dumps.
|
||||||
|
|
||||||
You can run @code{gdb} without printing the front material, which describes
|
You can run @code{gdb} without printing the front material, which describes
|
||||||
@value{GDBN}'s non-warranty, by specifying @code{-silent}:
|
@value{GDBN}'s non-warranty, by specifying @code{-silent}:
|
||||||
|
@ -729,7 +730,7 @@ in sequential order. The order makes a difference when the
|
||||||
@node File Options
|
@node File Options
|
||||||
@subsection Choosing files
|
@subsection Choosing files
|
||||||
|
|
||||||
When @value{GDBN} starts
|
When @value{GDBN} starts, it reads any arguments other than options as
|
||||||
specifying an executable file and core file (or process ID). This is
|
specifying an executable file and core file (or process ID). This is
|
||||||
the same as if the arguments were specified by the @samp{-se} and
|
the same as if the arguments were specified by the @samp{-se} and
|
||||||
@samp{-c} options respectively. (@value{GDBN} reads the first argument
|
@samp{-c} options respectively. (@value{GDBN} reads the first argument
|
||||||
|
@ -805,14 +806,14 @@ This makes startup slower, but makes future operations faster.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
The @code{-mapped} and @code{-readnow} options are typically combined in
|
You typically combine the @code{-mapped} and @code{-readnow} options in
|
||||||
order to build a @file{.syms} file that contains complete symbol
|
order to build a @file{.syms} file that contains complete symbol
|
||||||
information. (@xref{Files,,Commands to specify files}, for
|
information. (@xref{Files,,Commands to specify files}, for information
|
||||||
information on @file{.syms} files.) A simple @value{GDBN} invocation to do
|
on @file{.syms} files.) A simple @value{GDBN} invocation to do nothing
|
||||||
nothing but build a @file{.syms} file for future use is:
|
but build a @file{.syms} file for future use is:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
gdb -batch -nx -mapped -readnow programname
|
gdb -batch -nx -mapped -readnow programname
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@node Mode Options
|
@node Mode Options
|
||||||
|
@ -824,10 +825,11 @@ batch mode or quiet mode.
|
||||||
@table @code
|
@table @code
|
||||||
@item -nx
|
@item -nx
|
||||||
@itemx -n
|
@itemx -n
|
||||||
Do not execute commands from any initialization files (normally called
|
Do not execute commands found in any initialization files (normally
|
||||||
@file{.gdbinit}, or @file{gdb.ini} on PCs). Normally, the commands in
|
called @file{.gdbinit}, or @file{gdb.ini} on PCs). Normally,
|
||||||
these files are executed after all the command options and arguments
|
@value{GDBN} executes the commands in these files after all the command
|
||||||
have been processed. @xref{Command Files,,Command files}.
|
options and arguments have been processed. @xref{Command Files,,Command
|
||||||
|
files}.
|
||||||
|
|
||||||
@item -quiet
|
@item -quiet
|
||||||
@itemx -q
|
@itemx -q
|
||||||
|
@ -841,17 +843,29 @@ initialization files, if not inhibited with @samp{-n}). Exit with
|
||||||
nonzero status if an error occurs in executing the @value{GDBN} commands
|
nonzero status if an error occurs in executing the @value{GDBN} commands
|
||||||
in the command files.
|
in the command files.
|
||||||
|
|
||||||
Batch mode may be useful for running @value{GDBN} as a filter, for example to
|
Batch mode may be useful for running @value{GDBN} as a filter, for
|
||||||
download and run a program on another computer; in order to make this
|
example to download and run a program on another computer; in order to
|
||||||
more useful, the message
|
make this more useful, the message
|
||||||
|
|
||||||
@example
|
@example
|
||||||
Program exited normally.
|
Program exited normally.
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@noindent
|
@noindent
|
||||||
(which is ordinarily issued whenever a program running under @value{GDBN} control
|
(which is ordinarily issued whenever a program running under
|
||||||
terminates) is not issued when running in batch mode.
|
@value{GDBN} control terminates) is not issued when running in batch
|
||||||
|
mode.
|
||||||
|
|
||||||
|
@item -nowindows
|
||||||
|
@itemx -nw
|
||||||
|
``No windows''. If @value{GDBN} comes with a graphical user interface
|
||||||
|
(GUI) built in, then this option tells GDB to only use the command-line
|
||||||
|
interface. If no GUI is available, this option has no effect.
|
||||||
|
|
||||||
|
@item -windows
|
||||||
|
@itemx -w
|
||||||
|
If @value{GDBN} includes a GUI, then this option requires it to be
|
||||||
|
used if possible.
|
||||||
|
|
||||||
@item -cd @var{directory}
|
@item -cd @var{directory}
|
||||||
Run @value{GDBN} using @var{directory} as its working directory,
|
Run @value{GDBN} using @var{directory} as its working directory,
|
||||||
|
@ -869,7 +883,8 @@ and a newline. The Emacs-to-@value{GDBN} interface program uses the two
|
||||||
@samp{\032} characters as a signal to display the source code for the
|
@samp{\032} characters as a signal to display the source code for the
|
||||||
frame.
|
frame.
|
||||||
|
|
||||||
@item -b @var{bps}
|
@item -baud @var{bps}
|
||||||
|
@itemx -b @var{bps}
|
||||||
Set the line speed (baud rate or bits per second) of any serial
|
Set the line speed (baud rate or bits per second) of any serial
|
||||||
interface used by @value{GDBN} for remote debugging.
|
interface used by @value{GDBN} for remote debugging.
|
||||||
|
|
||||||
|
@ -1144,16 +1159,18 @@ display a short list of named classes of commands:
|
||||||
(@value{GDBP}) help
|
(@value{GDBP}) help
|
||||||
List of classes of commands:
|
List of classes of commands:
|
||||||
|
|
||||||
|
aliases -- Aliases of other commands
|
||||||
|
breakpoints -- Making program stop at certain points
|
||||||
|
data -- Examining data
|
||||||
|
files -- Specifying and examining files
|
||||||
|
internals -- Maintenance commands
|
||||||
|
obscure -- Obscure features
|
||||||
running -- Running the program
|
running -- Running the program
|
||||||
stack -- Examining the stack
|
stack -- Examining the stack
|
||||||
data -- Examining data
|
|
||||||
breakpoints -- Making program stop at certain points
|
|
||||||
files -- Specifying and examining files
|
|
||||||
status -- Status inquiries
|
status -- Status inquiries
|
||||||
support -- Support facilities
|
support -- Support facilities
|
||||||
|
tracepoints -- Tracing of program execution without stopping the program
|
||||||
user-defined -- User-defined commands
|
user-defined -- User-defined commands
|
||||||
aliases -- Aliases of other commands
|
|
||||||
obscure -- Obscure features
|
|
||||||
|
|
||||||
Type "help" followed by a class name for a list of
|
Type "help" followed by a class name for a list of
|
||||||
commands in that class.
|
commands in that class.
|
||||||
|
@ -1176,9 +1193,10 @@ List of commands:
|
||||||
|
|
||||||
@c Line break in "show" line falsifies real output, but needed
|
@c Line break in "show" line falsifies real output, but needed
|
||||||
@c to fit in smallbook page size.
|
@c to fit in smallbook page size.
|
||||||
show -- Generic command for showing things set
|
info -- Generic command for showing things
|
||||||
with "set"
|
about the program being debugged
|
||||||
info -- Generic command for printing status
|
show -- Generic command for showing things
|
||||||
|
about the debugger
|
||||||
|
|
||||||
Type "help" followed by command name for full
|
Type "help" followed by command name for full
|
||||||
documentation.
|
documentation.
|
||||||
|
@ -1204,9 +1222,10 @@ complete i
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
@group
|
@group
|
||||||
|
if
|
||||||
|
ignore
|
||||||
info
|
info
|
||||||
inspect
|
inspect
|
||||||
ignore
|
|
||||||
@end group
|
@end group
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
|
@ -1265,11 +1284,14 @@ exceptional in lacking corresponding @code{set} commands:
|
||||||
@cindex version number
|
@cindex version number
|
||||||
@item show version
|
@item show version
|
||||||
Show what version of @value{GDBN} is running. You should include this
|
Show what version of @value{GDBN} is running. You should include this
|
||||||
information in @value{GDBN} bug-reports. If multiple versions of @value{GDBN} are in
|
information in @value{GDBN} bug-reports. If multiple versions of
|
||||||
use at your site, you may occasionally want to determine which version
|
@value{GDBN} are in use at your site, you may need to determine which
|
||||||
of @value{GDBN} you are running; as @value{GDBN} evolves, new commands are introduced,
|
version of @value{GDBN} you are running; as @value{GDBN} evolves, new
|
||||||
and old ones may wither away. The version number is also announced
|
commands are introduced, and old ones may wither away. Also, many
|
||||||
when you start @value{GDBN}.
|
system vendors ship variant versions of @value{GDBN}, and there are
|
||||||
|
variant versions of @value{GDBN} in GNU/Linux distributions as well.
|
||||||
|
The version number is the same as the one announced when you start
|
||||||
|
@value{GDBN}.
|
||||||
|
|
||||||
@kindex show copying
|
@kindex show copying
|
||||||
@item show copying
|
@item show copying
|
||||||
|
@ -1277,7 +1299,9 @@ Display information about permission for copying @value{GDBN}.
|
||||||
|
|
||||||
@kindex show warranty
|
@kindex show warranty
|
||||||
@item show warranty
|
@item show warranty
|
||||||
Display the @sc{gnu} ``NO WARRANTY'' statement.
|
Display the @sc{gnu} ``NO WARRANTY'' statement, or a warranty,
|
||||||
|
if your version of @value{GDB} comes with one.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node Running
|
@node Running
|
||||||
|
@ -1961,7 +1985,7 @@ process. The @var{mode} can be:
|
||||||
@table @code
|
@table @code
|
||||||
@item parent
|
@item parent
|
||||||
The original process is debugged after a fork. The child process runs
|
The original process is debugged after a fork. The child process runs
|
||||||
unimpeded.
|
unimpeded. This is the default.
|
||||||
|
|
||||||
@item child
|
@item child
|
||||||
The new process is debugged after a fork. The parent process runs
|
The new process is debugged after a fork. The parent process runs
|
||||||
|
@ -1972,7 +1996,7 @@ The debugger will ask for one of the above choices.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item show follow-fork-mode
|
@item show follow-fork-mode
|
||||||
Display the current debugger response to a fork or vfork call.
|
Display the current debugger response to a @code{fork} or @code{vfork} call.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
If you ask to debug a child process and a @code{vfork} is followed by an
|
If you ask to debug a child process and a @code{vfork} is followed by an
|
||||||
|
@ -2119,7 +2143,7 @@ C++, @var{function} may refer to more than one possible place to break.
|
||||||
@itemx break -@var{offset}
|
@itemx break -@var{offset}
|
||||||
Set a breakpoint some number of lines forward or back from the position
|
Set a breakpoint some number of lines forward or back from the position
|
||||||
at which execution stopped in the currently selected @dfn{stack frame}.
|
at which execution stopped in the currently selected @dfn{stack frame}.
|
||||||
(@xref{Frames, , Frames}, for a description of stack frames.)
|
(@xref{Frames, ,Frames}, for a description of stack frames.)
|
||||||
|
|
||||||
@item break @var{linenum}
|
@item break @var{linenum}
|
||||||
Set a breakpoint at line @var{linenum} in the current source file.
|
Set a breakpoint at line @var{linenum} in the current source file.
|
||||||
|
@ -2236,7 +2260,7 @@ Whether the breakpoint is marked to be disabled or deleted when hit.
|
||||||
Enabled breakpoints are marked with @samp{y}. @samp{n} marks breakpoints
|
Enabled breakpoints are marked with @samp{y}. @samp{n} marks breakpoints
|
||||||
that are not enabled.
|
that are not enabled.
|
||||||
@item Address
|
@item Address
|
||||||
Where the breakpoint is in your program, as a memory address
|
Where the breakpoint is in your program, as a memory address.
|
||||||
@item What
|
@item What
|
||||||
Where the breakpoint is in the source for your program, as a file and
|
Where the breakpoint is in the source for your program, as a file and
|
||||||
line number.
|
line number.
|
||||||
|
@ -2326,14 +2350,14 @@ expression changes, without having to predict a particular place where
|
||||||
this may happen.
|
this may happen.
|
||||||
|
|
||||||
Depending on your system, watchpoints may be implemented in software or
|
Depending on your system, watchpoints may be implemented in software or
|
||||||
hardware. GDB does software watchpointing by single-stepping your
|
hardware. @value{GDBN} does software watchpointing by single-stepping your
|
||||||
program and testing the variable's value each time, which is hundreds of
|
program and testing the variable's value each time, which is hundreds of
|
||||||
times slower than normal execution. (But this may still be worth it, to
|
times slower than normal execution. (But this may still be worth it, to
|
||||||
catch errors where you have no clue what part of your program is the
|
catch errors where you have no clue what part of your program is the
|
||||||
culprit.)
|
culprit.)
|
||||||
|
|
||||||
On some systems, such as HP-UX, Linux and some other x86-based targets,
|
On some systems, such as HP-UX, Linux and some other x86-based targets,
|
||||||
GDB includes support for
|
@value{GDBN} includes support for
|
||||||
hardware watchpoints, which do not slow down the running of your
|
hardware watchpoints, which do not slow down the running of your
|
||||||
program.
|
program.
|
||||||
|
|
||||||
|
@ -2349,7 +2373,7 @@ Set a watchpoint that will break when watch @var{expr} is read by the program.
|
||||||
|
|
||||||
@kindex awatch
|
@kindex awatch
|
||||||
@item awatch @var{expr}
|
@item awatch @var{expr}
|
||||||
Set a watchpoint that will break when @var{args} is either read or written into
|
Set a watchpoint that will break when @var{expr} is either read or written into
|
||||||
by the program.
|
by the program.
|
||||||
|
|
||||||
@kindex info watchpoints
|
@kindex info watchpoints
|
||||||
|
@ -2421,7 +2445,7 @@ watchpoint with one command and the other with a different command.
|
||||||
Delete or disable unused watchpoint commands before setting new ones.
|
Delete or disable unused watchpoint commands before setting new ones.
|
||||||
|
|
||||||
If you call a function interactively using @code{print} or @code{call},
|
If you call a function interactively using @code{print} or @code{call},
|
||||||
any watchpoints you have set will be inactive until GDB reaches another
|
any watchpoints you have set will be inactive until @value{GDBN} reaches another
|
||||||
kind of breakpoint or the call completes.
|
kind of breakpoint or the call completes.
|
||||||
|
|
||||||
@value{GDBN} automatically deletes watchpoints that watch local
|
@value{GDBN} automatically deletes watchpoints that watch local
|
||||||
|
@ -3308,7 +3332,7 @@ well; in this case, place @samp{thread @var{threadno}} before the
|
||||||
breakpoint condition, like this:
|
breakpoint condition, like this:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
(gdb) break frik.c:13 thread 28 if bartab > lim
|
(@value{GDBP}) break frik.c:13 thread 28 if bartab > lim
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
@ -3355,7 +3379,7 @@ when you step. They are more likely to run when you @samp{next} over a
|
||||||
function call, and they are completely free to run when you use commands
|
function call, and they are completely free to run when you use commands
|
||||||
like @samp{continue}, @samp{until}, or @samp{finish}. However, unless another
|
like @samp{continue}, @samp{until}, or @samp{finish}. However, unless another
|
||||||
thread hits a breakpoint during its timeslice, they will never steal the
|
thread hits a breakpoint during its timeslice, they will never steal the
|
||||||
GDB prompt away from the thread that you are debugging.
|
@value{GDBN} prompt away from the thread that you are debugging.
|
||||||
|
|
||||||
@item show scheduler-locking
|
@item show scheduler-locking
|
||||||
Display the current scheduler locking mode.
|
Display the current scheduler locking mode.
|
||||||
|
@ -7374,7 +7398,7 @@ type = double
|
||||||
(@value{GDBP}) p g
|
(@value{GDBP}) p g
|
||||||
$1 = 1
|
$1 = 1
|
||||||
(@value{GDBP}) set g=4
|
(@value{GDBP}) set g=4
|
||||||
(gdb) p g
|
(@value{GDBP}) p g
|
||||||
$2 = 1
|
$2 = 1
|
||||||
(@value{GDBP}) r
|
(@value{GDBP}) r
|
||||||
The program being debugged has been started already.
|
The program being debugged has been started already.
|
||||||
|
@ -8103,7 +8127,7 @@ it somewhere in memory where it won't get clobbered by the download.
|
||||||
|
|
||||||
@kindex target sim
|
@kindex target sim
|
||||||
@item target sim
|
@item target sim
|
||||||
Builtin CPU simulator. GDB includes simulators for most architectures.
|
Builtin CPU simulator. @value{GDBN} includes simulators for most architectures.
|
||||||
In general,
|
In general,
|
||||||
@example
|
@example
|
||||||
target sim
|
target sim
|
||||||
|
@ -8772,12 +8796,12 @@ toggle debug flag.
|
||||||
@item detach @emph{(optional)}
|
@item detach @emph{(optional)}
|
||||||
@tab @code{D}
|
@tab @code{D}
|
||||||
@tab
|
@tab
|
||||||
Detach GDB from the remote system. Sent to the remote target before
|
Detach @value{GDBN} from the remote system. Sent to the remote target before
|
||||||
GDB disconnects.
|
@value{GDBN} disconnects.
|
||||||
@item
|
@item
|
||||||
@tab reply @emph{no response}
|
@tab reply @emph{no response}
|
||||||
@tab
|
@tab
|
||||||
GDB does not check for any response after sending this packet
|
@value{GDBN} does not check for any response after sending this packet
|
||||||
|
|
||||||
@item reserved
|
@item reserved
|
||||||
@tab @code{e}
|
@tab @code{e}
|
||||||
|
@ -8804,7 +8828,7 @@ GDB does not check for any response after sending this packet
|
||||||
Each byte of register data is described by two hex digits. The bytes
|
Each byte of register data is described by two hex digits. The bytes
|
||||||
with the register are transmitted in target byte order. The size of
|
with the register are transmitted in target byte order. The size of
|
||||||
each register and their position within the @samp{g} @var{packet} are
|
each register and their position within the @samp{g} @var{packet} are
|
||||||
determined by the GDB internal macros @var{REGISTER_RAW_SIZE} and
|
determined by the @value{GDBN} internal macros @var{REGISTER_RAW_SIZE} and
|
||||||
@var{REGISTER_NAME} macros. The specification of several standard
|
@var{REGISTER_NAME} macros. The specification of several standard
|
||||||
@code{g} packets is specified below.
|
@code{g} packets is specified below.
|
||||||
@item
|
@item
|
||||||
|
@ -8893,14 +8917,14 @@ thread context has been selected (ie. does 'k' kill only that thread?)}.
|
||||||
@tab @code{m}@var{addr}@code{,}@var{length}
|
@tab @code{m}@var{addr}@code{,}@var{length}
|
||||||
@tab
|
@tab
|
||||||
Read @var{length} bytes of memory starting at address @var{addr}.
|
Read @var{length} bytes of memory starting at address @var{addr}.
|
||||||
Neither GDB nor the stub assume that sized memory transfers are assumed
|
Neither @value{GDBN} nor the stub assume that sized memory transfers are assumed
|
||||||
using word alligned accesses. FIXME: @emph{A word aligned memory
|
using word alligned accesses. FIXME: @emph{A word aligned memory
|
||||||
transfer mechanism is needed.}
|
transfer mechanism is needed.}
|
||||||
@item
|
@item
|
||||||
@tab reply @var{XX...}
|
@tab reply @var{XX...}
|
||||||
@tab
|
@tab
|
||||||
@var{XX...} is mem contents. Can be fewer bytes than requested if able
|
@var{XX...} is mem contents. Can be fewer bytes than requested if able
|
||||||
to read only part of the data. Neither GDB nor the stub assume that
|
to read only part of the data. Neither @value{GDBN} nor the stub assume that
|
||||||
sized memory transfers are assumed using word alligned accesses. FIXME:
|
sized memory transfers are assumed using word alligned accesses. FIXME:
|
||||||
@emph{A word aligned memory transfer mechanism is needed.}
|
@emph{A word aligned memory transfer mechanism is needed.}
|
||||||
@item
|
@item
|
||||||
|
@ -9484,7 +9508,7 @@ Use the @code{set os} command to set the operating system. This tells
|
||||||
@value{GDBN} which kernel object display module to initialize:
|
@value{GDBN} which kernel object display module to initialize:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
(gdb) set os cisco
|
(@value{GDBP}) set os cisco
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
If @code{set os} succeeds, @value{GDBN} will display some information
|
If @code{set os} succeeds, @value{GDBN} will display some information
|
||||||
|
@ -9493,7 +9517,7 @@ which can be used to query the target. The @code{info} command is named
|
||||||
after the operating system:
|
after the operating system:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
(gdb) info cisco
|
(@value{GDBP}) info cisco
|
||||||
List of Cisco Kernel Objects
|
List of Cisco Kernel Objects
|
||||||
Object Description
|
Object Description
|
||||||
any Any and all objects
|
any Any and all objects
|
||||||
|
@ -10092,7 +10116,7 @@ Hitachi SH, H8/300, or H8/500:
|
||||||
that you want to use @samp{target hms}, the remote debugging interface
|
that you want to use @samp{target hms}, the remote debugging interface
|
||||||
for Hitachi microprocessors, or @samp{target e7000}, the in-circuit
|
for Hitachi microprocessors, or @samp{target e7000}, the in-circuit
|
||||||
emulator for the Hitachi SH and the Hitachi 300H. (@samp{target hms} is
|
emulator for the Hitachi SH and the Hitachi 300H. (@samp{target hms} is
|
||||||
the default when GDB is configured specifically for the Hitachi SH,
|
the default when @value{GDBN} is configured specifically for the Hitachi SH,
|
||||||
H8/300, or H8/500.)
|
H8/300, or H8/500.)
|
||||||
|
|
||||||
@item
|
@item
|
||||||
|
@ -10124,7 +10148,7 @@ hosts, where it is typically something like @file{/dev/ttya}.
|
||||||
@cindex serial line speed, Hitachi micros
|
@cindex serial line speed, Hitachi micros
|
||||||
@code{@value{GDBP}} has another special command to set the communications
|
@code{@value{GDBP}} has another special command to set the communications
|
||||||
speed: @samp{speed @var{bps}}. This command also is only used from Unix
|
speed: @samp{speed @var{bps}}. This command also is only used from Unix
|
||||||
hosts; on DOS hosts, set the line speed as usual from outside GDB with
|
hosts; on DOS hosts, set the line speed as usual from outside @value{GDBN} with
|
||||||
the DOS @code{mode} command (for instance,
|
the DOS @code{mode} command (for instance,
|
||||||
@w{@kbd{mode com2:9600,n,8,1,p}} for a 9600@dmn{bps} connection).
|
@w{@kbd{mode com2:9600,n,8,1,p}} for a 9600@dmn{bps} connection).
|
||||||
|
|
||||||
|
@ -10182,15 +10206,15 @@ itself, are described in @ref{Files,,Commands to specify files}.)
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
(eg-C:\H8300\TEST) @value{GDBP} t.x
|
(eg-C:\H8300\TEST) @value{GDBP} t.x
|
||||||
GDB is free software and you are welcome to distribute copies
|
@value{GDBN} is free software and you are welcome to distribute copies
|
||||||
of it under certain conditions; type "show copying" to see
|
of it under certain conditions; type "show copying" to see
|
||||||
the conditions.
|
the conditions.
|
||||||
There is absolutely no warranty for GDB; type "show warranty"
|
There is absolutely no warranty for @value{GDBN}; type "show warranty"
|
||||||
for details.
|
for details.
|
||||||
GDB @value{GDBVN}, Copyright 1992 Free Software Foundation, Inc...
|
@value{GDBN} @value{GDBVN}, Copyright 1992 Free Software Foundation, Inc...
|
||||||
(gdb) target hms
|
(@value{GDBP}) target hms
|
||||||
Connected to remote H8/300 HMS system.
|
Connected to remote H8/300 HMS system.
|
||||||
(gdb) load t.x
|
(@value{GDBP}) load t.x
|
||||||
.text : 0x8000 .. 0xabde ***********
|
.text : 0x8000 .. 0xabde ***********
|
||||||
.data : 0xabde .. 0xad30 *
|
.data : 0xabde .. 0xad30 *
|
||||||
.stack : 0xf000 .. 0xf014 *
|
.stack : 0xf000 .. 0xf014 *
|
||||||
|
@ -10502,10 +10526,10 @@ debugger:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
host$ @value{GDBP} @var{prog}
|
host$ @value{GDBP} @var{prog}
|
||||||
GDB is free software and @dots{}
|
@value{GDBN} is free software and @dots{}
|
||||||
(gdb) target mips /dev/ttyb
|
(@value{GDBP}) target mips /dev/ttyb
|
||||||
(gdb) load @var{prog}
|
(@value{GDBP}) load @var{prog}
|
||||||
(gdb) run
|
(@value{GDBP}) run
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item target mips @var{hostname}:@var{portnumber}
|
@item target mips @var{hostname}:@var{portnumber}
|
||||||
|
@ -10844,7 +10868,7 @@ remote protocol.
|
||||||
@node ST2000
|
@node ST2000
|
||||||
@subsection Tandem ST2000
|
@subsection Tandem ST2000
|
||||||
|
|
||||||
GDB may be used with a Tandem ST2000 phone switch, running Tandem's
|
@value{GDBN} may be used with a Tandem ST2000 phone switch, running Tandem's
|
||||||
STDBUG protocol.
|
STDBUG protocol.
|
||||||
|
|
||||||
To connect your ST2000 to the host system, see the manufacturer's
|
To connect your ST2000 to the host system, see the manufacturer's
|
||||||
|
@ -10945,7 +10969,7 @@ simulated clock ticks.
|
||||||
@section Architectures
|
@section Architectures
|
||||||
|
|
||||||
This section describes characteristics of architectures that affect
|
This section describes characteristics of architectures that affect
|
||||||
all uses of GDB with this architecture, both native and cross.
|
all uses of @value{GDBN} with the architecture, both native and cross.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* A29K::
|
* A29K::
|
||||||
|
@ -11236,13 +11260,14 @@ from wrapping its output.
|
||||||
@cindex number representation
|
@cindex number representation
|
||||||
@cindex entering numbers
|
@cindex entering numbers
|
||||||
|
|
||||||
You can always enter numbers in octal, decimal, or hexadecimal in @value{GDBN} by
|
You can always enter numbers in octal, decimal, or hexadecimal in
|
||||||
the usual conventions: octal numbers begin with @samp{0}, decimal
|
@value{GDBN} by the usual conventions: octal numbers begin with
|
||||||
numbers end with @samp{.}, and hexadecimal numbers begin with @samp{0x}.
|
@samp{0}, decimal numbers end with @samp{.}, and hexadecimal numbers
|
||||||
Numbers that begin with none of these are, by default, entered in base
|
begin with @samp{0x}. Numbers that begin with none of these are, by
|
||||||
10; likewise, the default display for numbers---when no particular
|
default, entered in base 10; likewise, the default display for
|
||||||
format is specified---is base 10. You can change the default base for
|
numbers---when no particular format is specified---is base 10. You can
|
||||||
both input and output with the @code{set radix} command.
|
change the default base for both input and output with the @code{set
|
||||||
|
radix} command.
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@kindex set input-radix
|
@kindex set input-radix
|
||||||
|
@ -11280,10 +11305,10 @@ Display the current default base for numeric display.
|
||||||
@node Messages/Warnings
|
@node Messages/Warnings
|
||||||
@section Optional warnings and messages
|
@section Optional warnings and messages
|
||||||
|
|
||||||
By default, @value{GDBN} is silent about its inner workings. If you are running
|
By default, @value{GDBN} is silent about its inner workings. If you are
|
||||||
on a slow machine, you may want to use the @code{set verbose} command.
|
running on a slow machine, you may want to use the @code{set verbose}
|
||||||
This makes @value{GDBN} tell you when it does a lengthy internal operation, so
|
command. This makes @value{GDBN} tell you when it does a lengthy
|
||||||
you will not think it has crashed.
|
internal operation, so you will not think it has crashed.
|
||||||
|
|
||||||
Currently, the messages controlled by @code{set verbose} are those
|
Currently, the messages controlled by @code{set verbose} are those
|
||||||
which announce that the symbol table for a source file is being read;
|
which announce that the symbol table for a source file is being read;
|
||||||
|
@ -11302,21 +11327,24 @@ Disables @value{GDBN} output of certain informational messages.
|
||||||
Displays whether @code{set verbose} is on or off.
|
Displays whether @code{set verbose} is on or off.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
By default, if @value{GDBN} encounters bugs in the symbol table of an object
|
By default, if @value{GDBN} encounters bugs in the symbol table of an
|
||||||
file, it is silent; but if you are debugging a compiler, you may find
|
object file, it is silent; but if you are debugging a compiler, you may
|
||||||
this information useful (@pxref{Symbol Errors, ,Errors reading symbol files}).
|
find this information useful (@pxref{Symbol Errors, ,Errors reading
|
||||||
|
symbol files}).
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
|
||||||
@kindex set complaints
|
@kindex set complaints
|
||||||
@item set complaints @var{limit}
|
@item set complaints @var{limit}
|
||||||
Permits @value{GDBN} to output @var{limit} complaints about each type of unusual
|
Permits @value{GDBN} to output @var{limit} complaints about each type of
|
||||||
symbols before becoming silent about the problem. Set @var{limit} to
|
unusual symbols before becoming silent about the problem. Set
|
||||||
zero to suppress all complaints; set it to a large number to prevent
|
@var{limit} to zero to suppress all complaints; set it to a large number
|
||||||
complaints from being suppressed.
|
to prevent complaints from being suppressed.
|
||||||
|
|
||||||
@kindex show complaints
|
@kindex show complaints
|
||||||
@item show complaints
|
@item show complaints
|
||||||
Displays how many symbol complaints @value{GDBN} is permitted to produce.
|
Displays how many symbol complaints @value{GDBN} is permitted to produce.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
By default, @value{GDBN} is cautious, and asks what sometimes seems to be a
|
By default, @value{GDBN} is cautious, and asks what sometimes seems to be a
|
||||||
|
@ -11333,6 +11361,7 @@ If you are willing to unflinchingly face the consequences of your own
|
||||||
commands, you can disable this ``feature'':
|
commands, you can disable this ``feature'':
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
|
||||||
@kindex set confirm
|
@kindex set confirm
|
||||||
@cindex flinching
|
@cindex flinching
|
||||||
@cindex confirmation
|
@cindex confirmation
|
||||||
|
@ -11346,14 +11375,16 @@ Enables confirmation requests (the default).
|
||||||
@kindex show confirm
|
@kindex show confirm
|
||||||
@item show confirm
|
@item show confirm
|
||||||
Displays state of confirmation requests.
|
Displays state of confirmation requests.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node Sequences
|
@node Sequences
|
||||||
@chapter Canned Sequences of Commands
|
@chapter Canned Sequences of Commands
|
||||||
|
|
||||||
Aside from breakpoint commands (@pxref{Break Commands, ,Breakpoint
|
Aside from breakpoint commands (@pxref{Break Commands, ,Breakpoint
|
||||||
command lists}), @value{GDBN} provides two ways to store sequences of commands
|
command lists}), @value{GDBN} provides two ways to store sequences of
|
||||||
for execution as a unit: user-defined commands and command files.
|
commands for execution as a unit: user-defined commands and command
|
||||||
|
files.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Define:: User-defined commands
|
* Define:: User-defined commands
|
||||||
|
@ -11366,11 +11397,11 @@ for execution as a unit: user-defined commands and command files.
|
||||||
@section User-defined commands
|
@section User-defined commands
|
||||||
|
|
||||||
@cindex user-defined command
|
@cindex user-defined command
|
||||||
A @dfn{user-defined command} is a sequence of @value{GDBN} commands to which
|
A @dfn{user-defined command} is a sequence of @value{GDBN} commands to
|
||||||
you assign a new name as a command. This is done with the @code{define}
|
which you assign a new name as a command. This is done with the
|
||||||
command. User commands may accept up to 10 arguments separated by whitespace.
|
@code{define} command. User commands may accept up to 10 arguments
|
||||||
Arguments are accessed within the user command via @var{$arg0@dots{}$arg9}.
|
separated by whitespace. Arguments are accessed within the user command
|
||||||
A trivial example:
|
via @var{$arg0@dots{}$arg9}. A trivial example:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
define adder
|
define adder
|
||||||
|
@ -11391,6 +11422,7 @@ reference variables, use complex expressions, or even perform inferior
|
||||||
functions calls.
|
functions calls.
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
|
||||||
@kindex define
|
@kindex define
|
||||||
@item define @var{commandname}
|
@item define @var{commandname}
|
||||||
Define a command named @var{commandname}. If there is already a command
|
Define a command named @var{commandname}. If there is already a command
|
||||||
|
@ -11439,9 +11471,10 @@ List all user-defined commands, with the first line of the documentation
|
||||||
@kindex show user
|
@kindex show user
|
||||||
@item show user
|
@item show user
|
||||||
@itemx show user @var{commandname}
|
@itemx show user @var{commandname}
|
||||||
Display the @value{GDBN} commands used to define @var{commandname} (but not its
|
Display the @value{GDBN} commands used to define @var{commandname} (but
|
||||||
documentation). If no @var{commandname} is given, display the
|
not its documentation). If no @var{commandname} is given, display the
|
||||||
definitions for all user-defined commands.
|
definitions for all user-defined commands.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
When user-defined commands are executed, the
|
When user-defined commands are executed, the
|
||||||
|
@ -11515,13 +11548,13 @@ When you start @value{GDBN}, it automatically executes commands from its
|
||||||
@dfn{init files}. These are files named @file{.gdbinit} on Unix, or
|
@dfn{init files}. These are files named @file{.gdbinit} on Unix, or
|
||||||
@file{gdb.ini} on DOS/Windows. @value{GDBN} reads the init file (if
|
@file{gdb.ini} on DOS/Windows. @value{GDBN} reads the init file (if
|
||||||
any) in your home directory@footnote{On DOS/Windows systems, the home
|
any) in your home directory@footnote{On DOS/Windows systems, the home
|
||||||
directory is the one pointed to by the @code{HOME} environment variable.},
|
directory is the one pointed to by the @code{HOME} environment
|
||||||
then processes command line options and
|
variable.}, then processes command line options and operands, and then
|
||||||
operands, and then reads the init file (if any) in the current working
|
reads the init file (if any) in the current working directory. This is
|
||||||
directory. This is so the init file in your home directory can set
|
so the init file in your home directory can set options (such as
|
||||||
options (such as @code{set complaints}) which affect the processing of
|
@code{set complaints}) which affect the processing of the command line
|
||||||
the command line options and operands. The init files are not executed
|
options and operands. The init files are not executed if you use the
|
||||||
if you use the @samp{-nx} option; @pxref{Mode Options, ,Choosing modes}.
|
@samp{-nx} option; @pxref{Mode Options, ,Choosing modes}.
|
||||||
|
|
||||||
@cindex init file name
|
@cindex init file name
|
||||||
On some configurations of @value{GDBN}, the init file is known by a
|
On some configurations of @value{GDBN}, the init file is known by a
|
||||||
|
|
|
@ -1444,6 +1444,15 @@ conditional should be eliminated (FIXME) and replaced by
|
||||||
feature-specific macros. It was introduced in haste and we are
|
feature-specific macros. It was introduced in haste and we are
|
||||||
repenting at leisure.
|
repenting at leisure.
|
||||||
|
|
||||||
|
@item SYMBOLS_CAN_START_WITH_DOLLAR
|
||||||
|
Some systems have routines whose names start with @samp{$}. Giving this
|
||||||
|
macro a non-zero value tells GDB's expression parser to check for such
|
||||||
|
routines when parsing tokens that begin with @samp{$}.
|
||||||
|
|
||||||
|
On HP-UX, certain system routines (millicode) have names beginning with
|
||||||
|
@samp{$} or @samp{$$}. For example, @code{$$dyncall} is a millicode
|
||||||
|
routine that handles inter-space procedure calls on PA-RISC.
|
||||||
|
|
||||||
@item IEEE_FLOAT
|
@item IEEE_FLOAT
|
||||||
Define this if the target system uses IEEE-format floating point numbers.
|
Define this if the target system uses IEEE-format floating point numbers.
|
||||||
|
|
||||||
|
@ -1539,6 +1548,10 @@ The number of the ``next program counter'' register, if defined.
|
||||||
The number of the ``next next program counter'' register, if defined.
|
The number of the ``next next program counter'' register, if defined.
|
||||||
Currently, this is only defined for the Motorola 88K.
|
Currently, this is only defined for the Motorola 88K.
|
||||||
|
|
||||||
|
@item PARM_BOUNDARY
|
||||||
|
If non-zero, round arguments to a boundary of this many bits before
|
||||||
|
pushing them on the stack.
|
||||||
|
|
||||||
@item PRINT_REGISTER_HOOK (regno)
|
@item PRINT_REGISTER_HOOK (regno)
|
||||||
If defined, this must be a function that prints the contents of the
|
If defined, this must be a function that prints the contents of the
|
||||||
given register to standard output.
|
given register to standard output.
|
||||||
|
|
160
gdb/dwarf2read.c
160
gdb/dwarf2read.c
|
@ -631,6 +631,10 @@ static struct symbol *new_symbol PARAMS ((struct die_info *, struct type *,
|
||||||
static void dwarf2_const_value PARAMS ((struct attribute *, struct symbol *,
|
static void dwarf2_const_value PARAMS ((struct attribute *, struct symbol *,
|
||||||
struct objfile *));
|
struct objfile *));
|
||||||
|
|
||||||
|
static void dwarf2_const_value_data (struct attribute *attr,
|
||||||
|
struct symbol *sym,
|
||||||
|
int bits);
|
||||||
|
|
||||||
static struct type *die_type PARAMS ((struct die_info *, struct objfile *));
|
static struct type *die_type PARAMS ((struct die_info *, struct objfile *));
|
||||||
|
|
||||||
static struct type *die_containing_type PARAMS ((struct die_info *,
|
static struct type *die_containing_type PARAMS ((struct die_info *,
|
||||||
|
@ -667,8 +671,6 @@ static void dwarf2_attach_fields_to_type PARAMS ((struct field_info *,
|
||||||
struct type *,
|
struct type *,
|
||||||
struct objfile *));
|
struct objfile *));
|
||||||
|
|
||||||
static char *skip_member_fn_name PARAMS ((char *));
|
|
||||||
|
|
||||||
static void dwarf2_add_member_fn PARAMS ((struct field_info *,
|
static void dwarf2_add_member_fn PARAMS ((struct field_info *,
|
||||||
struct die_info *, struct type *,
|
struct die_info *, struct type *,
|
||||||
struct objfile * objfile));
|
struct objfile * objfile));
|
||||||
|
@ -1597,12 +1599,6 @@ read_func_scope (die, objfile)
|
||||||
objfile->ei.entry_func_highpc = highpc;
|
objfile->ei.entry_func_highpc = highpc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (STREQ (name, "main")) /* FIXME: hardwired name */
|
|
||||||
{
|
|
||||||
objfile->ei.main_func_lowpc = lowpc;
|
|
||||||
objfile->ei.main_func_highpc = highpc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decode DW_AT_frame_base location descriptor if present, keep result
|
/* Decode DW_AT_frame_base location descriptor if present, keep result
|
||||||
for DW_OP_fbreg operands in decode_locdesc. */
|
for DW_OP_fbreg operands in decode_locdesc. */
|
||||||
frame_base_reg = -1;
|
frame_base_reg = -1;
|
||||||
|
@ -1854,23 +1850,17 @@ dwarf2_add_field (fip, die, objfile)
|
||||||
else if (die->tag == DW_TAG_variable)
|
else if (die->tag == DW_TAG_variable)
|
||||||
{
|
{
|
||||||
char *physname;
|
char *physname;
|
||||||
char *cp;
|
|
||||||
|
|
||||||
/* C++ static member.
|
/* C++ static member.
|
||||||
Get physical name, extract field name from physical name. */
|
Get name of field. */
|
||||||
physname = dwarf2_linkage_name (die);
|
attr = dwarf_attr (die, DW_AT_name);
|
||||||
if (physname == NULL)
|
if (attr && DW_STRING (attr))
|
||||||
|
fieldname = DW_STRING (attr);
|
||||||
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cp = physname;
|
/* Get physical name. */
|
||||||
while (*cp && !is_cplus_marker (*cp))
|
physname = dwarf2_linkage_name (die);
|
||||||
cp++;
|
|
||||||
if (*cp)
|
|
||||||
fieldname = cp + 1;
|
|
||||||
if (*fieldname == '\0')
|
|
||||||
{
|
|
||||||
complain (&dwarf2_bad_static_member_name, physname);
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
|
SET_FIELD_PHYSNAME (*fp, obsavestring (physname, strlen (physname),
|
||||||
&objfile->type_obstack));
|
&objfile->type_obstack));
|
||||||
|
@ -1980,37 +1970,6 @@ dwarf2_attach_fields_to_type (fip, type, objfile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip to the end of a member function name in a mangled name. */
|
|
||||||
|
|
||||||
static char *
|
|
||||||
skip_member_fn_name (physname)
|
|
||||||
char *physname;
|
|
||||||
{
|
|
||||||
char *endname = physname;
|
|
||||||
|
|
||||||
/* Skip over leading underscores. */
|
|
||||||
while (*endname == '_')
|
|
||||||
endname++;
|
|
||||||
|
|
||||||
/* Find two succesive underscores. */
|
|
||||||
do
|
|
||||||
endname = strchr (endname, '_');
|
|
||||||
while (endname != NULL && *++endname != '_');
|
|
||||||
|
|
||||||
if (endname == NULL)
|
|
||||||
{
|
|
||||||
complain (&dwarf2_bad_member_name_complaint, physname);
|
|
||||||
endname = physname;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Take care of trailing underscores. */
|
|
||||||
if (endname[1] != '_')
|
|
||||||
endname--;
|
|
||||||
}
|
|
||||||
return endname;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add a member function to the proper fieldlist. */
|
/* Add a member function to the proper fieldlist. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2028,46 +1987,15 @@ dwarf2_add_member_fn (fip, die, type, objfile)
|
||||||
char *physname;
|
char *physname;
|
||||||
struct nextfnfield *new_fnfield;
|
struct nextfnfield *new_fnfield;
|
||||||
|
|
||||||
/* Extract member function name from mangled name. */
|
/* Get name of member function. */
|
||||||
physname = dwarf2_linkage_name (die);
|
attr = dwarf_attr (die, DW_AT_name);
|
||||||
if (physname == NULL)
|
if (attr && DW_STRING (attr))
|
||||||
return;
|
fieldname = DW_STRING (attr);
|
||||||
if ((physname[0] == '_' && physname[1] == '_'
|
|
||||||
&& strchr ("0123456789Qt", physname[2]))
|
|
||||||
|| DESTRUCTOR_PREFIX_P (physname))
|
|
||||||
{
|
|
||||||
/* Constructor and destructor field names are set to the name
|
|
||||||
of the class, but without template parameter lists.
|
|
||||||
The name might be missing for anonymous aggregates. */
|
|
||||||
if (TYPE_TAG_NAME (type))
|
|
||||||
{
|
|
||||||
char *p = strchr (TYPE_TAG_NAME (type), '<');
|
|
||||||
|
|
||||||
if (p == NULL)
|
|
||||||
fieldname = TYPE_TAG_NAME (type);
|
|
||||||
else
|
|
||||||
fieldname = obsavestring (TYPE_TAG_NAME (type),
|
|
||||||
p - TYPE_TAG_NAME (type),
|
|
||||||
&objfile->type_obstack);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *anon_name = "";
|
|
||||||
fieldname = obsavestring (anon_name, strlen (anon_name),
|
|
||||||
&objfile->type_obstack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
return;
|
||||||
char *endname = skip_member_fn_name (physname);
|
|
||||||
|
|
||||||
/* Ignore member function if we were unable not extract the member
|
/* Get the mangled name. */
|
||||||
function name. */
|
physname = dwarf2_linkage_name (die);
|
||||||
if (endname == physname)
|
|
||||||
return;
|
|
||||||
fieldname = obsavestring (physname, endname - physname,
|
|
||||||
&objfile->type_obstack);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look up member function name in fieldlist. */
|
/* Look up member function name in fieldlist. */
|
||||||
for (i = 0; i < fip->nfnfields; i++)
|
for (i = 0; i < fip->nfnfields; i++)
|
||||||
|
@ -4095,8 +4023,7 @@ dwarf2_start_subfile (filename, dirname)
|
||||||
to make a symbol table entry for it, and if so, create a new entry
|
to make a symbol table entry for it, and if so, create a new entry
|
||||||
and return a pointer to it.
|
and return a pointer to it.
|
||||||
If TYPE is NULL, determine symbol type from the die, otherwise
|
If TYPE is NULL, determine symbol type from the die, otherwise
|
||||||
used the passed type.
|
used the passed type. */
|
||||||
*/
|
|
||||||
|
|
||||||
static struct symbol *
|
static struct symbol *
|
||||||
new_symbol (die, type, objfile)
|
new_symbol (die, type, objfile)
|
||||||
|
@ -4383,15 +4310,35 @@ dwarf2_const_value (attr, sym, objfile)
|
||||||
memcpy (SYMBOL_VALUE_BYTES (sym), blk->data, blk->size);
|
memcpy (SYMBOL_VALUE_BYTES (sym), blk->data, blk->size);
|
||||||
SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
|
SYMBOL_CLASS (sym) = LOC_CONST_BYTES;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_data2:
|
|
||||||
case DW_FORM_data4:
|
/* The DW_AT_const_value attributes are supposed to carry the
|
||||||
case DW_FORM_data8:
|
symbol's value "represented as it would be on the target
|
||||||
|
architecture." By the time we get here, it's already been
|
||||||
|
converted to host endianness, so we just need to sign- or
|
||||||
|
zero-extend it as appropriate. */
|
||||||
case DW_FORM_data1:
|
case DW_FORM_data1:
|
||||||
|
dwarf2_const_value_data (attr, sym, 8);
|
||||||
|
break;
|
||||||
|
case DW_FORM_data2:
|
||||||
|
dwarf2_const_value_data (attr, sym, 16);
|
||||||
|
break;
|
||||||
|
case DW_FORM_data4:
|
||||||
|
dwarf2_const_value_data (attr, sym, 32);
|
||||||
|
break;
|
||||||
|
case DW_FORM_data8:
|
||||||
|
dwarf2_const_value_data (attr, sym, 64);
|
||||||
|
break;
|
||||||
|
|
||||||
case DW_FORM_sdata:
|
case DW_FORM_sdata:
|
||||||
|
SYMBOL_VALUE (sym) = DW_SND (attr);
|
||||||
|
SYMBOL_CLASS (sym) = LOC_CONST;
|
||||||
|
break;
|
||||||
|
|
||||||
case DW_FORM_udata:
|
case DW_FORM_udata:
|
||||||
SYMBOL_VALUE (sym) = DW_UNSND (attr);
|
SYMBOL_VALUE (sym) = DW_UNSND (attr);
|
||||||
SYMBOL_CLASS (sym) = LOC_CONST;
|
SYMBOL_CLASS (sym) = LOC_CONST;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
complain (&dwarf2_unsupported_const_value_attr,
|
complain (&dwarf2_unsupported_const_value_attr,
|
||||||
dwarf_form_name (attr->form));
|
dwarf_form_name (attr->form));
|
||||||
|
@ -4401,6 +4348,29 @@ dwarf2_const_value (attr, sym, objfile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Given an attr with a DW_FORM_dataN value in host byte order, sign-
|
||||||
|
or zero-extend it as appropriate for the symbol's type. */
|
||||||
|
static void
|
||||||
|
dwarf2_const_value_data (struct attribute *attr,
|
||||||
|
struct symbol *sym,
|
||||||
|
int bits)
|
||||||
|
{
|
||||||
|
LONGEST l = DW_UNSND (attr);
|
||||||
|
|
||||||
|
if (bits < sizeof (l) * 8)
|
||||||
|
{
|
||||||
|
if (TYPE_UNSIGNED (SYMBOL_TYPE (sym)))
|
||||||
|
l &= ((LONGEST) 1 << bits) - 1;
|
||||||
|
else
|
||||||
|
l = (l << (sizeof (l) - bits)) >> (sizeof (l) - bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
SYMBOL_VALUE (sym) = l;
|
||||||
|
SYMBOL_CLASS (sym) = LOC_CONST;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return the type of the die in question using its DW_AT_type attribute. */
|
/* Return the type of the die in question using its DW_AT_type attribute. */
|
||||||
|
|
||||||
static struct type *
|
static struct type *
|
||||||
|
|
|
@ -1866,11 +1866,6 @@ read_func_scope (dip, thisdie, enddie, objfile)
|
||||||
objfile->ei.entry_func_lowpc = dip->at_low_pc;
|
objfile->ei.entry_func_lowpc = dip->at_low_pc;
|
||||||
objfile->ei.entry_func_highpc = dip->at_high_pc;
|
objfile->ei.entry_func_highpc = dip->at_high_pc;
|
||||||
}
|
}
|
||||||
if (STREQ (dip->at_name, "main")) /* FIXME: hardwired name */
|
|
||||||
{
|
|
||||||
objfile->ei.main_func_lowpc = dip->at_low_pc;
|
|
||||||
objfile->ei.main_func_highpc = dip->at_high_pc;
|
|
||||||
}
|
|
||||||
new = push_context (0, dip->at_low_pc);
|
new = push_context (0, dip->at_low_pc);
|
||||||
new->name = new_symbol (dip, objfile);
|
new->name = new_symbol (dip, objfile);
|
||||||
list_in_scope = &local_symbols;
|
list_in_scope = &local_symbols;
|
||||||
|
|
|
@ -1738,9 +1738,8 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
|
||||||
default:
|
default:
|
||||||
/* Removing this case and compiling with gcc -Wall reveals that
|
/* Removing this case and compiling with gcc -Wall reveals that
|
||||||
a lot of cases are hitting this case. Some of these should
|
a lot of cases are hitting this case. Some of these should
|
||||||
probably be removed from expression.h (e.g. do we need a BINOP_SCOPE
|
probably be removed from expression.h; others are legitimate
|
||||||
and an OP_SCOPE?); others are legitimate expressions which are
|
expressions which are (apparently) not fully implemented.
|
||||||
(apparently) not fully implemented.
|
|
||||||
|
|
||||||
If there are any cases landing here which mean a user error,
|
If there are any cases landing here which mean a user error,
|
||||||
then they should be separate cases, with more descriptive
|
then they should be separate cases, with more descriptive
|
||||||
|
|
|
@ -575,8 +575,6 @@ op_name (opcode)
|
||||||
return "BINOP_MIN";
|
return "BINOP_MIN";
|
||||||
case BINOP_MAX:
|
case BINOP_MAX:
|
||||||
return "BINOP_MAX";
|
return "BINOP_MAX";
|
||||||
case BINOP_SCOPE:
|
|
||||||
return "BINOP_SCOPE";
|
|
||||||
case STRUCTOP_MEMBER:
|
case STRUCTOP_MEMBER:
|
||||||
return "STRUCTOP_MEMBER";
|
return "STRUCTOP_MEMBER";
|
||||||
case STRUCTOP_MPTR:
|
case STRUCTOP_MPTR:
|
||||||
|
@ -790,7 +788,6 @@ dump_subexp (exp, stream, elt)
|
||||||
case BINOP_EXP:
|
case BINOP_EXP:
|
||||||
case BINOP_MIN:
|
case BINOP_MIN:
|
||||||
case BINOP_MAX:
|
case BINOP_MAX:
|
||||||
case BINOP_SCOPE:
|
|
||||||
case BINOP_INTDIV:
|
case BINOP_INTDIV:
|
||||||
case BINOP_ASSIGN_MODIFY:
|
case BINOP_ASSIGN_MODIFY:
|
||||||
case BINOP_VAL:
|
case BINOP_VAL:
|
||||||
|
|
|
@ -78,7 +78,6 @@ enum exp_opcode
|
||||||
|
|
||||||
BINOP_MIN, /* <? */
|
BINOP_MIN, /* <? */
|
||||||
BINOP_MAX, /* >? */
|
BINOP_MAX, /* >? */
|
||||||
BINOP_SCOPE, /* :: */
|
|
||||||
|
|
||||||
/* STRUCTOP_MEMBER is used for pointer-to-member constructs.
|
/* STRUCTOP_MEMBER is used for pointer-to-member constructs.
|
||||||
X . * Y translates into X STRUCTOP_MEMBER Y. */
|
X . * Y translates into X STRUCTOP_MEMBER Y. */
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
|
||||||
|
|
||||||
NOTE: The canonical source of this file is maintained with the
|
NOTE: The canonical source of this file is maintained with the
|
||||||
GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
GNU C Library. Bugs can be reported to bug-glibc@gnu.org.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU General Public License as published by the
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc.
|
Copyright (C) 1985,89,90,91,92,93,95,96,97,98 Free Software Foundation, Inc.
|
||||||
|
|
||||||
NOTE: The canonical source of this file is maintained with the
|
NOTE: The canonical source of this file is maintained with the
|
||||||
GNU C Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
GNU C Library. Bugs can be reported to bug-glibc@gnu.org.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
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
|
under the terms of the GNU General Public License as published by the
|
||||||
|
|
|
@ -25,10 +25,17 @@
|
||||||
#include "event-loop.h"
|
#include "event-loop.h"
|
||||||
#include "event-top.h"
|
#include "event-top.h"
|
||||||
#include "inf-loop.h"
|
#include "inf-loop.h"
|
||||||
|
#include "remote.h"
|
||||||
|
|
||||||
static int fetch_inferior_event_wrapper (gdb_client_data client_data);
|
static int fetch_inferior_event_wrapper (gdb_client_data client_data);
|
||||||
static void complete_execution (void);
|
static void complete_execution (void);
|
||||||
|
|
||||||
|
void
|
||||||
|
inferior_event_handler_wrapper (gdb_client_data client_data)
|
||||||
|
{
|
||||||
|
inferior_event_handler (INF_QUIT_REQ, client_data);
|
||||||
|
}
|
||||||
|
|
||||||
/* General function to handle events in the inferior. So far it just
|
/* General function to handle events in the inferior. So far it just
|
||||||
takes care of detecting errors reported by select() or poll(),
|
takes care of detecting errors reported by select() or poll(),
|
||||||
otherwise it assumes that all is OK, and goes on reading data from
|
otherwise it assumes that all is OK, and goes on reading data from
|
||||||
|
@ -71,7 +78,13 @@ inferior_event_handler (enum inferior_event_type event_type,
|
||||||
complete_execution ();
|
complete_execution ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INF_QUIT_REQ:
|
case INF_QUIT_REQ:
|
||||||
|
/* FIXME: ezannoni 1999-10-04. This call should really be a
|
||||||
|
target vector entry, so that it can be used for any kind of
|
||||||
|
targets. */
|
||||||
|
async_remote_interrupt_twice (NULL);
|
||||||
|
break;
|
||||||
|
|
||||||
case INF_TIMER:
|
case INF_TIMER:
|
||||||
default:
|
default:
|
||||||
printf_unfiltered ("Event type not recognized.\n");
|
printf_unfiltered ("Event type not recognized.\n");
|
||||||
|
|
|
@ -24,5 +24,6 @@
|
||||||
|
|
||||||
extern void inferior_event_handler (enum inferior_event_type event_type,
|
extern void inferior_event_handler (enum inferior_event_type event_type,
|
||||||
void* client_data);
|
void* client_data);
|
||||||
|
extern void inferior_event_handler_wrapper (void *client_data);
|
||||||
|
|
||||||
#endif /* #ifndef INF_LOOP_H */
|
#endif /* #ifndef INF_LOOP_H */
|
||||||
|
|
|
@ -854,8 +854,7 @@ symbol_add_stub (arg)
|
||||||
|
|
||||||
section_addrs.text_addr = text_addr;
|
section_addrs.text_addr = text_addr;
|
||||||
so->objfile = symbol_file_add (so->so_name, so->from_tty,
|
so->objfile = symbol_file_add (so->so_name, so->from_tty,
|
||||||
§ion_addrs,
|
§ion_addrs, 0, 0);
|
||||||
0, 0, 0, 0);
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ get_dynamics_objfile ()
|
||||||
{
|
{
|
||||||
if (dynamics_objfile == NULL)
|
if (dynamics_objfile == NULL)
|
||||||
{
|
{
|
||||||
dynamics_objfile = allocate_objfile (NULL, 0, 0, 0);
|
dynamics_objfile = allocate_objfile (NULL, 0);
|
||||||
}
|
}
|
||||||
return dynamics_objfile;
|
return dynamics_objfile;
|
||||||
}
|
}
|
||||||
|
|
|
@ -714,6 +714,6 @@ Options:\n\n\
|
||||||
fputs_unfiltered ("\n\
|
fputs_unfiltered ("\n\
|
||||||
For more information, type \"help\" from within GDB, or consult the\n\
|
For more information, type \"help\" from within GDB, or consult the\n\
|
||||||
GDB manual (available as on-line info or a printed manual).\n\
|
GDB manual (available as on-line info or a printed manual).\n\
|
||||||
Report bugs to \"bug-gdb@prep.ai.mit.edu\".\
|
Report bugs to \"bug-gdb@gnu.org\".\
|
||||||
", stream);
|
", stream);
|
||||||
}
|
}
|
||||||
|
|
279
gdb/monitor.c
279
gdb/monitor.c
|
@ -65,8 +65,8 @@ static int readchar PARAMS ((int timeout));
|
||||||
static void monitor_fetch_register PARAMS ((int regno));
|
static void monitor_fetch_register PARAMS ((int regno));
|
||||||
static void monitor_store_register PARAMS ((int regno));
|
static void monitor_store_register PARAMS ((int regno));
|
||||||
|
|
||||||
static int monitor_printable_string PARAMS ((char *newstr, char *oldstr));
|
static void monitor_printable_string (char *newstr, char *oldstr, int len);
|
||||||
static void monitor_error PARAMS ((char *format, CORE_ADDR memaddr, int len, char *string, int final_char));
|
static void monitor_error (char *function, char *message, CORE_ADDR memaddr, int len, char *string, int final_char);
|
||||||
static void monitor_detach PARAMS ((char *args, int from_tty));
|
static void monitor_detach PARAMS ((char *args, int from_tty));
|
||||||
static void monitor_resume PARAMS ((int pid, int step, enum target_signal sig));
|
static void monitor_resume PARAMS ((int pid, int step, enum target_signal sig));
|
||||||
static void monitor_interrupt PARAMS ((int signo));
|
static void monitor_interrupt PARAMS ((int signo));
|
||||||
|
@ -116,12 +116,6 @@ static void (*ofunc) (); /* Old SIGINT signal handler */
|
||||||
|
|
||||||
static CORE_ADDR *breakaddr;
|
static CORE_ADDR *breakaddr;
|
||||||
|
|
||||||
/* Extra remote debugging for developing a new rom monitor variation */
|
|
||||||
#if ! defined(EXTRA_RDEBUG)
|
|
||||||
#define EXTRA_RDEBUG 0
|
|
||||||
#endif
|
|
||||||
#define RDEBUG(stuff) { if (EXTRA_RDEBUG && remote_debug) printf stuff ; }
|
|
||||||
|
|
||||||
/* Descriptor for I/O to remote machine. Initialize it to NULL so
|
/* Descriptor for I/O to remote machine. Initialize it to NULL so
|
||||||
that monitor_open knows that we don't have a file open when the
|
that monitor_open knows that we don't have a file open when the
|
||||||
program starts. */
|
program starts. */
|
||||||
|
@ -145,19 +139,46 @@ static int first_time = 0; /* is this the first time we're executing after
|
||||||
|
|
||||||
#define TARGET_BUF_SIZE 2048
|
#define TARGET_BUF_SIZE 2048
|
||||||
|
|
||||||
/* Convert a string into a printable representation, Return # byte in the
|
/* Monitor specific debugging information. Typically only useful to
|
||||||
new string. */
|
the developer of a new monitor interface. */
|
||||||
|
|
||||||
static int
|
static void monitor_debug (const char *fmt, ...) ATTR_FORMAT(printf, 1, 2);
|
||||||
monitor_printable_string (newstr, oldstr)
|
|
||||||
char *newstr;
|
static int monitor_debug_p = 0;
|
||||||
char *oldstr;
|
|
||||||
|
/* NOTE: This file alternates between monitor_debug_p and remote_debug
|
||||||
|
when determining if debug information is printed. Perhaphs this
|
||||||
|
could be simplified. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
monitor_debug (const char *fmt, ...)
|
||||||
{
|
{
|
||||||
char *save = newstr;
|
if (monitor_debug_p)
|
||||||
int ch;
|
|
||||||
|
|
||||||
while ((ch = *oldstr++) != '\0')
|
|
||||||
{
|
{
|
||||||
|
va_list args;
|
||||||
|
va_start (args, fmt);
|
||||||
|
vfprintf_filtered (gdb_stdlog, fmt, args);
|
||||||
|
va_end (args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Convert a string into a printable representation, Return # byte in
|
||||||
|
the new string. When LEN is >0 it specifies the size of the
|
||||||
|
string. Otherwize strlen(oldstr) is used. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
monitor_printable_string (char *newstr, char *oldstr, int len)
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (len <= 0)
|
||||||
|
len = strlen (oldstr);
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
ch = oldstr[i];
|
||||||
switch (ch)
|
switch (ch)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
|
@ -203,29 +224,23 @@ monitor_printable_string (newstr, oldstr)
|
||||||
}
|
}
|
||||||
|
|
||||||
*newstr++ = '\0';
|
*newstr++ = '\0';
|
||||||
return newstr - save;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print monitor errors with a string, converting the string to printable
|
/* Print monitor errors with a string, converting the string to printable
|
||||||
representation. */
|
representation. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
monitor_error (format, memaddr, len, string, final_char)
|
monitor_error (char *function, char *message,
|
||||||
char *format;
|
CORE_ADDR memaddr, int len, char *string, int final_char)
|
||||||
CORE_ADDR memaddr;
|
|
||||||
int len;
|
|
||||||
char *string;
|
|
||||||
int final_char;
|
|
||||||
{
|
{
|
||||||
int real_len = (len == 0 && string != (char *) 0) ? strlen (string) : len;
|
int real_len = (len == 0 && string != (char *) 0) ? strlen (string) : len;
|
||||||
char *safe_string = alloca ((real_len * 4) + 1);
|
char *safe_string = alloca ((real_len * 4) + 1);
|
||||||
char *p;
|
monitor_printable_string (safe_string, string, real_len);
|
||||||
int safe_len = monitor_printable_string (safe_string, string);
|
|
||||||
|
|
||||||
if (final_char)
|
if (final_char)
|
||||||
error (format, (int) memaddr, p - safe_string, safe_string, final_char);
|
error ("%s (0x%s): %s: %s%c", function, paddr_nz (memaddr), message, safe_string, final_char);
|
||||||
else
|
else
|
||||||
error (format, (int) memaddr, p - safe_string, safe_string);
|
error ("%s (0x%s): %s: %s", function, paddr_nz (memaddr), message, safe_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert hex digit A to a number. */
|
/* Convert hex digit A to a number. */
|
||||||
|
@ -330,16 +345,11 @@ monitor_printf_noecho (char *pattern,...)
|
||||||
if (len + 1 > sizeof sndbuf)
|
if (len + 1 > sizeof sndbuf)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
#if 0
|
if (monitor_debug_p)
|
||||||
if (remote_debug > 0)
|
|
||||||
puts_debug ("sent -->", sndbuf, "<--");
|
|
||||||
#endif
|
|
||||||
if (EXTRA_RDEBUG
|
|
||||||
&& remote_debug)
|
|
||||||
{
|
{
|
||||||
char *safe_string = (char *) alloca ((strlen (sndbuf) * 4) + 1);
|
char *safe_string = (char *) alloca ((strlen (sndbuf) * 4) + 1);
|
||||||
monitor_printable_string (safe_string, sndbuf);
|
monitor_printable_string (safe_string, sndbuf, 0);
|
||||||
printf ("sent[%s]\n", safe_string);
|
fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor_write (sndbuf, len);
|
monitor_write (sndbuf, len);
|
||||||
|
@ -363,16 +373,11 @@ monitor_printf (char *pattern,...)
|
||||||
if (len + 1 > sizeof sndbuf)
|
if (len + 1 > sizeof sndbuf)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
#if 0
|
if (monitor_debug_p)
|
||||||
if (remote_debug > 0)
|
|
||||||
puts_debug ("sent -->", sndbuf, "<--");
|
|
||||||
#endif
|
|
||||||
if (EXTRA_RDEBUG
|
|
||||||
&& remote_debug)
|
|
||||||
{
|
{
|
||||||
char *safe_string = (char *) alloca ((len * 4) + 1);
|
char *safe_string = (char *) alloca ((len * 4) + 1);
|
||||||
monitor_printable_string (safe_string, sndbuf);
|
monitor_printable_string (safe_string, sndbuf, 0);
|
||||||
printf ("sent[%s]\n", safe_string);
|
fprintf_unfiltered (gdb_stdlog, "sent[%s]\n", safe_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor_write (sndbuf, len);
|
monitor_write (sndbuf, len);
|
||||||
|
@ -381,8 +386,8 @@ monitor_printf (char *pattern,...)
|
||||||
just output, but sometimes some extra junk appeared before the characters
|
just output, but sometimes some extra junk appeared before the characters
|
||||||
we expected, like an extra prompt, or a portmaster sending telnet negotiations.
|
we expected, like an extra prompt, or a portmaster sending telnet negotiations.
|
||||||
So, just start searching for what we sent, and skip anything unknown. */
|
So, just start searching for what we sent, and skip anything unknown. */
|
||||||
RDEBUG (("ExpectEcho\n"))
|
monitor_debug ("ExpectEcho\n");
|
||||||
monitor_expect (sndbuf, (char *) 0, 0);
|
monitor_expect (sndbuf, (char *) 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -454,7 +459,7 @@ readchar (timeout)
|
||||||
c &= 0x7f;
|
c &= 0x7f;
|
||||||
/* This seems to interfere with proper function of the
|
/* This seems to interfere with proper function of the
|
||||||
input stream */
|
input stream */
|
||||||
if (remote_debug > 0)
|
if (monitor_debug_p || remote_debug)
|
||||||
{
|
{
|
||||||
char buf[2];
|
char buf[2];
|
||||||
buf[0] = c;
|
buf[0] = c;
|
||||||
|
@ -522,12 +527,11 @@ monitor_expect (string, buf, buflen)
|
||||||
int c;
|
int c;
|
||||||
extern struct target_ops *targ_ops;
|
extern struct target_ops *targ_ops;
|
||||||
|
|
||||||
if (EXTRA_RDEBUG
|
if (monitor_debug_p)
|
||||||
&& remote_debug)
|
|
||||||
{
|
{
|
||||||
char *safe_string = (char *) alloca ((strlen (string) * 4) + 1);
|
char *safe_string = (char *) alloca ((strlen (string) * 4) + 1);
|
||||||
monitor_printable_string (safe_string, string);
|
monitor_printable_string (safe_string, string, 0);
|
||||||
printf ("MON Expecting '%s'\n", safe_string);
|
fprintf_unfiltered (gdb_stdlog, "MON Expecting '%s'\n", safe_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
immediate_quit = 1;
|
immediate_quit = 1;
|
||||||
|
@ -628,7 +632,7 @@ monitor_expect_regexp (pat, buf, buflen)
|
||||||
{
|
{
|
||||||
char *mybuf;
|
char *mybuf;
|
||||||
char *p;
|
char *p;
|
||||||
RDEBUG (("MON Expecting regexp\n"));
|
monitor_debug ("MON Expecting regexp\n");
|
||||||
if (buf)
|
if (buf)
|
||||||
mybuf = buf;
|
mybuf = buf;
|
||||||
else
|
else
|
||||||
|
@ -679,8 +683,8 @@ monitor_expect_prompt (buf, buflen)
|
||||||
char *buf;
|
char *buf;
|
||||||
int buflen;
|
int buflen;
|
||||||
{
|
{
|
||||||
RDEBUG (("MON Expecting prompt\n"))
|
monitor_debug ("MON Expecting prompt\n");
|
||||||
return monitor_expect (current_monitor->prompt, buf, buflen);
|
return monitor_expect (current_monitor->prompt, buf, buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get N 32-bit words from remote, each preceded by a space, and put
|
/* Get N 32-bit words from remote, each preceded by a space, and put
|
||||||
|
@ -808,7 +812,7 @@ monitor_open (args, mon_ops, from_tty)
|
||||||
monitor_stop ();
|
monitor_stop ();
|
||||||
if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
|
if ((current_monitor->flags & MO_NO_ECHO_ON_OPEN) == 0)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP Open echo\n"));
|
monitor_debug ("EXP Open echo\n");
|
||||||
monitor_expect_prompt (NULL, 0);
|
monitor_expect_prompt (NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -930,7 +934,7 @@ monitor_supply_register (regno, valstr)
|
||||||
val <<= 4;
|
val <<= 4;
|
||||||
val += fromhex (*p++);
|
val += fromhex (*p++);
|
||||||
}
|
}
|
||||||
RDEBUG (("Supplying Register %d %s\n", regno, valstr));
|
monitor_debug ("Supplying Register %d %s\n", regno, valstr);
|
||||||
|
|
||||||
if (*p != '\0')
|
if (*p != '\0')
|
||||||
error ("monitor_supply_register (%d): bad value from monitor: %s.",
|
error ("monitor_supply_register (%d): bad value from monitor: %s.",
|
||||||
|
@ -959,7 +963,7 @@ monitor_resume (pid, step, sig)
|
||||||
enum target_signal sig;
|
enum target_signal sig;
|
||||||
{
|
{
|
||||||
/* Some monitors require a different command when starting a program */
|
/* Some monitors require a different command when starting a program */
|
||||||
RDEBUG (("MON resume\n"));
|
monitor_debug ("MON resume\n");
|
||||||
if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1)
|
if (current_monitor->flags & MO_RUN_FIRST_TIME && first_time == 1)
|
||||||
{
|
{
|
||||||
first_time = 0;
|
first_time = 0;
|
||||||
|
@ -992,8 +996,8 @@ parse_register_dump (buf, len)
|
||||||
char *buf;
|
char *buf;
|
||||||
int len;
|
int len;
|
||||||
{
|
{
|
||||||
RDEBUG (("MON Parsing register dump\n"))
|
monitor_debug ("MON Parsing register dump\n");
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int regnamelen, vallen;
|
int regnamelen, vallen;
|
||||||
char *regname, *val;
|
char *regname, *val;
|
||||||
|
@ -1029,8 +1033,8 @@ monitor_interrupt (signo)
|
||||||
/* If this doesn't work, try more severe steps. */
|
/* If this doesn't work, try more severe steps. */
|
||||||
signal (signo, monitor_interrupt_twice);
|
signal (signo, monitor_interrupt_twice);
|
||||||
|
|
||||||
if (remote_debug)
|
if (monitor_debug_p || remote_debug)
|
||||||
printf_unfiltered ("monitor_interrupt called\n");
|
fprintf_unfiltered (gdb_stdlog, "monitor_interrupt called\n");
|
||||||
|
|
||||||
target_stop ();
|
target_stop ();
|
||||||
}
|
}
|
||||||
|
@ -1096,8 +1100,8 @@ monitor_wait_filter (char *buf,
|
||||||
|
|
||||||
/* Print any output characters that were preceded by ^O. */
|
/* Print any output characters that were preceded by ^O. */
|
||||||
/* FIXME - This would be great as a user settabgle flag */
|
/* FIXME - This would be great as a user settabgle flag */
|
||||||
if (remote_debug ||
|
if (monitor_debug_p || remote_debug
|
||||||
current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
|
|| current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1126,14 +1130,14 @@ monitor_wait (pid, status)
|
||||||
status->value.integer = 0;
|
status->value.integer = 0;
|
||||||
|
|
||||||
old_chain = make_cleanup (monitor_wait_cleanup, &old_timeout);
|
old_chain = make_cleanup (monitor_wait_cleanup, &old_timeout);
|
||||||
RDEBUG (("MON wait\n"))
|
monitor_debug ("MON wait\n");
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* This is somthing other than a maintenance command */
|
/* This is somthing other than a maintenance command */
|
||||||
in_monitor_wait = 1;
|
in_monitor_wait = 1;
|
||||||
timeout = watchdog > 0 ? watchdog : -1;
|
timeout = watchdog > 0 ? watchdog : -1;
|
||||||
#else
|
#else
|
||||||
timeout = -1; /* Don't time out -- user program is running. */
|
timeout = -1; /* Don't time out -- user program is running. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ofunc = (void (*)()) signal (SIGINT, monitor_interrupt);
|
ofunc = (void (*)()) signal (SIGINT, monitor_interrupt);
|
||||||
|
@ -1155,8 +1159,8 @@ monitor_wait (pid, status)
|
||||||
|
|
||||||
/* Print any output characters that were preceded by ^O. */
|
/* Print any output characters that were preceded by ^O. */
|
||||||
/* FIXME - This would be great as a user settabgle flag */
|
/* FIXME - This would be great as a user settabgle flag */
|
||||||
if (remote_debug ||
|
if (monitor_debug_p || remote_debug
|
||||||
current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
|
|| current_monitor->flags & MO_PRINT_PROGRAM_OUTPUT)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1180,7 +1184,7 @@ monitor_wait (pid, status)
|
||||||
if (current_monitor->register_pattern)
|
if (current_monitor->register_pattern)
|
||||||
parse_register_dump (buf, resp_len);
|
parse_register_dump (buf, resp_len);
|
||||||
#else
|
#else
|
||||||
RDEBUG (("Wait fetching registers after stop\n"));
|
monitor_debug ("Wait fetching registers after stop\n");
|
||||||
monitor_dump_regs ();
|
monitor_dump_regs ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1208,12 +1212,12 @@ monitor_fetch_register (regno)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
name = current_monitor->regnames[regno];
|
name = current_monitor->regnames[regno];
|
||||||
RDEBUG (("MON fetchreg %d '%s'\n", regno, name ? name : "(null name)"))
|
monitor_debug ("MON fetchreg %d '%s'\n", regno, name ? name : "(null name)");
|
||||||
|
|
||||||
if (!name || (*name == '\0'))
|
if (!name || (*name == '\0'))
|
||||||
{
|
{
|
||||||
RDEBUG (("No register known for %d\n", regno))
|
monitor_debug ("No register known for %d\n", regno);
|
||||||
supply_register (regno, zerobuf);
|
supply_register (regno, zerobuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1227,13 +1231,13 @@ monitor_fetch_register (regno)
|
||||||
|
|
||||||
if (current_monitor->getreg.resp_delim)
|
if (current_monitor->getreg.resp_delim)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP getreg.resp_delim\n"))
|
monitor_debug ("EXP getreg.resp_delim\n");
|
||||||
monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
|
monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
|
||||||
/* Handle case of first 32 registers listed in pairs. */
|
/* Handle case of first 32 registers listed in pairs. */
|
||||||
if (current_monitor->flags & MO_32_REGS_PAIRED
|
if (current_monitor->flags & MO_32_REGS_PAIRED
|
||||||
&& (regno & 1) != 0 && regno < 32)
|
&& (regno & 1) != 0 && regno < 32)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP getreg.resp_delim\n"));
|
monitor_debug ("EXP getreg.resp_delim\n");
|
||||||
monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
|
monitor_expect (current_monitor->getreg.resp_delim, NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1270,7 +1274,7 @@ monitor_fetch_register (regno)
|
||||||
}
|
}
|
||||||
|
|
||||||
regbuf[i] = '\000'; /* terminate the number */
|
regbuf[i] = '\000'; /* terminate the number */
|
||||||
RDEBUG (("REGVAL '%s'\n", regbuf));
|
monitor_debug ("REGVAL '%s'\n", regbuf);
|
||||||
|
|
||||||
/* If TERM is present, we wait for that to show up. Also, (if TERM
|
/* If TERM is present, we wait for that to show up. Also, (if TERM
|
||||||
is present), we will send TERM_CMD if that is present. In any
|
is present), we will send TERM_CMD if that is present. In any
|
||||||
|
@ -1279,14 +1283,14 @@ monitor_fetch_register (regno)
|
||||||
|
|
||||||
if (current_monitor->getreg.term)
|
if (current_monitor->getreg.term)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP getreg.term\n"))
|
monitor_debug ("EXP getreg.term\n");
|
||||||
monitor_expect (current_monitor->getreg.term, NULL, 0); /* get response */
|
monitor_expect (current_monitor->getreg.term, NULL, 0); /* get response */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_monitor->getreg.term_cmd)
|
if (current_monitor->getreg.term_cmd)
|
||||||
{
|
{
|
||||||
RDEBUG (("EMIT getreg.term.cmd\n"))
|
monitor_debug ("EMIT getreg.term.cmd\n");
|
||||||
monitor_printf (current_monitor->getreg.term_cmd);
|
monitor_printf (current_monitor->getreg.term_cmd);
|
||||||
}
|
}
|
||||||
if (!current_monitor->getreg.term || /* Already expected or */
|
if (!current_monitor->getreg.term || /* Already expected or */
|
||||||
current_monitor->getreg.term_cmd) /* ack expected */
|
current_monitor->getreg.term_cmd) /* ack expected */
|
||||||
|
@ -1335,7 +1339,7 @@ static void
|
||||||
monitor_fetch_registers (regno)
|
monitor_fetch_registers (regno)
|
||||||
int regno;
|
int regno;
|
||||||
{
|
{
|
||||||
RDEBUG (("MON fetchregs\n"));
|
monitor_debug ("MON fetchregs\n");
|
||||||
if (current_monitor->getreg.cmd)
|
if (current_monitor->getreg.cmd)
|
||||||
{
|
{
|
||||||
if (regno >= 0)
|
if (regno >= 0)
|
||||||
|
@ -1365,16 +1369,16 @@ monitor_store_register (regno)
|
||||||
name = current_monitor->regnames[regno];
|
name = current_monitor->regnames[regno];
|
||||||
if (!name || (*name == '\0'))
|
if (!name || (*name == '\0'))
|
||||||
{
|
{
|
||||||
RDEBUG (("MON Cannot store unknown register\n"))
|
monitor_debug ("MON Cannot store unknown register\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
val = read_register (regno);
|
val = read_register (regno);
|
||||||
RDEBUG (("MON storeg %d %08lx\n", regno, (ULONGEST) val))
|
monitor_debug ("MON storeg %d %s\n", regno, preg (val));
|
||||||
|
|
||||||
/* send the register deposit command */
|
/* send the register deposit command */
|
||||||
|
|
||||||
if (current_monitor->flags & MO_REGISTER_VALUE_FIRST)
|
if (current_monitor->flags & MO_REGISTER_VALUE_FIRST)
|
||||||
monitor_printf (current_monitor->setreg.cmd, val, name);
|
monitor_printf (current_monitor->setreg.cmd, val, name);
|
||||||
else if (current_monitor->flags & MO_SETREG_INTERACTIVE)
|
else if (current_monitor->flags & MO_SETREG_INTERACTIVE)
|
||||||
monitor_printf (current_monitor->setreg.cmd, name);
|
monitor_printf (current_monitor->setreg.cmd, name);
|
||||||
|
@ -1383,17 +1387,17 @@ monitor_store_register (regno)
|
||||||
|
|
||||||
if (current_monitor->setreg.term)
|
if (current_monitor->setreg.term)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP setreg.term\n"))
|
monitor_debug ("EXP setreg.term\n");
|
||||||
monitor_expect (current_monitor->setreg.term, NULL, 0);
|
monitor_expect (current_monitor->setreg.term, NULL, 0);
|
||||||
if (current_monitor->flags & MO_SETREG_INTERACTIVE)
|
if (current_monitor->flags & MO_SETREG_INTERACTIVE)
|
||||||
monitor_printf ("%A\r", val);
|
monitor_printf ("%s\r", paddr_nz (val));
|
||||||
monitor_expect_prompt (NULL, 0);
|
monitor_expect_prompt (NULL, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
monitor_expect_prompt (NULL, 0);
|
monitor_expect_prompt (NULL, 0);
|
||||||
if (current_monitor->setreg.term_cmd) /* Mode exit required */
|
if (current_monitor->setreg.term_cmd) /* Mode exit required */
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP setreg_termcmd\n"));
|
monitor_debug ("EXP setreg_termcmd\n");
|
||||||
monitor_printf ("%s", current_monitor->setreg.term_cmd);
|
monitor_printf ("%s", current_monitor->setreg.term_cmd);
|
||||||
monitor_expect_prompt (NULL, 0);
|
monitor_expect_prompt (NULL, 0);
|
||||||
}
|
}
|
||||||
|
@ -1444,9 +1448,9 @@ monitor_write_memory (memaddr, myaddr, len)
|
||||||
char *cmd;
|
char *cmd;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
RDEBUG (("MON write %d %08x\n", len, (unsigned long) memaddr))
|
monitor_debug ("MON write %d %s\n", len, paddr (memaddr));
|
||||||
|
|
||||||
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
||||||
memaddr = ADDR_BITS_REMOVE (memaddr);
|
memaddr = ADDR_BITS_REMOVE (memaddr);
|
||||||
|
|
||||||
/* Use memory fill command for leading 0 bytes. */
|
/* Use memory fill command for leading 0 bytes. */
|
||||||
|
@ -1459,8 +1463,8 @@ monitor_write_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
if (i > 4) /* More than 4 zeros is worth doing */
|
if (i > 4) /* More than 4 zeros is worth doing */
|
||||||
{
|
{
|
||||||
RDEBUG (("MON FILL %d\n", i))
|
monitor_debug ("MON FILL %d\n", i);
|
||||||
if (current_monitor->flags & MO_FILL_USES_ADDR)
|
if (current_monitor->flags & MO_FILL_USES_ADDR)
|
||||||
monitor_printf (current_monitor->fill, memaddr, (memaddr + i) - 1, 0);
|
monitor_printf (current_monitor->fill, memaddr, (memaddr + i) - 1, 0);
|
||||||
else
|
else
|
||||||
monitor_printf (current_monitor->fill, memaddr, i, 0);
|
monitor_printf (current_monitor->fill, memaddr, i, 0);
|
||||||
|
@ -1501,7 +1505,7 @@ monitor_write_memory (memaddr, myaddr, len)
|
||||||
if (len == 4)
|
if (len == 4)
|
||||||
{
|
{
|
||||||
hostval = *(unsigned int *) myaddr;
|
hostval = *(unsigned int *) myaddr;
|
||||||
RDEBUG (("Hostval(%08x) val(%08x)\n", hostval, val));
|
monitor_debug ("Hostval(%08x) val(%08x)\n", hostval, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1514,7 +1518,7 @@ monitor_write_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
if (current_monitor->setmem.term)
|
if (current_monitor->setmem.term)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP setmem.term"));
|
monitor_debug ("EXP setmem.term");
|
||||||
monitor_expect (current_monitor->setmem.term, NULL, 0);
|
monitor_expect (current_monitor->setmem.term, NULL, 0);
|
||||||
monitor_printf ("%x\r", val);
|
monitor_printf ("%x\r", val);
|
||||||
}
|
}
|
||||||
|
@ -1552,9 +1556,9 @@ monitor_write_even_block (memaddr, myaddr, len)
|
||||||
myaddr += 4;
|
myaddr += 4;
|
||||||
memaddr += 4;
|
memaddr += 4;
|
||||||
written += 4;
|
written += 4;
|
||||||
RDEBUG ((" @ %08x\n", memaddr))
|
monitor_debug (" @ %s\n", paddr (memaddr));
|
||||||
/* If we wanted to, here we could validate the address */
|
/* If we wanted to, here we could validate the address */
|
||||||
monitor_expect_prompt (NULL, 0);
|
monitor_expect_prompt (NULL, 0);
|
||||||
}
|
}
|
||||||
/* Now exit the sub mode */
|
/* Now exit the sub mode */
|
||||||
monitor_printf (current_monitor->getreg.term_cmd);
|
monitor_printf (current_monitor->getreg.term_cmd);
|
||||||
|
@ -1754,7 +1758,7 @@ monitor_read_memory_single (memaddr, myaddr, len)
|
||||||
char *cmd;
|
char *cmd;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
RDEBUG (("MON read single\n"));
|
monitor_debug ("MON read single\n");
|
||||||
#if 0
|
#if 0
|
||||||
/* Can't actually use long longs (nice idea, though). In fact, the
|
/* Can't actually use long longs (nice idea, though). In fact, the
|
||||||
call to strtoul below will fail if it tries to convert a value
|
call to strtoul below will fail if it tries to convert a value
|
||||||
|
@ -1792,7 +1796,7 @@ monitor_read_memory_single (memaddr, myaddr, len)
|
||||||
|
|
||||||
if (current_monitor->getmem.resp_delim)
|
if (current_monitor->getmem.resp_delim)
|
||||||
{
|
{
|
||||||
RDEBUG (("EXP getmem.resp_delim\n"));
|
monitor_debug ("EXP getmem.resp_delim\n");
|
||||||
monitor_expect_regexp (&getmem_resp_delim_pattern, NULL, 0);
|
monitor_expect_regexp (&getmem_resp_delim_pattern, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1810,7 +1814,8 @@ monitor_read_memory_single (memaddr, myaddr, len)
|
||||||
if ((c == '0') && ((c = readchar (timeout)) == 'x'))
|
if ((c == '0') && ((c = readchar (timeout)) == 'x'))
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
monitor_error ("monitor_read_memory_single (0x%x): bad response from monitor: %.*s%c.",
|
monitor_error ("monitor_read_memory_single",
|
||||||
|
"bad response from monitor",
|
||||||
memaddr, i, membuf, c);
|
memaddr, i, membuf, c);
|
||||||
}
|
}
|
||||||
for (i = 0; i < len * 2; i++)
|
for (i = 0; i < len * 2; i++)
|
||||||
|
@ -1825,7 +1830,8 @@ monitor_read_memory_single (memaddr, myaddr, len)
|
||||||
if (c == ' ')
|
if (c == ' ')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
monitor_error ("monitor_read_memory_single (0x%x): bad response from monitor: %.*s%c.",
|
monitor_error ("monitor_read_memory_single",
|
||||||
|
"bad response from monitor",
|
||||||
memaddr, i, membuf, c);
|
memaddr, i, membuf, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1855,7 +1861,8 @@ monitor_read_memory_single (memaddr, myaddr, len)
|
||||||
val = strtoul (membuf, &p, 16);
|
val = strtoul (membuf, &p, 16);
|
||||||
|
|
||||||
if (val == 0 && membuf == p)
|
if (val == 0 && membuf == p)
|
||||||
monitor_error ("monitor_read_memory_single (0x%x): bad value from monitor: %s.",
|
monitor_error ("monitor_read_memory_single",
|
||||||
|
"bad value from monitor",
|
||||||
memaddr, 0, membuf, 0);
|
memaddr, 0, membuf, 0);
|
||||||
|
|
||||||
/* supply register stores in target byte order, so swap here */
|
/* supply register stores in target byte order, so swap here */
|
||||||
|
@ -1884,13 +1891,12 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
|
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
RDEBUG (("Zero length call to monitor_read_memory\n"));
|
monitor_debug ("Zero length call to monitor_read_memory\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remote_debug)
|
monitor_debug ("MON read block ta(%s) ha(%lx) %d\n",
|
||||||
printf ("MON read block ta(%08x) ha(%08x) %d\n",
|
paddr_nz (memaddr), (long) myaddr, len);
|
||||||
(unsigned long) memaddr, (unsigned long) myaddr, len);
|
|
||||||
|
|
||||||
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
||||||
memaddr = ADDR_BITS_REMOVE (memaddr);
|
memaddr = ADDR_BITS_REMOVE (memaddr);
|
||||||
|
@ -1931,7 +1937,8 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf); /* get response */
|
resp_len = monitor_expect (current_monitor->getmem.term, buf, sizeof buf); /* get response */
|
||||||
|
|
||||||
if (resp_len <= 0)
|
if (resp_len <= 0)
|
||||||
monitor_error ("monitor_read_memory (0x%x): excessive response from monitor: %.*s.",
|
monitor_error ("monitor_read_memory",
|
||||||
|
"excessive response from monitor",
|
||||||
memaddr, resp_len, buf, 0);
|
memaddr, resp_len, buf, 0);
|
||||||
|
|
||||||
if (current_monitor->getmem.term_cmd)
|
if (current_monitor->getmem.term_cmd)
|
||||||
|
@ -1954,7 +1961,7 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
{
|
{
|
||||||
int retval, tmp;
|
int retval, tmp;
|
||||||
struct re_registers resp_strings;
|
struct re_registers resp_strings;
|
||||||
RDEBUG (("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim));
|
monitor_debug ("MON getmem.resp_delim %s\n", current_monitor->getmem.resp_delim);
|
||||||
|
|
||||||
memset (&resp_strings, 0, sizeof (struct re_registers));
|
memset (&resp_strings, 0, sizeof (struct re_registers));
|
||||||
tmp = strlen (p);
|
tmp = strlen (p);
|
||||||
|
@ -1962,20 +1969,21 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
&resp_strings);
|
&resp_strings);
|
||||||
|
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
monitor_error ("monitor_read_memory (0x%x): bad response from monitor: %.*s.",
|
monitor_error ("monitor_read_memory",
|
||||||
|
"bad response from monitor",
|
||||||
memaddr, resp_len, buf, 0);
|
memaddr, resp_len, buf, 0);
|
||||||
|
|
||||||
p += resp_strings.end[0];
|
p += resp_strings.end[0];
|
||||||
#if 0
|
#if 0
|
||||||
p = strstr (p, current_monitor->getmem.resp_delim);
|
p = strstr (p, current_monitor->getmem.resp_delim);
|
||||||
if (!p)
|
if (!p)
|
||||||
monitor_error ("monitor_read_memory (0x%x): bad response from monitor: %.*s.",
|
monitor_error ("monitor_read_memory",
|
||||||
|
"bad response from monitor",
|
||||||
memaddr, resp_len, buf, 0);
|
memaddr, resp_len, buf, 0);
|
||||||
p += strlen (current_monitor->getmem.resp_delim);
|
p += strlen (current_monitor->getmem.resp_delim);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (remote_debug)
|
monitor_debug ("MON scanning %d ,%lx '%s'\n", len, (long) p, p);
|
||||||
printf ("MON scanning %d ,%08x '%s'\n", len, p, p);
|
|
||||||
if (current_monitor->flags & MO_GETMEM_16_BOUNDARY)
|
if (current_monitor->flags & MO_GETMEM_16_BOUNDARY)
|
||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
|
@ -1992,8 +2000,8 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
{
|
{
|
||||||
val = fromhex (c) * 16 + fromhex (*(p + 1));
|
val = fromhex (c) * 16 + fromhex (*(p + 1));
|
||||||
*myaddr++ = val;
|
*myaddr++ = val;
|
||||||
if (remote_debug)
|
if (monitor_debug_p || remote_debug)
|
||||||
printf ("[%02x]", val);
|
fprintf_unfiltered (gdb_stdlog, "[%02x]", val);
|
||||||
--i;
|
--i;
|
||||||
fetched++;
|
fetched++;
|
||||||
}
|
}
|
||||||
|
@ -2005,11 +2013,11 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
}
|
}
|
||||||
if (fetched == 0)
|
if (fetched == 0)
|
||||||
error ("Failed to read via monitor");
|
error ("Failed to read via monitor");
|
||||||
if (remote_debug)
|
if (monitor_debug_p || remote_debug)
|
||||||
printf ("\n");
|
fprintf_unfiltered (gdb_stdlog, "\n");
|
||||||
return fetched; /* Return the number of bytes actually read */
|
return fetched; /* Return the number of bytes actually read */
|
||||||
}
|
}
|
||||||
RDEBUG (("MON scanning bytes\n"));
|
monitor_debug ("MON scanning bytes\n");
|
||||||
|
|
||||||
for (i = len; i > 0; i--)
|
for (i = len; i > 0; i--)
|
||||||
{
|
{
|
||||||
|
@ -2021,7 +2029,8 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (*p == '\000' || *p == '\n' || *p == '\r')
|
if (*p == '\000' || *p == '\n' || *p == '\r')
|
||||||
monitor_error ("monitor_read_memory (0x%x): badly terminated response from monitor: %.*s",
|
monitor_error ("monitor_read_memory",
|
||||||
|
"badly terminated response from monitor",
|
||||||
memaddr, resp_len, buf, 0);
|
memaddr, resp_len, buf, 0);
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
@ -2029,7 +2038,8 @@ monitor_read_memory (memaddr, myaddr, len)
|
||||||
val = strtoul (p, &p1, 16);
|
val = strtoul (p, &p1, 16);
|
||||||
|
|
||||||
if (val == 0 && p == p1)
|
if (val == 0 && p == p1)
|
||||||
monitor_error ("monitor_read_memory (0x%x): bad value from monitor: %.*s.",
|
monitor_error ("monitor_read_memory",
|
||||||
|
"bad value from monitor",
|
||||||
memaddr, resp_len, buf, 0);
|
memaddr, resp_len, buf, 0);
|
||||||
|
|
||||||
*myaddr++ = val;
|
*myaddr++ = val;
|
||||||
|
@ -2100,8 +2110,8 @@ monitor_insert_breakpoint (addr, shadow)
|
||||||
unsigned char *bp;
|
unsigned char *bp;
|
||||||
int bplen;
|
int bplen;
|
||||||
|
|
||||||
RDEBUG (("MON inst bkpt %08x\n", addr))
|
monitor_debug ("MON inst bkpt %s\n", paddr (addr));
|
||||||
if (current_monitor->set_break == NULL)
|
if (current_monitor->set_break == NULL)
|
||||||
error ("No set_break defined for this monitor");
|
error ("No set_break defined for this monitor");
|
||||||
|
|
||||||
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
||||||
|
@ -2134,8 +2144,8 @@ monitor_remove_breakpoint (addr, shadow)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
RDEBUG (("MON rmbkpt %08x\n", addr))
|
monitor_debug ("MON rmbkpt %s\n", paddr (addr));
|
||||||
if (current_monitor->clr_break == NULL)
|
if (current_monitor->clr_break == NULL)
|
||||||
error ("No clr_break defined for this monitor");
|
error ("No clr_break defined for this monitor");
|
||||||
|
|
||||||
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
if (current_monitor->flags & MO_ADDR_BITS_REMOVE)
|
||||||
|
@ -2158,7 +2168,8 @@ monitor_remove_breakpoint (addr, shadow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Can't find breakpoint associated with 0x%x\n", addr);
|
"Can't find breakpoint associated with 0x%s\n",
|
||||||
|
paddr_nz (addr));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2197,9 +2208,9 @@ monitor_load (file, from_tty)
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
dcache_flush (remote_dcache);
|
dcache_flush (remote_dcache);
|
||||||
RDEBUG (("MON load\n"))
|
monitor_debug ("MON load\n");
|
||||||
|
|
||||||
if (current_monitor->load_routine)
|
if (current_monitor->load_routine)
|
||||||
current_monitor->load_routine (monitor_desc, file, hashmark);
|
current_monitor->load_routine (monitor_desc, file, hashmark);
|
||||||
else
|
else
|
||||||
{ /* The default is ascii S-records */
|
{ /* The default is ascii S-records */
|
||||||
|
@ -2245,7 +2256,7 @@ monitor_load (file, from_tty)
|
||||||
static void
|
static void
|
||||||
monitor_stop ()
|
monitor_stop ()
|
||||||
{
|
{
|
||||||
RDEBUG (("MON stop\n"));
|
monitor_debug ("MON stop\n");
|
||||||
if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0)
|
if ((current_monitor->flags & MO_SEND_BREAK_ON_STOP) != 0)
|
||||||
SERIAL_SEND_BREAK (monitor_desc);
|
SERIAL_SEND_BREAK (monitor_desc);
|
||||||
if (current_monitor->stop)
|
if (current_monitor->stop)
|
||||||
|
@ -2398,4 +2409,16 @@ _initialize_remote_monitors ()
|
||||||
When enabled, a hashmark \'#\' is displayed.",
|
When enabled, a hashmark \'#\' is displayed.",
|
||||||
&setlist),
|
&setlist),
|
||||||
&showlist);
|
&showlist);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* FIXME: cagney/1999-10-07: Wait until there is a generic ``set
|
||||||
|
debug ...'' rather than another ``set ...debug'' command. */
|
||||||
|
add_show_from_set
|
||||||
|
(add_set_cmd ("monitordebug", no_class, var_zinteger,
|
||||||
|
(char *) &monitor_debug_p,
|
||||||
|
"Set debugging of remote monitor communication.\n\
|
||||||
|
When enabled, communication between GDB and the remote monitor\n\
|
||||||
|
is displayed.", &setlist),
|
||||||
|
&showlist);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ static int
|
||||||
open_existing_mapped_file PARAMS ((char *, long, int));
|
open_existing_mapped_file PARAMS ((char *, long, int));
|
||||||
|
|
||||||
static int
|
static int
|
||||||
open_mapped_file PARAMS ((char *filename, long mtime, int mapped));
|
open_mapped_file PARAMS ((char *filename, long mtime, int flags));
|
||||||
|
|
||||||
static PTR
|
static PTR
|
||||||
map_to_file PARAMS ((int));
|
map_to_file PARAMS ((int));
|
||||||
|
@ -140,29 +140,27 @@ build_objfile_section_table (objfile)
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a pointer to an initialized bfd (ABFD) and a flag that indicates
|
/* Given a pointer to an initialized bfd (ABFD) and some flag bits
|
||||||
whether or not an objfile is to be mapped (MAPPED), allocate a new objfile
|
allocate a new objfile struct, fill it in as best we can, link it
|
||||||
struct, fill it in as best we can, link it into the list of all known
|
into the list of all known objfiles, and return a pointer to the
|
||||||
objfiles, and return a pointer to the new objfile struct.
|
new objfile struct.
|
||||||
|
|
||||||
USER_LOADED is simply recorded in the objfile. This record offers a way for
|
The FLAGS word contains various bits (OBJF_*) that can be taken as
|
||||||
run_command to remove old objfile entries which are no longer valid (i.e.,
|
requests for specific operations, like trying to open a mapped
|
||||||
are associated with an old inferior), but to preserve ones that the user
|
version of the objfile (OBJF_MAPPED). Other bits like
|
||||||
explicitly loaded via the add-symbol-file command.
|
OBJF_SHARED are simply copied through to the new objfile flags
|
||||||
|
member. */
|
||||||
IS_SOLIB is also simply recorded in the objfile. */
|
|
||||||
|
|
||||||
struct objfile *
|
struct objfile *
|
||||||
allocate_objfile (abfd, mapped, user_loaded, is_solib)
|
allocate_objfile (abfd, flags)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
int mapped;
|
int flags;
|
||||||
int user_loaded;
|
|
||||||
int is_solib;
|
|
||||||
{
|
{
|
||||||
struct objfile *objfile = NULL;
|
struct objfile *objfile = NULL;
|
||||||
struct objfile *last_one = NULL;
|
struct objfile *last_one = NULL;
|
||||||
|
|
||||||
mapped |= mapped_symbol_files;
|
if (mapped_symbol_files)
|
||||||
|
flags |= OBJF_MAPPED;
|
||||||
|
|
||||||
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
|
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
|
||||||
if (abfd != NULL)
|
if (abfd != NULL)
|
||||||
|
@ -181,7 +179,7 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib)
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
|
fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
|
||||||
mapped);
|
flags);
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
PTR md;
|
PTR md;
|
||||||
|
@ -241,15 +239,16 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mapped && (objfile == NULL))
|
if ((flags & OBJF_MAPPED) && (objfile == NULL))
|
||||||
{
|
{
|
||||||
warning ("symbol table for '%s' will not be mapped",
|
warning ("symbol table for '%s' will not be mapped",
|
||||||
bfd_get_filename (abfd));
|
bfd_get_filename (abfd));
|
||||||
|
flags &= ~OBJF_MAPPED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */
|
#else /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */
|
||||||
|
|
||||||
if (mapped)
|
if (flags & OBJF_MAPPED)
|
||||||
{
|
{
|
||||||
warning ("mapped symbol tables are not supported on this machine; missing or broken mmap().");
|
warning ("mapped symbol tables are not supported on this machine; missing or broken mmap().");
|
||||||
|
|
||||||
|
@ -258,6 +257,7 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib)
|
||||||
"mapped" keyword again. */
|
"mapped" keyword again. */
|
||||||
|
|
||||||
mapped_symbol_files = 0;
|
mapped_symbol_files = 0;
|
||||||
|
flags &= ~OBJF_MAPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
|
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
|
||||||
|
@ -279,6 +279,7 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib)
|
||||||
free);
|
free);
|
||||||
obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
|
obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
|
||||||
free);
|
free);
|
||||||
|
flags &= ~OBJF_MAPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the per-objfile information that comes from the bfd, ensuring
|
/* Update the per-objfile information that comes from the bfd, ensuring
|
||||||
|
@ -317,13 +318,8 @@ allocate_objfile (abfd, mapped, user_loaded, is_solib)
|
||||||
last_one->next = objfile;
|
last_one->next = objfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Record whether this objfile was created because the user explicitly
|
/* Save passed in flag bits. */
|
||||||
caused it (e.g., used the add-symbol-file command).
|
objfile->flags |= flags;
|
||||||
*/
|
|
||||||
objfile->user_loaded = user_loaded;
|
|
||||||
|
|
||||||
/* Record whether this objfile definitely represents a solib. */
|
|
||||||
objfile->is_solib = is_solib;
|
|
||||||
|
|
||||||
return (objfile);
|
return (objfile);
|
||||||
}
|
}
|
||||||
|
@ -751,7 +747,7 @@ objfile_purge_solibs ()
|
||||||
/* We assume that the solib package has been purged already, or will
|
/* We assume that the solib package has been purged already, or will
|
||||||
be soon.
|
be soon.
|
||||||
*/
|
*/
|
||||||
if (!objf->user_loaded && objf->is_solib)
|
if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
|
||||||
free_objfile (objf);
|
free_objfile (objf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -798,10 +794,10 @@ have_minimal_symbols ()
|
||||||
Otherwise, returns the open file descriptor. */
|
Otherwise, returns the open file descriptor. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
open_existing_mapped_file (symsfilename, mtime, mapped)
|
open_existing_mapped_file (symsfilename, mtime, flags)
|
||||||
char *symsfilename;
|
char *symsfilename;
|
||||||
long mtime;
|
long mtime;
|
||||||
int mapped;
|
int flags;
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
struct stat sbuf;
|
struct stat sbuf;
|
||||||
|
@ -810,7 +806,7 @@ open_existing_mapped_file (symsfilename, mtime, mapped)
|
||||||
{
|
{
|
||||||
if (sbuf.st_mtime < mtime)
|
if (sbuf.st_mtime < mtime)
|
||||||
{
|
{
|
||||||
if (!mapped)
|
if (!(flags & OBJF_MAPPED))
|
||||||
{
|
{
|
||||||
warning ("mapped symbol file `%s' is out of date, ignored it",
|
warning ("mapped symbol file `%s' is out of date, ignored it",
|
||||||
symsfilename);
|
symsfilename);
|
||||||
|
@ -853,10 +849,10 @@ open_existing_mapped_file (symsfilename, mtime, mapped)
|
||||||
/bin for example). */
|
/bin for example). */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
open_mapped_file (filename, mtime, mapped)
|
open_mapped_file (filename, mtime, flags)
|
||||||
char *filename;
|
char *filename;
|
||||||
long mtime;
|
long mtime;
|
||||||
int mapped;
|
int flags;
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
char *symsfilename;
|
char *symsfilename;
|
||||||
|
@ -865,7 +861,7 @@ open_mapped_file (filename, mtime, mapped)
|
||||||
then try the directory where the symbol file is located. */
|
then try the directory where the symbol file is located. */
|
||||||
|
|
||||||
symsfilename = concat ("./", basename (filename), ".syms", (char *) NULL);
|
symsfilename = concat ("./", basename (filename), ".syms", (char *) NULL);
|
||||||
if ((fd = open_existing_mapped_file (symsfilename, mtime, mapped)) < 0)
|
if ((fd = open_existing_mapped_file (symsfilename, mtime, flags)) < 0)
|
||||||
{
|
{
|
||||||
free (symsfilename);
|
free (symsfilename);
|
||||||
symsfilename = concat (filename, ".syms", (char *) NULL);
|
symsfilename = concat (filename, ".syms", (char *) NULL);
|
||||||
|
|
|
@ -232,22 +232,6 @@ struct objfile
|
||||||
|
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
/* TRUE if this objfile was created because the user explicitly caused
|
|
||||||
it (e.g., used the add-symbol-file command).
|
|
||||||
*/
|
|
||||||
int user_loaded;
|
|
||||||
|
|
||||||
/* TRUE if this objfile was explicitly created to represent a solib.
|
|
||||||
|
|
||||||
(If FALSE, the objfile may actually be a solib. This can happen if
|
|
||||||
the user created the objfile by using the add-symbol-file command.
|
|
||||||
GDB doesn't in that situation actually check whether the file is a
|
|
||||||
solib. Rather, the target's implementation of the solib interface
|
|
||||||
is responsible for setting this flag when noticing solibs used by
|
|
||||||
an inferior.)
|
|
||||||
*/
|
|
||||||
int is_solib;
|
|
||||||
|
|
||||||
/* Some flag bits for this objfile. */
|
/* Some flag bits for this objfile. */
|
||||||
|
|
||||||
unsigned short flags;
|
unsigned short flags;
|
||||||
|
@ -430,8 +414,13 @@ struct objfile
|
||||||
|
|
||||||
#define OBJF_REORDERED (1 << 2) /* Functions are reordered */
|
#define OBJF_REORDERED (1 << 2) /* Functions are reordered */
|
||||||
|
|
||||||
/* Distinguish between an objfile for a shared library and a
|
/* Distinguish between an objfile for a shared library and a "vanilla"
|
||||||
"vanilla" objfile. */
|
objfile. (If not set, the objfile may still actually be a solib.
|
||||||
|
This can happen if the user created the objfile by using the
|
||||||
|
add-symbol-file command. GDB doesn't in that situation actually
|
||||||
|
check whether the file is a solib. Rather, the target's
|
||||||
|
implementation of the solib interface is responsible for setting
|
||||||
|
this flag when noticing solibs used by an inferior.) */
|
||||||
|
|
||||||
#define OBJF_SHARED (1 << 3) /* From a shared library */
|
#define OBJF_SHARED (1 << 3) /* From a shared library */
|
||||||
|
|
||||||
|
@ -439,6 +428,15 @@ struct objfile
|
||||||
|
|
||||||
#define OBJF_READNOW (1 << 4) /* Immediate full read */
|
#define OBJF_READNOW (1 << 4) /* Immediate full read */
|
||||||
|
|
||||||
|
/* This objfile was created because the user explicitly caused it
|
||||||
|
(e.g., used the add-symbol-file command). This bit offers a way
|
||||||
|
for run_command to remove old objfile entries which are no longer
|
||||||
|
valid (i.e., are associated with an old inferior), but to preserve
|
||||||
|
ones that the user explicitly loaded via the add-symbol-file
|
||||||
|
command. */
|
||||||
|
|
||||||
|
#define OBJF_USERLOADED (1 << 5) /* User loaded */
|
||||||
|
|
||||||
/* The object file that the main symbol table was loaded from (e.g. the
|
/* The object file that the main symbol table was loaded from (e.g. the
|
||||||
argument to the "symbol-file" or "file" command). */
|
argument to the "symbol-file" or "file" command). */
|
||||||
|
|
||||||
|
@ -472,7 +470,7 @@ extern struct objfile *object_files;
|
||||||
/* Declarations for functions defined in objfiles.c */
|
/* Declarations for functions defined in objfiles.c */
|
||||||
|
|
||||||
extern struct objfile *
|
extern struct objfile *
|
||||||
allocate_objfile PARAMS ((bfd *, int, int, int));
|
allocate_objfile PARAMS ((bfd *, int));
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
build_objfile_section_table PARAMS ((struct objfile *));
|
build_objfile_section_table PARAMS ((struct objfile *));
|
||||||
|
|
|
@ -600,8 +600,7 @@ symbol_add_stub (arg)
|
||||||
|
|
||||||
section_addrs.text_addr = text_addr;
|
section_addrs.text_addr = text_addr;
|
||||||
so->objfile = symbol_file_add (so->so_name, so->from_tty,
|
so->objfile = symbol_file_add (so->so_name, so->from_tty,
|
||||||
§ion_addrs,
|
§ion_addrs, 0, OBJF_SHARED);
|
||||||
0, 0, 0, 1);
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,7 @@ pa64_solib_add_solib_objfile (so, name, from_tty, text_addr)
|
||||||
|
|
||||||
/* Now let the generic code load up symbols for this library. */
|
/* Now let the generic code load up symbols for this library. */
|
||||||
section_addrs.text_addr = text_addr;
|
section_addrs.text_addr = text_addr;
|
||||||
so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, 0, 0, 1);
|
so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, OBJF_SHARED);
|
||||||
so->abfd = so->objfile->obfd;
|
so->abfd = so->objfile->obfd;
|
||||||
|
|
||||||
/* Mark this as a shared library and save private data. */
|
/* Mark this as a shared library and save private data. */
|
||||||
|
|
67
gdb/parse.c
67
gdb/parse.c
|
@ -43,6 +43,21 @@
|
||||||
#include "parser-defs.h"
|
#include "parser-defs.h"
|
||||||
#include "gdbcmd.h"
|
#include "gdbcmd.h"
|
||||||
#include "symfile.h" /* for overlay functions */
|
#include "symfile.h" /* for overlay functions */
|
||||||
|
|
||||||
|
/* Symbols which architectures can redefine. */
|
||||||
|
|
||||||
|
/* Some systems have routines whose names start with `$'. Giving this
|
||||||
|
macro a non-zero value tells GDB's expression parser to check for
|
||||||
|
such routines when parsing tokens that begin with `$'.
|
||||||
|
|
||||||
|
On HP-UX, certain system routines (millicode) have names beginning
|
||||||
|
with `$' or `$$'. For example, `$$dyncall' is a millicode routine
|
||||||
|
that handles inter-space procedure calls on PA-RISC. */
|
||||||
|
#ifndef SYMBOLS_CAN_START_WITH_DOLLAR
|
||||||
|
#define SYMBOLS_CAN_START_WITH_DOLLAR (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Global variables declared in parser-defs.h (and commented there). */
|
/* Global variables declared in parser-defs.h (and commented there). */
|
||||||
struct expression *expout;
|
struct expression *expout;
|
||||||
|
@ -460,9 +475,6 @@ write_dollar_variable (str)
|
||||||
/* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
|
/* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
|
||||||
and $$digits (equivalent to $<-digits> if you could type that). */
|
and $$digits (equivalent to $<-digits> if you could type that). */
|
||||||
|
|
||||||
struct symbol *sym = NULL;
|
|
||||||
struct minimal_symbol *msym = NULL;
|
|
||||||
|
|
||||||
int negate = 0;
|
int negate = 0;
|
||||||
int i = 1;
|
int i = 1;
|
||||||
/* Double dollar means negate the number and add -1 as well.
|
/* Double dollar means negate the number and add -1 as well.
|
||||||
|
@ -496,27 +508,36 @@ write_dollar_variable (str)
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
goto handle_register;
|
goto handle_register;
|
||||||
|
|
||||||
/* On HP-UX, certain system routines (millicode) have names beginning
|
if (SYMBOLS_CAN_START_WITH_DOLLAR)
|
||||||
with $ or $$, e.g. $$dyncall, which handles inter-space procedure
|
{
|
||||||
calls on PA-RISC. Check for those, first. */
|
struct symbol *sym = NULL;
|
||||||
|
struct minimal_symbol *msym = NULL;
|
||||||
|
|
||||||
sym = lookup_symbol (copy_name (str), (struct block *) NULL,
|
/* On HP-UX, certain system routines (millicode) have names beginning
|
||||||
VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL);
|
with $ or $$, e.g. $$dyncall, which handles inter-space procedure
|
||||||
if (sym)
|
calls on PA-RISC. Check for those, first. */
|
||||||
{
|
|
||||||
write_exp_elt_opcode (OP_VAR_VALUE);
|
/* This code is not enabled on non HP-UX systems, since worst case
|
||||||
write_exp_elt_block (block_found); /* set by lookup_symbol */
|
symbol table lookup performance is awful, to put it mildly. */
|
||||||
write_exp_elt_sym (sym);
|
|
||||||
write_exp_elt_opcode (OP_VAR_VALUE);
|
sym = lookup_symbol (copy_name (str), (struct block *) NULL,
|
||||||
return;
|
VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL);
|
||||||
}
|
if (sym)
|
||||||
msym = lookup_minimal_symbol (copy_name (str), NULL, NULL);
|
{
|
||||||
if (msym)
|
write_exp_elt_opcode (OP_VAR_VALUE);
|
||||||
{
|
write_exp_elt_block (block_found); /* set by lookup_symbol */
|
||||||
write_exp_msymbol (msym,
|
write_exp_elt_sym (sym);
|
||||||
lookup_function_type (builtin_type_int),
|
write_exp_elt_opcode (OP_VAR_VALUE);
|
||||||
builtin_type_int);
|
return;
|
||||||
return;
|
}
|
||||||
|
msym = lookup_minimal_symbol (copy_name (str), NULL, NULL);
|
||||||
|
if (msym)
|
||||||
|
{
|
||||||
|
write_exp_msymbol (msym,
|
||||||
|
lookup_function_type (builtin_type_int),
|
||||||
|
builtin_type_int);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Any other names starting in $ are debugger internal variables. */
|
/* Any other names starting in $ are debugger internal variables. */
|
||||||
|
|
|
@ -1118,7 +1118,7 @@ mm_load (arg_string, from_tty)
|
||||||
/* You may need to do an init_target_mm() */
|
/* You may need to do an init_target_mm() */
|
||||||
/* init_target_mm(?,?,?,?,?,?,?,?); */
|
/* init_target_mm(?,?,?,?,?,?,?,?); */
|
||||||
immediate_quit--;
|
immediate_quit--;
|
||||||
/* symbol_file_add (arg_string, from_tty, text_addr, 0, 0, 0, 0); */
|
/* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1316,7 +1316,7 @@ udi_load (args, from_tty)
|
||||||
/* As a convenience, pick up any symbol info that is in the program
|
/* As a convenience, pick up any symbol info that is in the program
|
||||||
being loaded. Note that we assume that the program is the``mainline'';
|
being loaded. Note that we assume that the program is the``mainline'';
|
||||||
if this is not always true, then this code will need to be augmented. */
|
if this is not always true, then this code will need to be augmented. */
|
||||||
symbol_file_add (strtok (args, " \t"), from_tty, NULL, 1, 0, 0, 0);
|
symbol_file_add (strtok (args, " \t"), from_tty, NULL, 1, 0);
|
||||||
|
|
||||||
/* Getting new symbols may change our opinion about what is
|
/* Getting new symbols may change our opinion about what is
|
||||||
frameless. */
|
frameless. */
|
||||||
|
|
|
@ -701,7 +701,7 @@ vx_add_symbols (name, from_tty, text_addr, data_addr, bss_addr)
|
||||||
|
|
||||||
/* It might be nice to suppress the breakpoint_re_set which happens here
|
/* It might be nice to suppress the breakpoint_re_set which happens here
|
||||||
because we are going to do one again after the objfile_relocate. */
|
because we are going to do one again after the objfile_relocate. */
|
||||||
objfile = symbol_file_add (name, from_tty, NULL, 0, 0, 0, 0);
|
objfile = symbol_file_add (name, from_tty, NULL, 0, 0);
|
||||||
|
|
||||||
/* This is a (slightly cheesy) way of superceding the old symbols. A less
|
/* This is a (slightly cheesy) way of superceding the old symbols. A less
|
||||||
cheesy way would be to find the objfile with the same name and
|
cheesy way would be to find the objfile with the same name and
|
||||||
|
|
46
gdb/remote.c
46
gdb/remote.c
|
@ -60,7 +60,7 @@ static void initialize_sigint_signal_handler (void);
|
||||||
static void handle_remote_sigint PARAMS ((int));
|
static void handle_remote_sigint PARAMS ((int));
|
||||||
static void handle_remote_sigint_twice PARAMS ((int));
|
static void handle_remote_sigint_twice PARAMS ((int));
|
||||||
static void async_remote_interrupt PARAMS ((gdb_client_data));
|
static void async_remote_interrupt PARAMS ((gdb_client_data));
|
||||||
static void async_remote_interrupt_twice PARAMS ((gdb_client_data));
|
void async_remote_interrupt_twice PARAMS ((gdb_client_data));
|
||||||
|
|
||||||
static void build_remote_gdbarch_data PARAMS ((void));
|
static void build_remote_gdbarch_data PARAMS ((void));
|
||||||
|
|
||||||
|
@ -166,6 +166,8 @@ static int remote_query PARAMS ((int /*char */ , char *, char *, int *));
|
||||||
|
|
||||||
static int hexnumstr PARAMS ((char *, ULONGEST));
|
static int hexnumstr PARAMS ((char *, ULONGEST));
|
||||||
|
|
||||||
|
static int hexnumnstr PARAMS ((char *, ULONGEST, int));
|
||||||
|
|
||||||
static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR));
|
static CORE_ADDR remote_address_masked PARAMS ((CORE_ADDR));
|
||||||
|
|
||||||
static void print_packet PARAMS ((char *));
|
static void print_packet PARAMS ((char *));
|
||||||
|
@ -2106,7 +2108,7 @@ handle_remote_sigint_twice (sig)
|
||||||
{
|
{
|
||||||
signal (sig, handle_sigint);
|
signal (sig, handle_sigint);
|
||||||
sigint_remote_twice_token =
|
sigint_remote_twice_token =
|
||||||
create_async_signal_handler (async_remote_interrupt_twice, NULL);
|
create_async_signal_handler (inferior_event_handler_wrapper, NULL);
|
||||||
mark_async_signal_handler_wrapper (sigint_remote_twice_token);
|
mark_async_signal_handler_wrapper (sigint_remote_twice_token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2124,10 +2126,12 @@ async_remote_interrupt (arg)
|
||||||
|
|
||||||
/* Perform interrupt, if the first attempt did not succeed. Just give
|
/* Perform interrupt, if the first attempt did not succeed. Just give
|
||||||
up on the target alltogether. */
|
up on the target alltogether. */
|
||||||
static void
|
void
|
||||||
async_remote_interrupt_twice (arg)
|
async_remote_interrupt_twice (arg)
|
||||||
gdb_client_data arg;
|
gdb_client_data arg;
|
||||||
{
|
{
|
||||||
|
if (remote_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "remote_interrupt_twice called\n");
|
||||||
/* Do something only if the target was not killed by the previous
|
/* Do something only if the target was not killed by the previous
|
||||||
cntl-C. */
|
cntl-C. */
|
||||||
if (target_executing)
|
if (target_executing)
|
||||||
|
@ -2962,25 +2966,37 @@ hexnumlen (num)
|
||||||
return max (i, 1);
|
return max (i, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set BUF to the hex digits representing NUM. */
|
/* Set BUF to the minimum number of hex digits representing NUM. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hexnumstr (buf, num)
|
hexnumstr (buf, num)
|
||||||
char *buf;
|
char *buf;
|
||||||
ULONGEST num;
|
ULONGEST num;
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
int len = hexnumlen (num);
|
int len = hexnumlen (num);
|
||||||
|
return hexnumnstr (buf, num, len);
|
||||||
|
}
|
||||||
|
|
||||||
buf[len] = '\0';
|
|
||||||
|
|
||||||
for (i = len - 1; i >= 0; i--)
|
/* Set BUF to the hex digits representing NUM, padded to WIDTH characters. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
hexnumnstr (buf, num, width)
|
||||||
|
char *buf;
|
||||||
|
ULONGEST num;
|
||||||
|
int width;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
buf[width] = '\0';
|
||||||
|
|
||||||
|
for (i = width - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
buf[i] = "0123456789abcdef"[(num & 0xf)];
|
buf[i] = "0123456789abcdef"[(num & 0xf)];
|
||||||
num >>= 4;
|
num >>= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
|
/* Mask all but the least significant REMOTE_ADDRESS_SIZE bits. */
|
||||||
|
@ -3090,6 +3106,7 @@ remote_write_bytes (memaddr, myaddr, len)
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
unsigned char *p, *plen;
|
unsigned char *p, *plen;
|
||||||
|
int plenlen;
|
||||||
int todo;
|
int todo;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -3115,7 +3132,8 @@ remote_write_bytes (memaddr, myaddr, len)
|
||||||
*p++ = ',';
|
*p++ = ',';
|
||||||
|
|
||||||
plen = p; /* remember where len field goes */
|
plen = p; /* remember where len field goes */
|
||||||
p += hexnumstr (p, (ULONGEST) todo);
|
plenlen = hexnumstr (p, (ULONGEST) todo);
|
||||||
|
p += plenlen;
|
||||||
*p++ = ':';
|
*p++ = ':';
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
|
||||||
|
@ -3151,13 +3169,11 @@ remote_write_bytes (memaddr, myaddr, len)
|
||||||
{
|
{
|
||||||
/* Escape chars have filled up the buffer prematurely,
|
/* Escape chars have filled up the buffer prematurely,
|
||||||
and we have actually sent fewer bytes than planned.
|
and we have actually sent fewer bytes than planned.
|
||||||
Fix-up the length field of the packet. */
|
Fix-up the length field of the packet. Use the same
|
||||||
|
number of characters as before. */
|
||||||
|
|
||||||
/* FIXME: will fail if new len is a shorter string than
|
plen += hexnumnstr (plen, (ULONGEST) i, plenlen);
|
||||||
old len. */
|
*plen = ':'; /* overwrite \0 from hexnumnstr() */
|
||||||
|
|
||||||
plen += hexnumstr (plen, (ULONGEST) i);
|
|
||||||
*plen++ = ':';
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,4 +52,6 @@ extern void remote_cisco_objfile_relocate (bfd_signed_vma text_off,
|
||||||
bfd_signed_vma data_off,
|
bfd_signed_vma data_off,
|
||||||
bfd_signed_vma bss_off);
|
bfd_signed_vma bss_off);
|
||||||
|
|
||||||
|
extern void async_remote_interrupt_twice (void *arg);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -441,7 +441,7 @@ add_vmap (ldi)
|
||||||
objname, bfd_errmsg (bfd_get_error ()));
|
objname, bfd_errmsg (bfd_get_error ()));
|
||||||
/*NOTREACHED */
|
/*NOTREACHED */
|
||||||
}
|
}
|
||||||
obj = allocate_objfile (vp->bfd, 0, 0, 0);
|
obj = allocate_objfile (vp->bfd, 0);
|
||||||
vp->objfile = obj;
|
vp->objfile = obj;
|
||||||
|
|
||||||
#ifndef SOLIB_SYMBOLS_MANUAL
|
#ifndef SOLIB_SYMBOLS_MANUAL
|
||||||
|
|
|
@ -344,6 +344,11 @@ serial_readchar (serial_t scb, int timeout)
|
||||||
{
|
{
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
|
/* FIXME: cagney/1999-10-11: Don't enable this check until the ASYNC
|
||||||
|
code is finished. */
|
||||||
|
if (0 && SERIAL_IS_ASYNC_P (scb) && timeout < 0)
|
||||||
|
internal_error ("serial_readchar: blocking read in async mode");
|
||||||
|
|
||||||
ch = scb->ops->readchar (scb, timeout);
|
ch = scb->ops->readchar (scb, timeout);
|
||||||
if (serial_logfp != NULL)
|
if (serial_logfp != NULL)
|
||||||
{
|
{
|
||||||
|
|
12
gdb/serial.h
12
gdb/serial.h
|
@ -54,14 +54,16 @@ extern void serial_un_fdopen (serial_t scb);
|
||||||
#define SERIAL_UN_FDOPEN(SERIAL_T) serial_un_fdopen ((SERIAL_T))
|
#define SERIAL_UN_FDOPEN(SERIAL_T) serial_un_fdopen ((SERIAL_T))
|
||||||
|
|
||||||
/* Read one char from the serial device with TIMEOUT seconds to wait
|
/* Read one char from the serial device with TIMEOUT seconds to wait
|
||||||
or -1 to wait forever. Use timeout of 0 to effect a poll. Returns
|
or -1 to wait forever. Use timeout of 0 to effect a poll.
|
||||||
unsigned char if ok, else one of the following codes. Note that
|
Infinite waits are not permitted. Returns unsigned char if ok, else
|
||||||
all error return-codes are guaranteed to be < 0. */
|
one of the following codes. Note that all error return-codes are
|
||||||
|
guaranteed to be < 0. */
|
||||||
|
|
||||||
enum serial_rc {
|
enum serial_rc {
|
||||||
SERIAL_ERROR = -1, /* General error. */
|
SERIAL_ERROR = -1, /* General error. */
|
||||||
SERIAL_TIMEOUT = -2, /* Timeout during read. ui_loop_hook() can,
|
SERIAL_TIMEOUT = -2, /* Timeout or data-not-ready during read.
|
||||||
unfortunatly, force this to be returned. */
|
Unfortunatly, through ui_loop_hook(), this
|
||||||
|
can also be a QUIT indication. */
|
||||||
SERIAL_EOF = -3 /* General end-of-file or remote target
|
SERIAL_EOF = -3 /* General end-of-file or remote target
|
||||||
connection closed, indication. Includes
|
connection closed, indication. Includes
|
||||||
things like the line dropping dead. */
|
things like the line dropping dead. */
|
||||||
|
|
|
@ -1112,8 +1112,7 @@ symbol_add_stub (arg)
|
||||||
section_addrs.text_addr = text_addr;
|
section_addrs.text_addr = text_addr;
|
||||||
so->objfile =
|
so->objfile =
|
||||||
symbol_file_add (so->so_name, so->from_tty,
|
symbol_file_add (so->so_name, so->from_tty,
|
||||||
§ion_addrs,
|
§ion_addrs, 0, OBJF_SHARED);
|
||||||
0, 0, 0, 1);
|
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -291,7 +291,7 @@ som_solib_add_solib_objfile (so, name, from_tty, text_addr)
|
||||||
|
|
||||||
memset (§ion_addrs, 0, sizeof (section_addrs));
|
memset (§ion_addrs, 0, sizeof (section_addrs));
|
||||||
section_addrs.text_addr = text_addr;
|
section_addrs.text_addr = text_addr;
|
||||||
so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, 0, 0, 1);
|
so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, OBJF_SHARED);
|
||||||
so->abfd = so->objfile->obfd;
|
so->abfd = so->objfile->obfd;
|
||||||
|
|
||||||
/* Mark this as a shared library and save private data.
|
/* Mark this as a shared library and save private data.
|
||||||
|
|
|
@ -820,24 +820,16 @@ new_symfile_objfile (objfile, mainline, verbo)
|
||||||
as dynamically loaded code. If !mainline, ADDR is the address
|
as dynamically loaded code. If !mainline, ADDR is the address
|
||||||
where the text segment was loaded.
|
where the text segment was loaded.
|
||||||
|
|
||||||
USER_LOADED is TRUE if the add-symbol-file command was how this
|
|
||||||
symbol file came to be processed.
|
|
||||||
|
|
||||||
IS_SOLIB is TRUE if this symbol file represents a solib, as discovered
|
|
||||||
by the target's implementation of the solib package.
|
|
||||||
|
|
||||||
Upon success, returns a pointer to the objfile that was added.
|
Upon success, returns a pointer to the objfile that was added.
|
||||||
Upon failure, jumps back to command level (never returns). */
|
Upon failure, jumps back to command level (never returns). */
|
||||||
|
|
||||||
struct objfile *
|
struct objfile *
|
||||||
symbol_file_add (name, from_tty, addrs, mainline, flags, user_loaded, is_solib)
|
symbol_file_add (name, from_tty, addrs, mainline, flags)
|
||||||
char *name;
|
char *name;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
struct section_addr_info *addrs;
|
struct section_addr_info *addrs;
|
||||||
int mainline;
|
int mainline;
|
||||||
int flags;
|
int flags;
|
||||||
int user_loaded;
|
|
||||||
int is_solib;
|
|
||||||
{
|
{
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
struct partial_symtab *psymtab;
|
struct partial_symtab *psymtab;
|
||||||
|
@ -854,7 +846,7 @@ symbol_file_add (name, from_tty, addrs, mainline, flags, user_loaded, is_solib)
|
||||||
&& !query ("Load new symbol table from \"%s\"? ", name))
|
&& !query ("Load new symbol table from \"%s\"? ", name))
|
||||||
error ("Not confirmed.");
|
error ("Not confirmed.");
|
||||||
|
|
||||||
objfile = allocate_objfile (abfd, flags & OBJF_MAPPED, user_loaded, is_solib);
|
objfile = allocate_objfile (abfd, flags);
|
||||||
|
|
||||||
/* If the objfile uses a mapped symbol file, and we have a psymtab for
|
/* If the objfile uses a mapped symbol file, and we have a psymtab for
|
||||||
it, then skip reading any symbols at this time. */
|
it, then skip reading any symbols at this time. */
|
||||||
|
@ -952,7 +944,7 @@ symbol_file_command (args, from_tty)
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
CORE_ADDR text_relocation = 0; /* text_relocation */
|
CORE_ADDR text_relocation = 0; /* text_relocation */
|
||||||
struct cleanup *cleanups;
|
struct cleanup *cleanups;
|
||||||
int flags = 0;
|
int flags = OBJF_USERLOADED;
|
||||||
|
|
||||||
dont_repeat ();
|
dont_repeat ();
|
||||||
|
|
||||||
|
@ -1023,8 +1015,7 @@ symbol_file_command (args, from_tty)
|
||||||
return;
|
return;
|
||||||
else if (text_relocation == (CORE_ADDR) -1)
|
else if (text_relocation == (CORE_ADDR) -1)
|
||||||
{
|
{
|
||||||
symbol_file_add (name, from_tty, NULL,
|
symbol_file_add (name, from_tty, NULL, 1, flags);
|
||||||
1, flags, 1, 0);
|
|
||||||
#ifdef HPUXHPPA
|
#ifdef HPUXHPPA
|
||||||
RESET_HP_UX_GLOBALS ();
|
RESET_HP_UX_GLOBALS ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -1034,8 +1025,7 @@ symbol_file_command (args, from_tty)
|
||||||
struct section_addr_info section_addrs;
|
struct section_addr_info section_addrs;
|
||||||
memset (§ion_addrs, 0, sizeof (section_addrs));
|
memset (§ion_addrs, 0, sizeof (section_addrs));
|
||||||
section_addrs.text_addr = (CORE_ADDR) text_relocation;
|
section_addrs.text_addr = (CORE_ADDR) text_relocation;
|
||||||
symbol_file_add (name, from_tty, §ion_addrs,
|
symbol_file_add (name, from_tty, §ion_addrs, 0, flags);
|
||||||
0, flags, 1, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Getting new symbols may change our opinion about what is
|
/* Getting new symbols may change our opinion about what is
|
||||||
|
@ -1386,7 +1376,7 @@ add_symbol_file_command (args, from_tty)
|
||||||
{
|
{
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
CORE_ADDR text_addr;
|
CORE_ADDR text_addr;
|
||||||
int flags = 0;
|
int flags = OBJF_USERLOADED;
|
||||||
char *arg;
|
char *arg;
|
||||||
int expecting_option = 0;
|
int expecting_option = 0;
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
@ -1572,9 +1562,7 @@ add_symbol_file_command (args, from_tty)
|
||||||
if (from_tty && (!query ("%s", "")))
|
if (from_tty && (!query ("%s", "")))
|
||||||
error ("Not confirmed.");
|
error ("Not confirmed.");
|
||||||
|
|
||||||
symbol_file_add (name, from_tty, §ion_addrs, 0, flags,
|
symbol_file_add (name, from_tty, §ion_addrs, 0, flags);
|
||||||
1, /* user_loaded */
|
|
||||||
0); /* We'll guess it's ! is_solib */
|
|
||||||
|
|
||||||
/* Getting new symbols may change our opinion about what is
|
/* Getting new symbols may change our opinion about what is
|
||||||
frameless. */
|
frameless. */
|
||||||
|
|
|
@ -1419,7 +1419,7 @@ extern void
|
||||||
clear_solib PARAMS ((void));
|
clear_solib PARAMS ((void));
|
||||||
|
|
||||||
extern struct objfile *
|
extern struct objfile *
|
||||||
symbol_file_add PARAMS ((char *, int, struct section_addr_info *, int, int, int, int));
|
symbol_file_add PARAMS ((char *, int, struct section_addr_info *, int, int));
|
||||||
|
|
||||||
/* source.c */
|
/* source.c */
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
Wed Oct 6 12:05:58 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/watchpoint.exp: Match fail ``finish from marker1'' with
|
||||||
|
a pass case.
|
||||||
|
|
||||||
1999-10-01 Kevin Buettner <kevinb@cygnus.com>
|
1999-10-01 Kevin Buettner <kevinb@cygnus.com>
|
||||||
|
|
||||||
* gdb.base/break.c (main): Added a statement that we can step
|
* gdb.base/break.c (main): Added a statement that we can step
|
||||||
|
|
|
@ -388,7 +388,9 @@ proc test_stepping {} {
|
||||||
|
|
||||||
send_gdb "finish\n"
|
send_gdb "finish\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "Run.*exit from.*marker1.* at" { }
|
-re "Run.*exit from.*marker1.* at" {
|
||||||
|
pass "finish from marker1"
|
||||||
|
}
|
||||||
default { fail "finish from marker1" ; return }
|
default { fail "finish from marker1" ; return }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
28
gdb/valops.c
28
gdb/valops.c
|
@ -1061,7 +1061,12 @@ push_bytes (sp, buffer, len)
|
||||||
return sp;
|
return sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Push onto the stack the specified value VALUE. */
|
#ifndef PARM_BOUNDARY
|
||||||
|
#define PARM_BOUNDARY (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Push onto the stack the specified value VALUE. Pad it correctly for
|
||||||
|
it to be an argument to a function. */
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
value_push (sp, arg)
|
value_push (sp, arg)
|
||||||
|
@ -1069,18 +1074,31 @@ value_push (sp, arg)
|
||||||
value_ptr arg;
|
value_ptr arg;
|
||||||
{
|
{
|
||||||
register int len = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (arg));
|
register int len = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (arg));
|
||||||
|
register int container_len;
|
||||||
|
register int offset;
|
||||||
|
|
||||||
|
/* How big is the container we're going to put this value in? */
|
||||||
|
if (PARM_BOUNDARY)
|
||||||
|
container_len = ((len + PARM_BOUNDARY / TARGET_CHAR_BIT - 1)
|
||||||
|
& ~(PARM_BOUNDARY / TARGET_CHAR_BIT - 1));
|
||||||
|
|
||||||
|
/* Are we going to put it at the high or low end of the container? */
|
||||||
|
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
|
||||||
|
offset = container_len - len;
|
||||||
|
else
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
if (INNER_THAN (1, 2))
|
if (INNER_THAN (1, 2))
|
||||||
{
|
{
|
||||||
/* stack grows downward */
|
/* stack grows downward */
|
||||||
sp -= len;
|
sp -= container_len;
|
||||||
write_memory (sp, VALUE_CONTENTS_ALL (arg), len);
|
write_memory (sp + offset, VALUE_CONTENTS_ALL (arg), len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* stack grows upward */
|
/* stack grows upward */
|
||||||
write_memory (sp, VALUE_CONTENTS_ALL (arg), len);
|
write_memory (sp + offset, VALUE_CONTENTS_ALL (arg), len);
|
||||||
sp += len;
|
sp += container_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sp;
|
return sp;
|
||||||
|
|
|
@ -420,7 +420,7 @@ handle_load_dll (PTR dummy)
|
||||||
|
|
||||||
printf_unfiltered ("%x:%s", event->lpBaseOfDll, dll_name);
|
printf_unfiltered ("%x:%s", event->lpBaseOfDll, dll_name);
|
||||||
section_addrs.text_addr = (int) event->lpBaseOfDll + 0x1000;
|
section_addrs.text_addr = (int) event->lpBaseOfDll + 0x1000;
|
||||||
symbol_file_add (dll_name, 0, §ion_addrs, 0, 0, 0, 1);
|
symbol_file_add (dll_name, 0, §ion_addrs, 0, OBJF_SHARED);
|
||||||
printf_unfiltered ("\n");
|
printf_unfiltered ("\n");
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -2759,7 +2759,7 @@ xcoff_initial_scan (objfile, mainline)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xcoff_symfile_offsets (objfile, addr)
|
xcoff_symfile_offsets (objfile, addrs)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
struct section_addr_info *addrs;
|
struct section_addr_info *addrs;
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
1999-10-08 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* armos.c (SWIopen): Always pass third parameter with 0666 since
|
||||||
|
otherwise uninitialized memory gets access if the O_CREAT bit is
|
||||||
|
set and so we possibly cannot access the file afterwards.
|
||||||
|
|
||||||
1999-09-29 Doug Evans <devans@casey.cygnus.com>
|
1999-09-29 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* armos.c (SWIWrite0): Send output to stdout instead of stderr.
|
* armos.c (SWIWrite0): Send output to stdout instead of stderr.
|
||||||
|
|
|
@ -295,7 +295,7 @@ SWIopen (ARMul_State *state, ARMword name, ARMword SWIflags)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state->Reg[0] = (int) open (dummy, flags);
|
state->Reg[0] = (int) open (dummy, flags, 0666);
|
||||||
OSptr->ErrorNo = errno;
|
OSptr->ErrorNo = errno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
1999-10-07 Dave Brolley <brolley@cygnus.com>
|
||||||
|
|
||||||
|
* cgen-par.h (CGEN_FN_HI_WRITE): New enumerator.
|
||||||
|
(fn_hi_write): New union member.
|
||||||
|
(sim_queue_fn_hi_write): New function.
|
||||||
|
* cgen-par.c (sim_queue_fn_hi_write): New function.
|
||||||
|
(cgen_write_queue_element_execute): Handle CGEN_FN_HI_WRITE.
|
||||||
|
|
||||||
1999-09-29 Doug Evans <devans@casey.cygnus.com>
|
1999-09-29 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* cgen-defs.h (sim_engine_invalid_insn): New arg `vpc'.
|
* cgen-defs.h (sim_engine_invalid_insn): New arg `vpc'.
|
||||||
|
|
|
@ -68,6 +68,21 @@ void sim_queue_pc_write (SIM_CPU *cpu, USI value)
|
||||||
element->kinds.pc_write.value = value;
|
element->kinds.pc_write.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sim_queue_fn_hi_write (
|
||||||
|
SIM_CPU *cpu,
|
||||||
|
void (*write_function)(SIM_CPU *cpu, UINT, UHI),
|
||||||
|
UINT regno,
|
||||||
|
UHI value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CGEN_WRITE_QUEUE *q = CPU_WRITE_QUEUE (cpu);
|
||||||
|
CGEN_WRITE_QUEUE_ELEMENT *element = CGEN_WRITE_QUEUE_NEXT (q);
|
||||||
|
element->kind = CGEN_FN_HI_WRITE;
|
||||||
|
element->kinds.fn_hi_write.function = write_function;
|
||||||
|
element->kinds.fn_hi_write.regno = regno;
|
||||||
|
element->kinds.fn_hi_write.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
void sim_queue_fn_si_write (
|
void sim_queue_fn_si_write (
|
||||||
SIM_CPU *cpu,
|
SIM_CPU *cpu,
|
||||||
void (*write_function)(SIM_CPU *cpu, UINT, USI),
|
void (*write_function)(SIM_CPU *cpu, UINT, USI),
|
||||||
|
@ -162,6 +177,11 @@ cgen_write_queue_element_execute (SIM_CPU *cpu, CGEN_WRITE_QUEUE_ELEMENT *item)
|
||||||
case CGEN_PC_WRITE:
|
case CGEN_PC_WRITE:
|
||||||
CPU_PC_SET (cpu, item->kinds.pc_write.value);
|
CPU_PC_SET (cpu, item->kinds.pc_write.value);
|
||||||
break;
|
break;
|
||||||
|
case CGEN_FN_HI_WRITE:
|
||||||
|
item->kinds.fn_hi_write.function (cpu,
|
||||||
|
item->kinds.fn_hi_write.regno,
|
||||||
|
item->kinds.fn_hi_write.value);
|
||||||
|
break;
|
||||||
case CGEN_FN_SI_WRITE:
|
case CGEN_FN_SI_WRITE:
|
||||||
item->kinds.fn_si_write.function (cpu,
|
item->kinds.fn_si_write.function (cpu,
|
||||||
item->kinds.fn_si_write.regno,
|
item->kinds.fn_si_write.regno,
|
||||||
|
|
|
@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
enum cgen_write_queue_kind {
|
enum cgen_write_queue_kind {
|
||||||
CGEN_BI_WRITE, CGEN_QI_WRITE, CGEN_SI_WRITE, CGEN_SF_WRITE,
|
CGEN_BI_WRITE, CGEN_QI_WRITE, CGEN_SI_WRITE, CGEN_SF_WRITE,
|
||||||
CGEN_PC_WRITE,
|
CGEN_PC_WRITE,
|
||||||
CGEN_FN_SI_WRITE, CGEN_FN_DI_WRITE, CGEN_FN_DF_WRITE,
|
CGEN_FN_HI_WRITE, CGEN_FN_SI_WRITE, CGEN_FN_DI_WRITE, CGEN_FN_DF_WRITE,
|
||||||
CGEN_MEM_QI_WRITE, CGEN_MEM_HI_WRITE, CGEN_MEM_SI_WRITE,
|
CGEN_MEM_QI_WRITE, CGEN_MEM_HI_WRITE, CGEN_MEM_SI_WRITE,
|
||||||
CGEN_NUM_WRITE_KINDS
|
CGEN_NUM_WRITE_KINDS
|
||||||
};
|
};
|
||||||
|
@ -53,6 +53,11 @@ typedef struct {
|
||||||
struct {
|
struct {
|
||||||
USI value;
|
USI value;
|
||||||
} pc_write;
|
} pc_write;
|
||||||
|
struct {
|
||||||
|
UINT regno;
|
||||||
|
UHI value;
|
||||||
|
void (*function)(SIM_CPU *, UINT, UHI);
|
||||||
|
} fn_hi_write;
|
||||||
struct {
|
struct {
|
||||||
UINT regno;
|
UINT regno;
|
||||||
SI value;
|
SI value;
|
||||||
|
@ -118,6 +123,7 @@ extern void sim_queue_sf_write (SIM_CPU *, SI *, SF);
|
||||||
|
|
||||||
extern void sim_queue_pc_write (SIM_CPU *, USI);
|
extern void sim_queue_pc_write (SIM_CPU *, USI);
|
||||||
|
|
||||||
|
extern void sim_queue_fn_hi_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, UHI), UINT, UHI);
|
||||||
extern void sim_queue_fn_si_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, USI), UINT, SI);
|
extern void sim_queue_fn_si_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, USI), UINT, SI);
|
||||||
extern void sim_queue_fn_di_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DI);
|
extern void sim_queue_fn_di_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DI);
|
||||||
extern void sim_queue_fn_df_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DF);
|
extern void sim_queue_fn_df_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DF);
|
||||||
|
|
|
@ -1,9 +1,16 @@
|
||||||
|
1999-10-04 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
* arch.c,arch.h,cpuall.h: Rebuild.
|
||||||
|
* cpux.h,decodex.c,decodex.h,modelx.c,semx-switch.c: Rebuild.
|
||||||
|
|
||||||
1999-09-29 Doug Evans <devans@casey.cygnus.com>
|
1999-09-29 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* mloop.in: Update call to sim_engine_invalid_insn.
|
* mloop.in: Update call to sim_engine_invalid_insn.
|
||||||
* sem.c,sem-switch.c: Rebuild.
|
* sem.c,sem-switch.c: Rebuild.
|
||||||
* traps.c (sim_engine_invalid_insn): New arg `vpc'. Change type of
|
* traps.c (sim_engine_invalid_insn): New arg `vpc'. Change type of
|
||||||
result to SEM_PC. Return vpc.
|
result to SEM_PC. Return vpc.
|
||||||
|
* mloopx.in: Ditto.
|
||||||
|
* semx-switch.c: Rebuild.
|
||||||
|
|
||||||
Wed Sep 29 14:47:20 1999 Dave Brolley <brolley@cygnus.com>
|
Wed Sep 29 14:47:20 1999 Dave Brolley <brolley@cygnus.com>
|
||||||
|
|
||||||
|
@ -13,18 +20,28 @@ Thu Sep 2 18:15:53 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|
||||||
|
1999-09-01 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
* decodex.c: Rebuild.
|
||||||
|
|
||||||
1999-08-28 Doug Evans <devans@casey.cygnus.com>
|
1999-08-28 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* sem.c: Rebuild
|
* sem.c: Rebuild
|
||||||
|
|
||||||
|
* cpux.h: Rebuild.
|
||||||
|
|
||||||
1999-08-09 Doug Evans <devans@casey.cygnus.com>
|
1999-08-09 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* cpu.h,decode.c,decode.h,model.c,sem-switch.c,sem.c: Rebuild.
|
* cpu.h,decode.c,decode.h,model.c,sem-switch.c,sem.c: Rebuild.
|
||||||
|
* cpux.h,decodex.c,decodex.h,modelx.c,semx-switch.c: Rebuild.
|
||||||
|
|
||||||
1999-08-04 Doug Evans <devans@casey.cygnus.com>
|
1999-08-04 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* m32r-sim.h (SEM_SKIP_INSN): Delete.
|
* m32r-sim.h (SEM_SKIP_INSN): Delete.
|
||||||
* cpu.h,cpuall.h,decode.c,model.c,sem-switch.c,sem.c: Rebuild.
|
* cpu.h,cpuall.h,decode.c,model.c,sem-switch.c,sem.c: Rebuild.
|
||||||
|
* cpux.h,decodex.c,modelx.c,semx-switch.c: Rebuild.
|
||||||
|
* mloopx.in (emit_parallel): Call SEM_SKIP_COMPILE.
|
||||||
|
(emit_full_parallel): Ditto.
|
||||||
|
|
||||||
1999-05-08 Felix Lee <flee@cygnus.com>
|
1999-05-08 Felix Lee <flee@cygnus.com>
|
||||||
|
|
||||||
|
@ -39,10 +56,12 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
1999-04-10 Doug Evans <devans@casey.cygnus.com>
|
1999-04-10 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* sem-switch.c,sem.c: Rebuild.
|
* sem-switch.c,sem.c: Rebuild.
|
||||||
|
* cpux.h,semx-switch.c: Rebuild.
|
||||||
|
|
||||||
1999-03-27 Doug Evans <devans@casey.cygnus.com>
|
1999-03-27 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* decode.c: Rebuild.
|
* decode.c: Rebuild.
|
||||||
|
* decodex.c: Rebuild.
|
||||||
|
|
||||||
1999-03-26 Doug Evans <devans@casey.cygnus.com>
|
1999-03-26 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
@ -51,6 +70,7 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
1999-03-22 Doug Evans <devans@casey.cygnus.com>
|
1999-03-22 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* arch.c,arch.h,model.c: Rebuild.
|
* arch.c,arch.h,model.c: Rebuild.
|
||||||
|
* modelx.c: Rebuild.
|
||||||
* m32r-sim.h (a_m32r_h_gr_get,a_m32r_h_gr_set): Declare.
|
* m32r-sim.h (a_m32r_h_gr_get,a_m32r_h_gr_set): Declare.
|
||||||
(a_m32r_h_cr_get,a_m32r_h_cr_set): Declare.
|
(a_m32r_h_cr_get,a_m32r_h_cr_set): Declare.
|
||||||
* m32r.c (m32rbf_fetch_register): Replace calls to a_m32r_h_pc_get,
|
* m32r.c (m32rbf_fetch_register): Replace calls to a_m32r_h_pc_get,
|
||||||
|
@ -65,6 +85,7 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
1999-03-11 Doug Evans <devans@casey.cygnus.com>
|
1999-03-11 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* arch.c,arch.h,cpu.c,cpu.h,sem.c,sem-switch.c: Rebuild.
|
* arch.c,arch.h,cpu.c,cpu.h,sem.c,sem-switch.c: Rebuild.
|
||||||
|
* cpux.c,cpux.h,semx-switch.c: Rebuild.
|
||||||
* m32r-sim.h (GET_H_*,SET_H_*, except GET_H_SM): Delete.
|
* m32r-sim.h (GET_H_*,SET_H_*, except GET_H_SM): Delete.
|
||||||
* sim-if.c (sim_open): Update call to m32r_cgen_cpu_open.
|
* sim-if.c (sim_open): Update call to m32r_cgen_cpu_open.
|
||||||
|
|
||||||
|
@ -72,13 +93,25 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
|
|
||||||
* cpu.c,cpu.h: Rebuild.
|
* cpu.c,cpu.h: Rebuild.
|
||||||
|
|
||||||
|
start-sanitize-cygnus
|
||||||
|
1999-02-12 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (stamp-arch,stamp-cpu,stamp-xcpu): CGEN_MAIN_SCM
|
||||||
|
renamed to CGEN_READ_SCM.
|
||||||
|
|
||||||
|
end-sanitize-cygnus
|
||||||
1999-02-09 Doug Evans <devans@casey.cygnus.com>
|
1999-02-09 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* Makefile.in (SIM_EXTRA_DEPS): Add m32r-desc.h, delete cpu-opc.h.
|
* Makefile.in (SIM_EXTRA_DEPS): Add m32r-desc.h, delete cpu-opc.h.
|
||||||
(stamp-xmloop): s/-parallel/-parallel-write/.
|
(stamp-xmloop): s/-parallel/-parallel-write/.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
(stamp-arch,stamp-cpu): Update FLAGS variable, option syntax changed.
|
||||||
|
(stamp-xcpu): Update FLAGS variable, option syntax changed.
|
||||||
|
end-sanitize-cygnus
|
||||||
* configure.in (sim_link_files,sim_link_links): Delete.
|
* configure.in (sim_link_files,sim_link_links): Delete.
|
||||||
* configure: Rebuild.
|
* configure: Rebuild.
|
||||||
* decode.c,decode.h,model.c,sem-switch.c,sem.c: Rebuild.
|
* decode.c,decode.h,model.c,sem-switch.c,sem.c: Rebuild.
|
||||||
|
* decodex.c,decodex.h,modelx.c,semx-switch.c: Rebuild.
|
||||||
* mloop.in (execute): CGEN_INSN_ATTR renamed to CGEN_INSN_ATTR_VALUE.
|
* mloop.in (execute): CGEN_INSN_ATTR renamed to CGEN_INSN_ATTR_VALUE.
|
||||||
* sim-if.c (sim_open): m32r_cgen_cpu_open renamed from
|
* sim-if.c (sim_open): m32r_cgen_cpu_open renamed from
|
||||||
m32r_cgen_opcode_open. Set disassembler.
|
m32r_cgen_opcode_open. Set disassembler.
|
||||||
|
@ -86,29 +119,41 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
* sim-main.h: Don't include cpu-opc.h,cpu-sim.h. Include
|
* sim-main.h: Don't include cpu-opc.h,cpu-sim.h. Include
|
||||||
m32r-desc.h,m32r-opc.h,m32r-sim.h.
|
m32r-desc.h,m32r-opc.h,m32r-sim.h.
|
||||||
|
|
||||||
|
Thu Feb 4 16:04:26 1999 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
* cpux.h,decodex.c,modelx.c,semx-switch.c: Regenerate.
|
||||||
|
|
||||||
1999-01-27 Doug Evans <devans@casey.cygnus.com>
|
1999-01-27 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* cpu.h,decode.c,model.c,sem-switch.c,sem.c: Rebuild.
|
* cpu.h,decode.c,model.c,sem-switch.c,sem.c: Rebuild.
|
||||||
|
* cpux.h,decodex.c,modelx.c,semx-switch.c: Rebuild.
|
||||||
|
|
||||||
1999-01-15 Doug Evans <devans@casey.cygnus.com>
|
1999-01-15 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* decode.h,model.c: Regenerate.
|
* decode.h,model.c: Regenerate.
|
||||||
|
* decodex.h,modelx.c: Regenerate.
|
||||||
|
|
||||||
1999-01-14 Doug Evans <devans@casey.cygnus.com>
|
1999-01-14 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
start-sanitize-cygnus
|
||||||
|
* Makefile.in (stamp-arch): Pass FLAGS to cgen.
|
||||||
|
end-sanitize-cygnus
|
||||||
* arch.c,arch.h,cpuall.h: Regenerate.
|
* arch.c,arch.h,cpuall.h: Regenerate.
|
||||||
* cpu.c,cpu.h,decode.c,decode.h,model.c,sem-switch.c,sem.c: Regenerate.
|
* cpu.c,cpu.h,decode.c,decode.h,model.c,sem-switch.c,sem.c: Regenerate.
|
||||||
* traps.c (sim_engine_invalid_insn): PCADDR->IADDR.
|
* traps.c (sim_engine_invalid_insn): PCADDR->IADDR.
|
||||||
|
* cpux.c,cpux.h,decodex.c,decodex.h,modelx.c,semx-switch.c: Regenerate.
|
||||||
|
|
||||||
1999-01-11 Doug Evans <devans@casey.cygnus.com>
|
1999-01-11 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* Makefile.in (m32r-clean): rm eng.h.
|
* Makefile.in (m32r-clean): rm eng.h.
|
||||||
* sim-main.h: Delete inclusion of ansidecl.h.
|
* sim-main.h: Delete inclusion of ansidecl.h.
|
||||||
* cpu.h: Regenerate.
|
* cpu.h: Regenerate.
|
||||||
|
* cpux.h: Regenerate.
|
||||||
|
|
||||||
1999-01-06 Doug Evans <devans@casey.cygnus.com>
|
1999-01-06 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* cpu.h: Regenerate.
|
* cpu.h: Regenerate.
|
||||||
|
* cpux.h: Regenerate.
|
||||||
|
|
||||||
1999-01-05 Doug Evans <devans@casey.cygnus.com>
|
1999-01-05 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
@ -118,6 +163,10 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
(arch.o,traps.o,devices.o): Ditto.
|
(arch.o,traps.o,devices.o): Ditto.
|
||||||
(M32RBF_INCLUDE_DEPS): Use CGEN_MAIN_CPU_DEPS.
|
(M32RBF_INCLUDE_DEPS): Use CGEN_MAIN_CPU_DEPS.
|
||||||
(m32r.o,mloop.o,cpu.o,decode.o,sem.o,model.o): Simplify dependencies.
|
(m32r.o,mloop.o,cpu.o,decode.o,sem.o,model.o): Simplify dependencies.
|
||||||
|
(m32rx.o,mloopx.o,cpux.o,decodex.o,semx.o,modelx.o): Ditto.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
(stamp-arch): Pass mach=all to cgen-arch.
|
||||||
|
end-sanitize-cygnus
|
||||||
* cpu.c,cpu.h,decode.c,model.c,sem-switch.c,sem.c: Regenerate.
|
* cpu.c,cpu.h,decode.c,model.c,sem-switch.c,sem.c: Regenerate.
|
||||||
* m32r-sim.h (m32rbf_h_cr_[gs]et_handler): Declare.
|
* m32r-sim.h (m32rbf_h_cr_[gs]et_handler): Declare.
|
||||||
([GS]ET_H_CR): Define.
|
([GS]ET_H_CR): Define.
|
||||||
|
@ -125,9 +174,15 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
([GS]ET_H_PSW): Define.
|
([GS]ET_H_PSW): Define.
|
||||||
(m32rbf_h_accum_[gs]et_handler): Declare.
|
(m32rbf_h_accum_[gs]et_handler): Declare.
|
||||||
([GS]ET_H_ACCUM): Define.
|
([GS]ET_H_ACCUM): Define.
|
||||||
|
(m32rxf_h_{cr,psw,accum}_[gs]et_handler): Declare.
|
||||||
|
(m32rxf_h_accums_[gs]et_handler): Declare.
|
||||||
|
([GS]ET_H_ACCUMS): Define.
|
||||||
* sim-if.c (sim_open): Model probing code moved to sim-model.c.
|
* sim-if.c (sim_open): Model probing code moved to sim-model.c.
|
||||||
* m32r.c (WANT_CPU): Define as m32rbf.
|
* m32r.c (WANT_CPU): Define as m32rbf.
|
||||||
(all register access fns): Rename to ..._handler.
|
(all register access fns): Rename to ..._handler.
|
||||||
|
* cpux.c,cpux.h,decodex.c,modelx.c,semx.c: Regenerate.
|
||||||
|
* m32rx.c (WANT_CPU): Define as m32rxf.
|
||||||
|
(all register access fns): Rename to ..._handler.
|
||||||
|
|
||||||
1998-12-14 Doug Evans <devans@casey.cygnus.com>
|
1998-12-14 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
|
@ -142,6 +197,7 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
1998-12-09 Doug Evans <devans@casey.cygnus.com>
|
1998-12-09 Doug Evans <devans@casey.cygnus.com>
|
||||||
|
|
||||||
* cpu.h,decode.c,sem-switch.c,sem.c: Regenerate.
|
* cpu.h,decode.c,sem-switch.c,sem.c: Regenerate.
|
||||||
|
* cpux.h,decodex.c,semx-switch.c: Regenerate.
|
||||||
|
|
||||||
* sim-if.c: Include string.h or strings.h if present.
|
* sim-if.c: Include string.h or strings.h if present.
|
||||||
|
|
||||||
|
@ -161,6 +217,8 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
Simplify with call to @cpu@_fill_argbuf,@cpu@_fill_argbuf_tp.
|
Simplify with call to @cpu@_fill_argbuf,@cpu@_fill_argbuf_tp.
|
||||||
(execute): Test ARGBUF_PROFILE_P before profiling.
|
(execute): Test ARGBUF_PROFILE_P before profiling.
|
||||||
Update calls to TRACE_INSN_INIT,TRACE_INSN_FINI.
|
Update calls to TRACE_INSN_INIT,TRACE_INSN_FINI.
|
||||||
|
* cpux.h,decodex.c,modelx.c,semx-switch.c: Regenerate.
|
||||||
|
* mloopx.in: Rewrite.
|
||||||
|
|
||||||
1998-11-22 Doug Evans <devans@tobor.to.cygnus.com>
|
1998-11-22 Doug Evans <devans@tobor.to.cygnus.com>
|
||||||
|
|
||||||
|
@ -172,10 +230,24 @@ Fri Apr 16 16:47:43 1999 Doug Evans <devans@charmed.cygnus.com>
|
||||||
|
|
||||||
* Makefile.in (M32R_OBJS): Delete extract.o.
|
* Makefile.in (M32R_OBJS): Delete extract.o.
|
||||||
(extract.o): Delete.
|
(extract.o): Delete.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
(stamp-arch): Depend on $(CGEN_ARCH_SCM).
|
||||||
|
(stamp-cpu): Don't build extract.c.
|
||||||
|
end-sanitize-cygnus
|
||||||
* cpu.c,cpu.h,decode.c,decode.h,sem-switch.c,sem.c: Rebuild.
|
* cpu.c,cpu.h,decode.c,decode.h,sem-switch.c,sem.c: Rebuild.
|
||||||
* mloop.in (extract16): Update type of `insn' arg.
|
* mloop.in (extract16): Update type of `insn' arg.
|
||||||
Delete call to d->extract.
|
Delete call to d->extract.
|
||||||
(extract32): Ditto.
|
(extract32): Ditto.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
* Makefile.in (M32RX_OBJS): Delete extractx.o.
|
||||||
|
(extractx.o): Delete.
|
||||||
|
(stamp-xcpu): Don't build extractx.c.
|
||||||
|
end-sanitize-cygnus
|
||||||
|
* cpux.c,cpux.h,decodex.c,decodex.h,semx-switch.c: Rebuild.
|
||||||
|
* mloopx.in (extractx16): Update type of `insn' arg.
|
||||||
|
Delete call to d->extract. Delete arg pbb_p. All callers updated.
|
||||||
|
(extract-simple,full-exec-simple,fast-exec-simple): Delete.
|
||||||
|
(extractx32): Ditto.
|
||||||
|
|
||||||
Wed Nov 4 23:55:37 1998 Doug Evans <devans@seba.cygnus.com>
|
Wed Nov 4 23:55:37 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -183,12 +255,14 @@ Wed Nov 4 23:55:37 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
before cgen-types.h.
|
before cgen-types.h.
|
||||||
* tconfig.in: Guard against multiple inclusion.
|
* tconfig.in: Guard against multiple inclusion.
|
||||||
* cpu.h: Delete decls moved to genmloop.sh.
|
* cpu.h: Delete decls moved to genmloop.sh.
|
||||||
|
* cpux.h: Ditto.
|
||||||
|
|
||||||
Mon Oct 19 14:13:05 1998 Doug Evans <devans@seba.cygnus.com>
|
Mon Oct 19 14:13:05 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
* sim-main.h: #include cpu-opc.h.
|
* sim-main.h: #include cpu-opc.h.
|
||||||
* arch.c,arch.h,decode.c,extract.c,model.c,sem.c: Regenerate
|
* arch.c,arch.h,decode.c,extract.c,model.c,sem.c: Regenerate
|
||||||
to get #include cleanup.
|
to get #include cleanup.
|
||||||
|
* decodex.c,extractx.c,modelx.c: Ditto.
|
||||||
|
|
||||||
* Makefile.in (SIM_EXTRA_DEPS): Replace cgen headers with
|
* Makefile.in (SIM_EXTRA_DEPS): Replace cgen headers with
|
||||||
CGEN_INCLUDE_DEPS.
|
CGEN_INCLUDE_DEPS.
|
||||||
|
@ -199,11 +273,23 @@ Mon Oct 19 14:13:05 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* sim-main.h: Delete inclusion of cpu.h,decode.h, moved to cpuall.h.
|
* sim-main.h: Delete inclusion of cpu.h,decode.h, moved to cpuall.h.
|
||||||
#include cgen-scache.h,cgen-cpu.h.
|
#include cgen-scache.h,cgen-cpu.h.
|
||||||
* tconfig.in (WITH_FOO semantic macros): Delete.
|
* tconfig.in (WITH_FOO semantic macros): Delete.
|
||||||
|
* Makefile.in (M32RXF_INCLUDE_DEPS): Define.
|
||||||
|
(m32rx .o's): Depend on it.
|
||||||
|
(mloopx.c): Update call to genmloop.sh.
|
||||||
|
* cpux.h: Regenerate.
|
||||||
|
|
||||||
Fri Oct 16 09:15:29 1998 Doug Evans <devans@charmed.cygnus.com>
|
Fri Oct 16 09:15:29 1998 Doug Evans <devans@charmed.cygnus.com>
|
||||||
|
|
||||||
* sim-if.c (sim_do_command): Handle "sim info reg {bbpsw,bbpc}".
|
* sim-if.c (sim_do_command): Handle "sim info reg {bbpsw,bbpc}".
|
||||||
|
|
||||||
|
start-sanitize-cygnus
|
||||||
|
Wed Oct 14 14:49:50 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (mloop.o): Don't depend on stamp-cpu, depend on
|
||||||
|
explicit files.
|
||||||
|
(mloopx.o): Ditto for stamp-xcpu.
|
||||||
|
|
||||||
|
end-sanitize-cygnus
|
||||||
Fri Oct 9 16:11:58 1998 Doug Evans <devans@seba.cygnus.com>
|
Fri Oct 9 16:11:58 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
Add pseudo-basic-block execution support.
|
Add pseudo-basic-block execution support.
|
||||||
|
@ -211,6 +297,9 @@ Fri Oct 9 16:11:58 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
(SIM_EXTRA_DEPS): Add include/opcode/cgen.h.
|
(SIM_EXTRA_DEPS): Add include/opcode/cgen.h.
|
||||||
(INCLUDE_DEPS): Delete cpu-sim.h, include/opcode/cgen.h.
|
(INCLUDE_DEPS): Delete cpu-sim.h, include/opcode/cgen.h.
|
||||||
(mloop.c): Build pseudo-basic-block version. Depend on stamp-cpu.
|
(mloop.c): Build pseudo-basic-block version. Depend on stamp-cpu.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
(stamp-decode): Delete, build decode files with other cpu files.
|
||||||
|
end-sanitize-cygnus
|
||||||
* arch.c,arch.h,cpuall.h: Regenerate.
|
* arch.c,arch.h,cpuall.h: Regenerate.
|
||||||
* cpu.c,cpu.h,decode.c,decode.h,extract.c,model.c: Regenerate.
|
* cpu.c,cpu.h,decode.c,decode.h,extract.c,model.c: Regenerate.
|
||||||
* sem-switch.c,sem.c: Regenerate.
|
* sem-switch.c,sem.c: Regenerate.
|
||||||
|
@ -239,6 +328,35 @@ Fri Oct 9 16:11:58 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
(m32r_trap): Pass pc to sim_engine_halt.
|
(m32r_trap): Pass pc to sim_engine_halt.
|
||||||
* configure.in (SIM_AC_OPTION_SCACHE): Change 1024 to 16384.
|
* configure.in (SIM_AC_OPTION_SCACHE): Change 1024 to 16384.
|
||||||
* configure: Regenerate.
|
* configure: Regenerate.
|
||||||
|
* Makefile.in (M32RX_OBJS): Delete semx.o, add extract.o.
|
||||||
|
(mloopx.c): Build pseudo-basic-block version.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
Depend on stamp-xcpu.
|
||||||
|
end-sanitize-cygnus
|
||||||
|
(semx.o): Delete.
|
||||||
|
(extractx.o): Add.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
(stamp-xdecode): Delete, build decode files with other cpu files.
|
||||||
|
end-sanitize-cygnus
|
||||||
|
* cpux.c,cpux.h,decodex.c,decodex.h,modelx.c: Regenerate.
|
||||||
|
* readx.c: Delete.
|
||||||
|
* semx.c: Delete.
|
||||||
|
* extractx.c: New file.
|
||||||
|
* semx-switch.c: New file.
|
||||||
|
* m32r-sim.h (BRANCH_NEW_PC): Delete.
|
||||||
|
(SEM_SKIP_INSN): New macro.
|
||||||
|
* m32rx.c (m32rxf_fetch_register): Renamed from m32rx_fetch_register.
|
||||||
|
(m32rxf_store_register,m32rxf_h_cr_get,m32rxf_h_cr_set,
|
||||||
|
m32rxf_h_psw_get,m32rxf_h_psw_set,m32rxf_h_accum_get,
|
||||||
|
m32rxf_h_accum_set,m32rxf_h_accums_get,m32rxf_h_accums_set): Likewise.
|
||||||
|
(m32rxf_model_insn_{before,after}): New fns.
|
||||||
|
(m32rx_model_mark_get_h_gr,m32rx_model_mark_set_h_gr): Delete.
|
||||||
|
(m32rx_model_mark_busy_reg,m32rx_model_mark_unbusy_reg): Delete.
|
||||||
|
(check_load_stall): New fn.
|
||||||
|
(m32rxf_model_m32rx_u_{exec,cmp,mac,cti,load,store}): New fns.
|
||||||
|
* mloopx.in: Rewrite, use pbb support.
|
||||||
|
* tconfig.in (WITH_SCACHE_PBB_M32RXF): Define.
|
||||||
|
(WITH_SEM_SWITCH_FULL): Change from 0 to 1.
|
||||||
|
|
||||||
Wed Sep 16 18:22:27 1998 Doug Evans <devans@canuck.cygnus.com>
|
Wed Sep 16 18:22:27 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
@ -247,6 +365,7 @@ Wed Sep 16 18:22:27 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
(m32r_decode_gdb_ctrl_regnum): Add prototype.
|
(m32r_decode_gdb_ctrl_regnum): Add prototype.
|
||||||
* m32r.c (m32r_decode_gdb_ctrl_regnum): New function.
|
* m32r.c (m32r_decode_gdb_ctrl_regnum): New function.
|
||||||
(m32r_fetch_register,m32r_store_register): Rewrite.
|
(m32r_fetch_register,m32r_store_register): Rewrite.
|
||||||
|
* m32rx.c (m32rx_fetch_register,m32rx_store_register): Rewrite.
|
||||||
|
|
||||||
Tue Sep 15 15:01:14 1998 Doug Evans <devans@canuck.cygnus.com>
|
Tue Sep 15 15:01:14 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
@ -256,17 +375,24 @@ Tue Sep 15 15:01:14 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
* m32r.c (m32rb_h_cr_get,m32rb_h_cr_set): Handle bbpc,bbpsw.
|
* m32r.c (m32rb_h_cr_get,m32rb_h_cr_set): Handle bbpc,bbpsw.
|
||||||
(m32rb_h_psw_get,m32rb_h_psw_set): New functions.
|
(m32rb_h_psw_get,m32rb_h_psw_set): New functions.
|
||||||
* arch.c,arch.h,cpu.c,cpu.h,sem-switch.c,sem.c: Regenerate.
|
* arch.c,arch.h,cpu.c,cpu.h,sem-switch.c,sem.c: Regenerate.
|
||||||
|
* m32rx.c (m32rx_h_cr_get,m32rx_h_cr_set): Handle bbpc,bbpsw.
|
||||||
|
(m32rx_h_psw_get,m32rx_h_psw_set): New functions.
|
||||||
|
* cpux.c,cpux.h,readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Wed Sep 9 15:29:36 1998 Doug Evans <devans@canuck.cygnus.com>
|
Wed Sep 9 15:29:36 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* m32r-sim.h (m32r_trap): Update prototype.
|
* m32r-sim.h (m32r_trap): Update prototype.
|
||||||
* traps.c (m32r_trap): New arg `pc'.
|
* traps.c (m32r_trap): New arg `pc'.
|
||||||
* sem.c,sem-switch.c: Regenerated.
|
* sem.c,sem-switch.c: Regenerated.
|
||||||
|
* cpux.h,readx.c,semx.c: Regenerated.
|
||||||
|
|
||||||
Mon Aug 3 12:59:17 1998 Doug Evans <devans@seba.cygnus.com>
|
Mon Aug 3 12:59:17 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
Rename cpu m32r to m32rb to distinguish from architecture name.
|
Rename cpu m32r to m32rb to distinguish from architecture name.
|
||||||
* Makefile.in (mloop.c): cpu m32r renamed to m32rb.
|
* Makefile.in (mloop.c): cpu m32r renamed to m32rb.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
(stamp-cpu): Ditto.
|
||||||
|
end-sanitize-cygnus
|
||||||
* sim-main.h (WANT_CPU_M32RB): Renamed from WANT_CPU_M32R.
|
* sim-main.h (WANT_CPU_M32RB): Renamed from WANT_CPU_M32R.
|
||||||
* tconfig.in (WANT_CPU_M32RB): Ditto.
|
* tconfig.in (WANT_CPU_M32RB): Ditto.
|
||||||
* m32r.c (WANT_CPU_M32RB): Ditto.
|
* m32r.c (WANT_CPU_M32RB): Ditto.
|
||||||
|
@ -288,14 +414,23 @@ Mon Aug 3 12:59:17 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* sim-if.c (sim_open): Open opcode table.
|
* sim-if.c (sim_open): Open opcode table.
|
||||||
(sim_close): Close it.
|
(sim_close): Close it.
|
||||||
|
|
||||||
|
Tue Jul 28 13:06:19 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
Add support for new versions of mulwhi,mulwlo,macwhi,macwlo that
|
||||||
|
accept an accumulator choice.
|
||||||
|
* cpux.c,decodex.c,decodex.h,modelx.c,readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Fri Jul 24 13:00:29 1998 Doug Evans <devans@canuck.cygnus.com>
|
Fri Jul 24 13:00:29 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* m32r.c: Include cgen-mem.h.
|
* m32r.c: Include cgen-mem.h.
|
||||||
* traps.c (m32r_trap): Tweak for -Wall.
|
* traps.c (m32r_trap): Tweak for -Wall.
|
||||||
|
* m32rx.c: Include cgen-mem.h.
|
||||||
|
* semx.c: Regenerate, get -Wall cleanups.
|
||||||
|
|
||||||
Tue Jul 21 16:53:10 1998 Doug Evans <devans@seba.cygnus.com>
|
Tue Jul 21 16:53:10 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
* cpu.h,extract.c: Regenerate. pc-rel calcs done on f_dispNN now.
|
* cpu.h,extract.c: Regenerate. pc-rel calcs done on f_dispNN now.
|
||||||
|
* cpux.h,readx.c,semx.c: Ditto.
|
||||||
|
|
||||||
Wed Jul 1 16:51:15 1998 Doug Evans <devans@seba.cygnus.com>
|
Wed Jul 1 16:51:15 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -305,6 +440,9 @@ Wed Jul 1 16:51:15 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* arch.c,arch.h,cpuall.h: Regenerate.
|
* arch.c,arch.h,cpuall.h: Regenerate.
|
||||||
* cpu.c,cpu.h,decode.c,decode.h,extract.c,model.c: Regenerate.
|
* cpu.c,cpu.h,decode.c,decode.h,extract.c,model.c: Regenerate.
|
||||||
* sem-switch.c,sem.c: Regenerate.
|
* sem-switch.c,sem.c: Regenerate.
|
||||||
|
* cpux.c,cpux.h,decodex.c,decodex.h,modelx.c,readx.c: Regenerate.
|
||||||
|
* semx.c: Regenerate.
|
||||||
|
* mloopx.in (icount): Moved here from genmloop.sh.
|
||||||
|
|
||||||
Sat Jun 13 07:49:23 1998 Doug Evans <devans@fallis.cygnus.com>
|
Sat Jun 13 07:49:23 1998 Doug Evans <devans@fallis.cygnus.com>
|
||||||
|
|
||||||
|
@ -315,7 +453,18 @@ Sat Jun 13 07:49:23 1998 Doug Evans <devans@fallis.cygnus.com>
|
||||||
(m32r_model_record_cti,m32r_model_record_cycles): New functions.
|
(m32r_model_record_cti,m32r_model_record_cycles): New functions.
|
||||||
* mloop.in: Call cycle init/update fns.
|
* mloop.in: Call cycle init/update fns.
|
||||||
* model.c: Regenerate.
|
* model.c: Regenerate.
|
||||||
|
* m32rx.c (m32rx_model_mark_get_h_gr): Update.
|
||||||
|
* mloopx.in: Call cycle init/update fns.
|
||||||
|
* modelx.c: Regenerate.
|
||||||
|
|
||||||
|
start-sanitize-cygnus
|
||||||
|
Thu Jun 11 23:39:53 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (stamp-{arch,cpu,decode}): Pass CGEN_FLAGS_TO_PASS
|
||||||
|
to recursive makes.
|
||||||
|
(stamp-{xcpu,xdecode}): Ditto.
|
||||||
|
|
||||||
|
end-sanitize-cygnus
|
||||||
Wed Jun 10 17:39:29 1998 Doug Evans <devans@canuck.cygnus.com>
|
Wed Jun 10 17:39:29 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* traps.c: New file. Trap support moved here from sim-if.c.
|
* traps.c: New file. Trap support moved here from sim-if.c.
|
||||||
|
@ -334,6 +483,7 @@ Wed Jun 10 17:39:29 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
(TRAP_SYSCALL,TRAP_BREAKPOINT): New macros.
|
(TRAP_SYSCALL,TRAP_BREAKPOINT): New macros.
|
||||||
|
|
||||||
* extract.c,sem-switch.c,sem.c: Regenerate.
|
* extract.c,sem-switch.c,sem.c: Regenerate.
|
||||||
|
* cpux.h,readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Wed May 20 00:10:40 1998 Doug Evans <devans@seba.cygnus.com>
|
Wed May 20 00:10:40 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -345,6 +495,7 @@ Wed May 20 00:10:40 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
Zero bottom two bits of pc in jmp,jl insns.
|
Zero bottom two bits of pc in jmp,jl insns.
|
||||||
* sem.c,sem-switch.c: Regenerate.
|
* sem.c,sem-switch.c: Regenerate.
|
||||||
|
* semx.c: Regenerate.
|
||||||
|
|
||||||
Tue May 19 16:45:33 1998 Doug Evans <devans@seba.cygnus.com>
|
Tue May 19 16:45:33 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -362,6 +513,10 @@ Fri May 15 16:43:27 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* arch.h,cpu.c,cpu.h,cpuall.h: Regenerate.
|
* arch.h,cpu.c,cpu.h,cpuall.h: Regenerate.
|
||||||
* sem-switch.c,sem.c: Regenerate.
|
* sem-switch.c,sem.c: Regenerate.
|
||||||
* mloop.in (execute): Update calls to TRACE_INSN_{INIT,FINI}.
|
* mloop.in (execute): Update calls to TRACE_INSN_{INIT,FINI}.
|
||||||
|
* cpux.c,cpux.h,modelx.c,semx.c: Regenerate.
|
||||||
|
* m32rx.c (m32rx_model_mark_{busy,unbusy}_reg): New functions.
|
||||||
|
* mloopx.in (execute): Update calls to TRACE_INSN_{INIT,FINI}.
|
||||||
|
Fix pc value passed to TRACE_INSN for second parallel insn.
|
||||||
|
|
||||||
Thu May 7 02:51:35 1998 Doug Evans <devans@seba.cygnus.com>
|
Thu May 7 02:51:35 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -371,19 +526,35 @@ Wed May 6 14:51:39 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
* arch.h,arch.c,cpu.h,cpuall.h: Regenerate, tweaks mostly.
|
* arch.h,arch.c,cpu.h,cpuall.h: Regenerate, tweaks mostly.
|
||||||
* model.c: Ditto. Reorganize model/mach data.
|
* model.c: Ditto. Reorganize model/mach data.
|
||||||
|
* cpux.h: Ditto.
|
||||||
|
* modelx.c: Ditto.
|
||||||
|
|
||||||
* Makefile.in (m32r.o,mloop.o,cpu.o,model.o): Add decode.h dependency.
|
* Makefile.in (m32r.o,mloop.o,cpu.o,model.o): Add decode.h dependency.
|
||||||
|
(m32rx.o,mloopx.o,cpux.o,modelx.o): Add decodex.h dependency.
|
||||||
* decode.c,decode.h: Regenerate, introduces IDESC table.
|
* decode.c,decode.h: Regenerate, introduces IDESC table.
|
||||||
* mloop.in (extract16,extract32): Add IDESC support.
|
* mloop.in (extract16,extract32): Add IDESC support.
|
||||||
Update names of semantic handler member names.
|
Update names of semantic handler member names.
|
||||||
(execute): Ditto. Delete call to PROFILE_COUNT_INSN.
|
(execute): Ditto. Delete call to PROFILE_COUNT_INSN.
|
||||||
|
* decodex.c,decodex.h: Regenerate, introduces IDESC table.
|
||||||
|
* mloopx.in: Add IDESC support.
|
||||||
|
Update names of semantic handler member names.
|
||||||
|
Delete call to PROFILE_COUNT_INSN.
|
||||||
|
|
||||||
* sem-switch.c: Regenerate. Redo computed goto label handling.
|
* sem-switch.c: Regenerate. Redo computed goto label handling.
|
||||||
* sem.c: Regenerate. Call PROFILE_COUNT_INSN.
|
* sem.c: Regenerate. Call PROFILE_COUNT_INSN.
|
||||||
|
* readx.c: Regenerate. Redo computed goto label handling.
|
||||||
|
* semx.c: Regenerate. Call PROFILE_COUNT_INSN. Finish profiling
|
||||||
|
support.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
* Makefile.in (stamp-xcpu): Turn on profiling support.
|
||||||
|
end-sanitize-cygnus
|
||||||
|
|
||||||
* m32r.c (m32r_fetch_register): Change result type and args to
|
* m32r.c (m32r_fetch_register): Change result type and args to
|
||||||
conform to sim_fetch_register interface.
|
conform to sim_fetch_register interface.
|
||||||
(m32r_store_register): Ditto for sim_store_register interface.
|
(m32r_store_register): Ditto for sim_store_register interface.
|
||||||
|
* m32rx.c (m32rx_fetch_register): Change result type and args to
|
||||||
|
conform to sim_fetch_register interface.
|
||||||
|
(m32rx_store_register): Ditto for sim_store_register interface.
|
||||||
|
|
||||||
* sim-if.c (alloc_cpu): Delete.
|
* sim-if.c (alloc_cpu): Delete.
|
||||||
(free_state): Uninstall modules here ...
|
(free_state): Uninstall modules here ...
|
||||||
|
@ -400,6 +571,15 @@ Wed May 6 14:51:39 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* sim-main.h (sim_cia): Change to USI.
|
* sim-main.h (sim_cia): Change to USI.
|
||||||
(sim_cpu): Move m32r_misc_profile before machine generated part.
|
(sim_cpu): Move m32r_misc_profile before machine generated part.
|
||||||
|
|
||||||
|
start-sanitize-cygnus
|
||||||
|
Fri May 1 18:25:41 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in: Replace @MAINT@ with $(CGEN_MAINT).
|
||||||
|
(CGEN_MAINT): New variable.
|
||||||
|
* configure.in: Add support for --enable-cgen-maint.
|
||||||
|
* configure: Regenerate.
|
||||||
|
|
||||||
|
end-sanitize-cygnus
|
||||||
Tue Apr 28 18:33:31 1998 Geoffrey Noer <noer@cygnus.com>
|
Tue Apr 28 18:33:31 1998 Geoffrey Noer <noer@cygnus.com>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
@ -407,12 +587,15 @@ Tue Apr 28 18:33:31 1998 Geoffrey Noer <noer@cygnus.com>
|
||||||
Tue Apr 28 18:05:53 1998 Nick Clifton <nickc@cygnus.com>
|
Tue Apr 28 18:05:53 1998 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
* model.c: Rebuilt.
|
* model.c: Rebuilt.
|
||||||
|
* modelx.c: Rebuilt.
|
||||||
|
|
||||||
Mon Apr 27 15:36:30 1998 Doug Evans <devans@seba.cygnus.com>
|
Mon Apr 27 15:36:30 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
* cpu.h,model.c,sem-switch.c,sem.c: Regenerated. Mostly comment
|
* cpu.h,model.c,sem-switch.c,sem.c: Regenerated. Mostly comment
|
||||||
and variable renaming due to macro insn additions.
|
and variable renaming due to macro insn additions.
|
||||||
* mloop.in: Update to use CGEN_INSN_NUM.
|
* mloop.in: Update to use CGEN_INSN_NUM.
|
||||||
|
* cpux.h,modelx.c,readx.c,semx.c: Regenerated.
|
||||||
|
* mloopx.in: Update to use CGEN_INSN_NUM.
|
||||||
|
|
||||||
Sun Apr 26 15:31:55 1998 Tom Tromey <tromey@creche>
|
Sun Apr 26 15:31:55 1998 Tom Tromey <tromey@creche>
|
||||||
|
|
||||||
|
@ -439,10 +622,19 @@ Mon Apr 20 16:12:35 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
- cgen/m32r.cpu (h-accum): Add attribute FUN-ACCESS.
|
- cgen/m32r.cpu (h-accum): Add attribute FUN-ACCESS.
|
||||||
* m32r.c (m32r_h_accum_get,m32r_h_accum_set): New functions.
|
* m32r.c (m32r_h_accum_get,m32r_h_accum_set): New functions.
|
||||||
#include cgen-ops.h.
|
#include cgen-ops.h.
|
||||||
|
* cpux.c,readx.c,semx.c: Regenerate.
|
||||||
|
* m32rx.c (m32r_h_accum_get,m32r_h_accum_set): New functions.
|
||||||
|
#include cgen-ops.h. Delete inclusion of several unnecessary headers.
|
||||||
|
(m32r_h_accums_get): Sign extend top 8 bits.
|
||||||
|
|
||||||
|
Tue Apr 14 14:04:07 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
* semx.c: Regenerate.
|
||||||
|
|
||||||
Fri Apr 10 18:22:41 1998 Doug Evans <devans@canuck.cygnus.com>
|
Fri Apr 10 18:22:41 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* cpu.h,decode.c,decode.h,extract.c,sem.c,sem-switch.c: Regenerate.
|
* cpu.h,decode.c,decode.h,extract.c,sem.c,sem-switch.c: Regenerate.
|
||||||
|
* cpux.h,decodex.c,decodex.h,readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Sat Apr 4 20:36:25 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
Sat Apr 4 20:36:25 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
@ -480,6 +672,7 @@ Sat Mar 14 20:53:36 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* sim-if.c (do_trap): Result is new pc.
|
* sim-if.c (do_trap): Result is new pc.
|
||||||
Handle --environment=operating.
|
Handle --environment=operating.
|
||||||
* sem-switch.c,sem.c: Regenerate.
|
* sem-switch.c,sem.c: Regenerate.
|
||||||
|
* semx.c: Regenerate.
|
||||||
|
|
||||||
Wed Mar 11 14:07:39 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
Wed Mar 11 14:07:39 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
@ -491,8 +684,10 @@ Wed Mar 4 11:36:51 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* Makefile.in (SIM_EXTRA_DEPS): Add cpu-opc.h.
|
* Makefile.in (SIM_EXTRA_DEPS): Add cpu-opc.h.
|
||||||
(arch.o): Delete cpu-opc.h dependency.
|
(arch.o): Delete cpu-opc.h dependency.
|
||||||
(decode.o,model.o): Likewise.
|
(decode.o,model.o): Likewise.
|
||||||
|
(decodex.o,modelx.o): Likewise.
|
||||||
|
|
||||||
* cpu.h,model.c,sem-switch.c,sem.c: Regenerate.
|
* cpu.h,model.c,sem-switch.c,sem.c: Regenerate.
|
||||||
|
* cpux.h,decodex.[ch],modelx.c,readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Thu Feb 26 18:38:35 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
Thu Feb 26 18:38:35 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
@ -500,6 +695,11 @@ Thu Feb 26 18:38:35 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* sim-if.c (sim_info): Delete.
|
* sim-if.c (sim_info): Delete.
|
||||||
|
|
||||||
|
Fri Feb 27 10:14:29 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
* mloopx.in: Fix handling of branch in parallel with another insn.
|
||||||
|
* semx.c: Regenerate.
|
||||||
|
|
||||||
Mon Feb 23 13:30:46 1998 Doug Evans <devans@seba.cygnus.com>
|
Mon Feb 23 13:30:46 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
* sim-main.h: #include symcat.h.
|
* sim-main.h: #include symcat.h.
|
||||||
|
@ -507,17 +707,23 @@ Mon Feb 23 13:30:46 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
(NEW_PC_{BASE,SKIP,2,4,BRANCH_P}): New macros.
|
(NEW_PC_{BASE,SKIP,2,4,BRANCH_P}): New macros.
|
||||||
* cpu.[ch],decode.[ch],extract.c,model.c: Regenerate.
|
* cpu.[ch],decode.[ch],extract.c,model.c: Regenerate.
|
||||||
* sem.c,sem-switch.c: Regenerate.
|
* sem.c,sem-switch.c: Regenerate.
|
||||||
|
* m32r-sim.h (SEM_NEXT_PC): Modify to handle parallel exec.
|
||||||
|
* mloopx.in: Rewrite.
|
||||||
|
* cpux.[ch],decodex.[ch],readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Mon Feb 23 12:27:52 1998 Nick Clifton <nickc@cygnus.com>
|
Mon Feb 23 12:27:52 1998 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
* m32r.c (m32r_h_cr_set, m32r_h_cr_get): Shadow control register 6
|
* m32r.c (m32r_h_cr_set, m32r_h_cr_get): Shadow control register 6
|
||||||
in the backup PC register.
|
in the backup PC register.
|
||||||
|
* m32rx.c (m32r_h_cr_set, m32r_h_cr_get): Shadow control register 6
|
||||||
|
in the backup PC register.
|
||||||
|
|
||||||
Thu Feb 19 16:39:35 1998 Doug Evans <devans@canuck.cygnus.com>
|
Thu Feb 19 16:39:35 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* m32r.c (do_lock,do_unlock): Delete.
|
* m32r.c (do_lock,do_unlock): Delete.
|
||||||
* cpu.[ch],decode.[ch],extract.c,model.c: Regenerate.
|
* cpu.[ch],decode.[ch],extract.c,model.c: Regenerate.
|
||||||
* sem.c,sem-switch.c: Regenerate.
|
* sem.c,sem-switch.c: Regenerate.
|
||||||
|
* cpux.[ch],decodex.[ch],readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Tue Feb 17 18:18:10 1998 Doug Evans <devans@seba.cygnus.com>
|
Tue Feb 17 18:18:10 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -529,6 +735,14 @@ Tue Feb 17 18:18:10 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* cpuall.h,cpu.h,decode.c,decode.h,extract.c,model.c: Regenerate.
|
* cpuall.h,cpu.h,decode.c,decode.h,extract.c,model.c: Regenerate.
|
||||||
* sem-switch.c,sem.c: Regenerate.
|
* sem-switch.c,sem.c: Regenerate.
|
||||||
* mloop.in (execute): Update call to semantic fn.
|
* mloop.in (execute): Update call to semantic fn.
|
||||||
|
(M32RX_OBJS): Add cpux.o.
|
||||||
|
(cpux.o): Add rule for.
|
||||||
|
cpux.c: New file.
|
||||||
|
* cpux.h,decodex.c,decodex.h,modelx.c,readx.c,semx.c: Regenerate.
|
||||||
|
* m32rx.c (m32rx_h_accums_{get,set}): Rewrite.
|
||||||
|
(m32rx_h_cr_{get,set}): New functions.
|
||||||
|
(m32rx_h_accums_{get,set}): New functions.
|
||||||
|
* mloopx.in: Rewrite main loop.
|
||||||
|
|
||||||
* m32r.c (do_trap): Move from here.
|
* m32r.c (do_trap): Move from here.
|
||||||
* sim-if.c (do_trap): To here, and rewrite to use CB_SYSCALL support.
|
* sim-if.c (do_trap): To here, and rewrite to use CB_SYSCALL support.
|
||||||
|
@ -549,10 +763,18 @@ Wed Feb 11 19:53:48 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
* sim-main.h (CIA_GET,CIA_SET): Provide dummy definitions for now.
|
* sim-main.h (CIA_GET,CIA_SET): Provide dummy definitions for now.
|
||||||
|
|
||||||
* decode.c, decode.h, sem.c, sem-switch.c, model.c: Regenerate.
|
* decode.c, decode.h, sem.c, sem-switch.c, model.c: Regenerate.
|
||||||
|
* cpux.c, decodex.c, decodex.h, readx.c, semx.c, modelx.c: Regenerate.
|
||||||
|
|
||||||
Mon Feb 9 19:41:54 1998 Doug Evans <devans@canuck.cygnus.com>
|
Mon Feb 9 19:41:54 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
* decode.c, sem.c: Regenerate.
|
* decode.c, sem.c: Regenerate.
|
||||||
|
* cpux.h, decodex.c, readx.c, semx.c: Regenerate.
|
||||||
|
* m32rx.c (m32rx_h_accums_set): New function.
|
||||||
|
(m32rx_model_mark_[gs]et_h_gr): New function.
|
||||||
|
* mloopx.in: Rewrite.
|
||||||
|
* Makefile.in (mloopx.o): Build with -parallel.
|
||||||
|
* sim-main.h (_sim_cpu): Delete member `par_exec'.
|
||||||
|
* tconfig.in (WITH_SEM_SWITCH_FULL): Define as 0 for m32rx.
|
||||||
|
|
||||||
Thu Feb 5 12:44:31 1998 Doug Evans <devans@seba.cygnus.com>
|
Thu Feb 5 12:44:31 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
@ -563,6 +785,13 @@ Thu Feb 5 12:44:31 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* extract.c,model.c,sem-switch.c,sem.c: Regenerate.
|
* extract.c,model.c,sem-switch.c,sem.c: Regenerate.
|
||||||
* sim-main.h: #include "ansidecl.h".
|
* sim-main.h: #include "ansidecl.h".
|
||||||
Don't include cpu-opc.h, done by arch.h.
|
Don't include cpu-opc.h, done by arch.h.
|
||||||
|
* Makefile.in (M32RX_OBJS): Build m32rx support now.
|
||||||
|
(m32rx.o): New rule.
|
||||||
|
* m32r-sim.h (m32rx_h_cr_[gs]et): Define.
|
||||||
|
* m32rx.c (m32rx_{fetch,store}_register): Update {get,set} of PC.
|
||||||
|
(m32rx_h_accums_get): New function.
|
||||||
|
* mloopx.in: Update call to m32rx_decode. Rewrite exec loop.
|
||||||
|
* cpux.h,decodex.[ch],modelx.c,readx.c,semx.c: Regenerate.
|
||||||
|
|
||||||
Sun Feb 1 16:47:51 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
Sun Feb 1 16:47:51 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
@ -572,11 +801,23 @@ Sat Jan 31 18:15:41 1998 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|
||||||
|
Thu Jan 29 11:22:00 1998 Doug Evans <devans@canuck.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in (M32RX_OBJS): Comment out until m32rx port working.
|
||||||
|
* arch.h (HAVE_CPU_M32R{,X}): Delete, moved to m32r-opc.h.
|
||||||
|
* arch.c (machs): Check ifdef HAVE_CPU_FOO for each entry.
|
||||||
|
|
||||||
Tue Jan 20 14:16:02 1998 Nick Clifton <nickc@cygnus.com>
|
Tue Jan 20 14:16:02 1998 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
* cpux.h: Fix duplicate definition of h_accums field for
|
* cpux.h: Fix duplicate definition of h_accums field for
|
||||||
fmt_53_sadd structure.
|
fmt_53_sadd structure.
|
||||||
|
|
||||||
|
Tue Jan 20 01:42:17 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
|
|
||||||
|
* Makefile.in: Add m32rx objs, and rules to build them.
|
||||||
|
* cpux.h, decodex.h, decodex.c, readx.c, semx.c, modelx.c: New files.
|
||||||
|
* m32rx.c, mloopx.in: New files.
|
||||||
|
|
||||||
Mon Jan 19 22:26:29 1998 Doug Evans <devans@seba>
|
Mon Jan 19 22:26:29 1998 Doug Evans <devans@seba>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
@ -589,6 +830,9 @@ Mon Jan 19 14:13:40 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
* Makefile.in: Update.
|
* Makefile.in: Update.
|
||||||
* sem-ops.h: Deleted.
|
* sem-ops.h: Deleted.
|
||||||
* mem-ops.h: Deleted.
|
* mem-ops.h: Deleted.
|
||||||
|
start-sanitize-cygnus
|
||||||
|
Add cgen support for generating files.
|
||||||
|
end-sanitize-cygnus
|
||||||
(arch): Renamed from CPU.
|
(arch): Renamed from CPU.
|
||||||
* cpu.h: New file.
|
* cpu.h: New file.
|
||||||
* decode.c: Redone.
|
* decode.c: Redone.
|
||||||
|
@ -611,12 +855,15 @@ Mon Jan 19 14:13:40 1998 Doug Evans <devans@seba.cygnus.com>
|
||||||
(sim_open): Call sim_state_alloc, and malloc space for selected cpu
|
(sim_open): Call sim_state_alloc, and malloc space for selected cpu
|
||||||
type. Call sim_analyze_program.
|
type. Call sim_analyze_program.
|
||||||
(sim_create_inferior): Handle selected cpu type when setting PC.
|
(sim_create_inferior): Handle selected cpu type when setting PC.
|
||||||
|
(sim_resume): Handle m32rx.
|
||||||
(sim_stop_reason): Deleted.
|
(sim_stop_reason): Deleted.
|
||||||
(print_m32r_misc_cpu): Update.
|
(print_m32r_misc_cpu): Update.
|
||||||
|
(sim_{fetch,store}_register): Handle m32rx.
|
||||||
(sim_{read,write}): Deleted.
|
(sim_{read,write}): Deleted.
|
||||||
(sim_engine_illegal_insn): New function.
|
(sim_engine_illegal_insn): New function.
|
||||||
* sim-main.h: Don't include arch-defs.h,sim-core.h,sim-events.h.
|
* sim-main.h: Don't include arch-defs.h,sim-core.h,sim-events.h.
|
||||||
Include arch.h,cpuall.h. Include cpu.h,decode.h if m32r.
|
Include arch.h,cpuall.h. Include cpu.h,decode.h if m32r.
|
||||||
|
Include cpux.h,decodex.h if m32rx.
|
||||||
(_sim_cpu): Include member appropriate cpu_data member for the cpu.
|
(_sim_cpu): Include member appropriate cpu_data member for the cpu.
|
||||||
(M32R_MISC_PROFILE): Renamed from M32R_PROFILE.
|
(M32R_MISC_PROFILE): Renamed from M32R_PROFILE.
|
||||||
(sim_state): Delete members core,events,halt_jmp_buf.
|
(sim_state): Delete members core,events,halt_jmp_buf.
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
## COMMON_PRE_CONFIG_FRAG
|
## COMMON_PRE_CONFIG_FRAG
|
||||||
|
|
||||||
M32R_OBJS = m32r.o cpu.o decode.o sem.o model.o mloop.o
|
M32R_OBJS = m32r.o cpu.o decode.o sem.o model.o mloop.o
|
||||||
|
M32RX_OBJS = m32rx.o cpux.o decodex.o modelx.o mloopx.o
|
||||||
|
|
||||||
CONFIG_DEVICES = dv-sockser.o
|
CONFIG_DEVICES = dv-sockser.o
|
||||||
CONFIG_DEVICES =
|
CONFIG_DEVICES =
|
||||||
|
@ -36,6 +37,7 @@ SIM_OBJS = \
|
||||||
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
|
cgen-run.o sim-reason.o sim-engine.o sim-stop.o \
|
||||||
sim-if.o arch.o \
|
sim-if.o arch.o \
|
||||||
$(M32R_OBJS) \
|
$(M32R_OBJS) \
|
||||||
|
$(M32RX_OBJS) \
|
||||||
traps.o devices.o \
|
traps.o devices.o \
|
||||||
$(CONFIG_DEVICES)
|
$(CONFIG_DEVICES)
|
||||||
|
|
||||||
|
@ -87,9 +89,64 @@ decode.o: decode.c $(M32RBF_INCLUDE_DEPS)
|
||||||
sem.o: sem.c $(M32RBF_INCLUDE_DEPS)
|
sem.o: sem.c $(M32RBF_INCLUDE_DEPS)
|
||||||
model.o: model.c $(M32RBF_INCLUDE_DEPS)
|
model.o: model.c $(M32RBF_INCLUDE_DEPS)
|
||||||
|
|
||||||
|
# M32RX objs
|
||||||
|
|
||||||
|
M32RXF_INCLUDE_DEPS = \
|
||||||
|
$(CGEN_MAIN_CPU_DEPS) \
|
||||||
|
cpux.h decodex.h engx.h
|
||||||
|
|
||||||
|
m32rx.o: m32rx.c $(M32RXF_INCLUDE_DEPS)
|
||||||
|
|
||||||
|
# FIXME: Use of `mono' is wip.
|
||||||
|
mloopx.c engx.h: stamp-xmloop
|
||||||
|
stamp-xmloop: $(srcdir)/../common/genmloop.sh mloopx.in Makefile
|
||||||
|
$(SHELL) $(srccom)/genmloop.sh \
|
||||||
|
-mono -no-fast -pbb -parallel-write -switch semx-switch.c \
|
||||||
|
-cpu m32rxf -infile $(srcdir)/mloopx.in
|
||||||
|
$(SHELL) $(srcroot)/move-if-change eng.hin engx.h
|
||||||
|
$(SHELL) $(srcroot)/move-if-change mloop.cin mloopx.c
|
||||||
|
touch stamp-xmloop
|
||||||
|
mloopx.o: mloopx.c semx-switch.c $(M32RXF_INCLUDE_DEPS)
|
||||||
|
|
||||||
|
cpux.o: cpux.c $(M32RXF_INCLUDE_DEPS)
|
||||||
|
decodex.o: decodex.c $(M32RXF_INCLUDE_DEPS)
|
||||||
|
semx.o: semx.c $(M32RXF_INCLUDE_DEPS)
|
||||||
|
modelx.o: modelx.c $(M32RXF_INCLUDE_DEPS)
|
||||||
|
|
||||||
m32r-clean:
|
m32r-clean:
|
||||||
rm -f mloop.c eng.h stamp-mloop
|
rm -f mloop.c eng.h stamp-mloop
|
||||||
|
rm -f mloopx.c engx.h stamp-xmloop
|
||||||
|
# start-sanitize-cygnus
|
||||||
|
rm -f stamp-arch stamp-cpu stamp-xcpu
|
||||||
|
# end-sanitize-cygnus
|
||||||
rm -f tmp-*
|
rm -f tmp-*
|
||||||
|
|
||||||
|
# start-sanitize-cygnus
|
||||||
|
# cgen support, enable with --enable-cgen-maint
|
||||||
|
CGEN_MAINT = ; @true
|
||||||
|
# The following line is commented in or out depending upon --enable-cgen-maint.
|
||||||
|
@CGEN_MAINT@CGEN_MAINT =
|
||||||
|
|
||||||
|
stamp-arch: $(CGEN_READ_SCM) $(CGEN_ARCH_SCM) $(srccgen)/m32r.cpu
|
||||||
|
$(MAKE) cgen-arch $(CGEN_FLAGS_TO_PASS) mach=all \
|
||||||
|
FLAGS="with-scache with-profile=fn"
|
||||||
|
touch stamp-arch
|
||||||
|
arch.h arch.c cpuall.h: $(CGEN_MAINT) stamp-arch
|
||||||
|
@true
|
||||||
|
|
||||||
|
stamp-cpu: $(CGEN_READ_SCM) $(CGEN_CPU_SCM) $(CGEN_DECODE_SCM) $(srccgen)/m32r.cpu
|
||||||
|
$(MAKE) cgen-cpu-decode $(CGEN_FLAGS_TO_PASS) \
|
||||||
|
cpu=m32rbf mach=m32r SUFFIX= \
|
||||||
|
FLAGS="with-scache with-profile=fn" \
|
||||||
|
EXTRAFILES="$(CGEN_CPU_SEM) $(CGEN_CPU_SEMSW)"
|
||||||
|
touch stamp-cpu
|
||||||
|
cpu.h sem.c sem-switch.c model.c decode.c decode.h: $(CGEN_MAINT) stamp-cpu
|
||||||
|
@true
|
||||||
|
|
||||||
|
stamp-xcpu: $(CGEN_READ_SCM) $(CGEN_CPU_SCM) $(CGEN_DECODE_SCM) $(srccgen)/m32r.cpu
|
||||||
|
$(MAKE) cgen-cpu-decode $(CGEN_FLAGS_TO_PASS) \
|
||||||
|
cpu=m32rxf mach=m32rx SUFFIX=x FLAGS="with-scache with-profile=fn" EXTRAFILES="$(CGEN_CPU_SEMSW)"
|
||||||
|
touch stamp-xcpu
|
||||||
|
cpux.h semx-switch.c modelx.c decodex.c decodex.h: $(CGEN_MAINT) stamp-xcpu
|
||||||
|
@true
|
||||||
|
# end-sanitize-cygnus
|
||||||
|
|
|
@ -29,6 +29,9 @@ const MACH *sim_machs[] =
|
||||||
{
|
{
|
||||||
#ifdef HAVE_CPU_M32RBF
|
#ifdef HAVE_CPU_M32RBF
|
||||||
& m32r_mach,
|
& m32r_mach,
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_CPU_M32RXF
|
||||||
|
& m32rx_mach,
|
||||||
#endif
|
#endif
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
|
@ -29,8 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
/* Enum declaration for model types. */
|
/* Enum declaration for model types. */
|
||||||
typedef enum model_type {
|
typedef enum model_type {
|
||||||
MODEL_M32R_D, MODEL_TEST
|
MODEL_M32R_D, MODEL_TEST, MODEL_M32RX, MODEL_MAX
|
||||||
, MODEL_MAX
|
|
||||||
} MODEL_TYPE;
|
} MODEL_TYPE;
|
||||||
|
|
||||||
#define MAX_MODELS ((int) MODEL_MAX)
|
#define MAX_MODELS ((int) MODEL_MAX)
|
||||||
|
@ -39,7 +38,8 @@ typedef enum model_type {
|
||||||
typedef enum unit_type {
|
typedef enum unit_type {
|
||||||
UNIT_NONE, UNIT_M32R_D_U_STORE, UNIT_M32R_D_U_LOAD, UNIT_M32R_D_U_CTI
|
UNIT_NONE, UNIT_M32R_D_U_STORE, UNIT_M32R_D_U_LOAD, UNIT_M32R_D_U_CTI
|
||||||
, UNIT_M32R_D_U_MAC, UNIT_M32R_D_U_CMP, UNIT_M32R_D_U_EXEC, UNIT_TEST_U_EXEC
|
, UNIT_M32R_D_U_MAC, UNIT_M32R_D_U_CMP, UNIT_M32R_D_U_EXEC, UNIT_TEST_U_EXEC
|
||||||
, UNIT_MAX
|
, UNIT_M32RX_U_STORE, UNIT_M32RX_U_LOAD, UNIT_M32RX_U_CTI, UNIT_M32RX_U_MAC
|
||||||
|
, UNIT_M32RX_U_CMP, UNIT_M32RX_U_EXEC, UNIT_MAX
|
||||||
} UNIT_TYPE;
|
} UNIT_TYPE;
|
||||||
|
|
||||||
#define MAX_UNITS (2)
|
#define MAX_UNITS (2)
|
||||||
|
|
|
@ -42,6 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const MACH m32r_mach;
|
extern const MACH m32r_mach;
|
||||||
|
extern const MACH m32rx_mach;
|
||||||
|
|
||||||
#ifndef WANT_CPU
|
#ifndef WANT_CPU
|
||||||
/* The ARGBUF struct. */
|
/* The ARGBUF struct. */
|
||||||
|
|
197
sim/m32r/cpux.c
Normal file
197
sim/m32r/cpux.c
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
/* Misc. support for CPU family m32rxf.
|
||||||
|
|
||||||
|
THIS FILE IS MACHINE GENERATED WITH CGEN.
|
||||||
|
|
||||||
|
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU Simulators.
|
||||||
|
|
||||||
|
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, 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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WANT_CPU m32rxf
|
||||||
|
#define WANT_CPU_M32RXF
|
||||||
|
|
||||||
|
#include "sim-main.h"
|
||||||
|
#include "cgen-ops.h"
|
||||||
|
|
||||||
|
/* Get the value of h-pc. */
|
||||||
|
|
||||||
|
USI
|
||||||
|
m32rxf_h_pc_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return CPU (h_pc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-pc. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_pc_set (SIM_CPU *current_cpu, USI newval)
|
||||||
|
{
|
||||||
|
CPU (h_pc) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-gr. */
|
||||||
|
|
||||||
|
SI
|
||||||
|
m32rxf_h_gr_get (SIM_CPU *current_cpu, UINT regno)
|
||||||
|
{
|
||||||
|
return CPU (h_gr[regno]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-gr. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_gr_set (SIM_CPU *current_cpu, UINT regno, SI newval)
|
||||||
|
{
|
||||||
|
CPU (h_gr[regno]) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-cr. */
|
||||||
|
|
||||||
|
USI
|
||||||
|
m32rxf_h_cr_get (SIM_CPU *current_cpu, UINT regno)
|
||||||
|
{
|
||||||
|
return GET_H_CR (regno);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-cr. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_cr_set (SIM_CPU *current_cpu, UINT regno, USI newval)
|
||||||
|
{
|
||||||
|
SET_H_CR (regno, newval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-accum. */
|
||||||
|
|
||||||
|
DI
|
||||||
|
m32rxf_h_accum_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return GET_H_ACCUM ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-accum. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_accum_set (SIM_CPU *current_cpu, DI newval)
|
||||||
|
{
|
||||||
|
SET_H_ACCUM (newval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-accums. */
|
||||||
|
|
||||||
|
DI
|
||||||
|
m32rxf_h_accums_get (SIM_CPU *current_cpu, UINT regno)
|
||||||
|
{
|
||||||
|
return GET_H_ACCUMS (regno);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-accums. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_accums_set (SIM_CPU *current_cpu, UINT regno, DI newval)
|
||||||
|
{
|
||||||
|
SET_H_ACCUMS (regno, newval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-cond. */
|
||||||
|
|
||||||
|
BI
|
||||||
|
m32rxf_h_cond_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return CPU (h_cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-cond. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_cond_set (SIM_CPU *current_cpu, BI newval)
|
||||||
|
{
|
||||||
|
CPU (h_cond) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-psw. */
|
||||||
|
|
||||||
|
UQI
|
||||||
|
m32rxf_h_psw_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return GET_H_PSW ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-psw. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_psw_set (SIM_CPU *current_cpu, UQI newval)
|
||||||
|
{
|
||||||
|
SET_H_PSW (newval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-bpsw. */
|
||||||
|
|
||||||
|
UQI
|
||||||
|
m32rxf_h_bpsw_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return CPU (h_bpsw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-bpsw. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_bpsw_set (SIM_CPU *current_cpu, UQI newval)
|
||||||
|
{
|
||||||
|
CPU (h_bpsw) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-bbpsw. */
|
||||||
|
|
||||||
|
UQI
|
||||||
|
m32rxf_h_bbpsw_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return CPU (h_bbpsw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-bbpsw. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_bbpsw_set (SIM_CPU *current_cpu, UQI newval)
|
||||||
|
{
|
||||||
|
CPU (h_bbpsw) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the value of h-lock. */
|
||||||
|
|
||||||
|
BI
|
||||||
|
m32rxf_h_lock_get (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return CPU (h_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set a value for h-lock. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_lock_set (SIM_CPU *current_cpu, BI newval)
|
||||||
|
{
|
||||||
|
CPU (h_lock) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Record trace results for INSN. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_record_trace_results (SIM_CPU *current_cpu, CGEN_INSN *insn,
|
||||||
|
int *indices, TRACE_RECORD *tr)
|
||||||
|
{
|
||||||
|
}
|
945
sim/m32r/cpux.h
Normal file
945
sim/m32r/cpux.h
Normal file
|
@ -0,0 +1,945 @@
|
||||||
|
/* CPU family header for m32rxf.
|
||||||
|
|
||||||
|
THIS FILE IS MACHINE GENERATED WITH CGEN.
|
||||||
|
|
||||||
|
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU Simulators.
|
||||||
|
|
||||||
|
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, 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 CPU_M32RXF_H
|
||||||
|
#define CPU_M32RXF_H
|
||||||
|
|
||||||
|
/* Maximum number of instructions that are fetched at a time.
|
||||||
|
This is for LIW type instructions sets (e.g. m32r). */
|
||||||
|
#define MAX_LIW_INSNS 2
|
||||||
|
|
||||||
|
/* Maximum number of instructions that can be executed in parallel. */
|
||||||
|
#define MAX_PARALLEL_INSNS 2
|
||||||
|
|
||||||
|
/* CPU state information. */
|
||||||
|
typedef struct {
|
||||||
|
/* Hardware elements. */
|
||||||
|
struct {
|
||||||
|
/* program counter */
|
||||||
|
USI h_pc;
|
||||||
|
#define GET_H_PC() CPU (h_pc)
|
||||||
|
#define SET_H_PC(x) (CPU (h_pc) = (x))
|
||||||
|
/* general registers */
|
||||||
|
SI h_gr[16];
|
||||||
|
#define GET_H_GR(a1) CPU (h_gr)[a1]
|
||||||
|
#define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
|
||||||
|
/* control registers */
|
||||||
|
USI h_cr[16];
|
||||||
|
#define GET_H_CR(index) m32rxf_h_cr_get_handler (current_cpu, index)
|
||||||
|
#define SET_H_CR(index, x) \
|
||||||
|
do { \
|
||||||
|
m32rxf_h_cr_set_handler (current_cpu, (index), (x));\
|
||||||
|
} while (0)
|
||||||
|
/* accumulator */
|
||||||
|
DI h_accum;
|
||||||
|
#define GET_H_ACCUM() m32rxf_h_accum_get_handler (current_cpu)
|
||||||
|
#define SET_H_ACCUM(x) \
|
||||||
|
do { \
|
||||||
|
m32rxf_h_accum_set_handler (current_cpu, (x));\
|
||||||
|
} while (0)
|
||||||
|
/* accumulators */
|
||||||
|
DI h_accums[2];
|
||||||
|
#define GET_H_ACCUMS(index) m32rxf_h_accums_get_handler (current_cpu, index)
|
||||||
|
#define SET_H_ACCUMS(index, x) \
|
||||||
|
do { \
|
||||||
|
m32rxf_h_accums_set_handler (current_cpu, (index), (x));\
|
||||||
|
} while (0)
|
||||||
|
/* condition bit */
|
||||||
|
BI h_cond;
|
||||||
|
#define GET_H_COND() CPU (h_cond)
|
||||||
|
#define SET_H_COND(x) (CPU (h_cond) = (x))
|
||||||
|
/* psw part of psw */
|
||||||
|
UQI h_psw;
|
||||||
|
#define GET_H_PSW() m32rxf_h_psw_get_handler (current_cpu)
|
||||||
|
#define SET_H_PSW(x) \
|
||||||
|
do { \
|
||||||
|
m32rxf_h_psw_set_handler (current_cpu, (x));\
|
||||||
|
} while (0)
|
||||||
|
/* backup psw */
|
||||||
|
UQI h_bpsw;
|
||||||
|
#define GET_H_BPSW() CPU (h_bpsw)
|
||||||
|
#define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
|
||||||
|
/* backup bpsw */
|
||||||
|
UQI h_bbpsw;
|
||||||
|
#define GET_H_BBPSW() CPU (h_bbpsw)
|
||||||
|
#define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
|
||||||
|
/* lock */
|
||||||
|
BI h_lock;
|
||||||
|
#define GET_H_LOCK() CPU (h_lock)
|
||||||
|
#define SET_H_LOCK(x) (CPU (h_lock) = (x))
|
||||||
|
} hardware;
|
||||||
|
#define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
|
||||||
|
} M32RXF_CPU_DATA;
|
||||||
|
|
||||||
|
/* Cover fns for register access. */
|
||||||
|
USI m32rxf_h_pc_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_pc_set (SIM_CPU *, USI);
|
||||||
|
SI m32rxf_h_gr_get (SIM_CPU *, UINT);
|
||||||
|
void m32rxf_h_gr_set (SIM_CPU *, UINT, SI);
|
||||||
|
USI m32rxf_h_cr_get (SIM_CPU *, UINT);
|
||||||
|
void m32rxf_h_cr_set (SIM_CPU *, UINT, USI);
|
||||||
|
DI m32rxf_h_accum_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_accum_set (SIM_CPU *, DI);
|
||||||
|
DI m32rxf_h_accums_get (SIM_CPU *, UINT);
|
||||||
|
void m32rxf_h_accums_set (SIM_CPU *, UINT, DI);
|
||||||
|
BI m32rxf_h_cond_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_cond_set (SIM_CPU *, BI);
|
||||||
|
UQI m32rxf_h_psw_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_psw_set (SIM_CPU *, UQI);
|
||||||
|
UQI m32rxf_h_bpsw_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_bpsw_set (SIM_CPU *, UQI);
|
||||||
|
UQI m32rxf_h_bbpsw_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_bbpsw_set (SIM_CPU *, UQI);
|
||||||
|
BI m32rxf_h_lock_get (SIM_CPU *);
|
||||||
|
void m32rxf_h_lock_set (SIM_CPU *, BI);
|
||||||
|
|
||||||
|
/* These must be hand-written. */
|
||||||
|
extern CPUREG_FETCH_FN m32rxf_fetch_register;
|
||||||
|
extern CPUREG_STORE_FN m32rxf_store_register;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int empty;
|
||||||
|
} MODEL_M32RX_DATA;
|
||||||
|
|
||||||
|
/* Instruction argument buffer. */
|
||||||
|
|
||||||
|
union sem_fields {
|
||||||
|
struct { /* no operands */
|
||||||
|
int empty;
|
||||||
|
} fmt_empty;
|
||||||
|
struct { /* */
|
||||||
|
UINT f_uimm4;
|
||||||
|
} sfmt_trap;
|
||||||
|
struct { /* */
|
||||||
|
IADDR i_disp24;
|
||||||
|
unsigned char out_h_gr_14;
|
||||||
|
} sfmt_bl24;
|
||||||
|
struct { /* */
|
||||||
|
IADDR i_disp8;
|
||||||
|
unsigned char out_h_gr_14;
|
||||||
|
} sfmt_bl8;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
UINT f_hi16;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_seth;
|
||||||
|
struct { /* */
|
||||||
|
SI f_imm1;
|
||||||
|
UINT f_accd;
|
||||||
|
UINT f_accs;
|
||||||
|
} sfmt_rac_dsi;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_sr;
|
||||||
|
UINT f_r1;
|
||||||
|
unsigned char in_sr;
|
||||||
|
} sfmt_mvtc;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_src1;
|
||||||
|
UINT f_accs;
|
||||||
|
unsigned char in_src1;
|
||||||
|
} sfmt_mvtachi_a;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
UINT f_r2;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_mvfc;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
UINT f_accs;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_mvfachi_a;
|
||||||
|
struct { /* */
|
||||||
|
ADDR i_uimm24;
|
||||||
|
SI* i_dr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_ld24;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_sr;
|
||||||
|
unsigned char in_sr;
|
||||||
|
unsigned char out_h_gr_14;
|
||||||
|
} sfmt_jl;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
UINT f_uimm5;
|
||||||
|
unsigned char in_dr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_slli;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
INT f_simm8;
|
||||||
|
unsigned char in_dr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_addi;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_src1;
|
||||||
|
SI* i_src2;
|
||||||
|
unsigned char in_src1;
|
||||||
|
unsigned char in_src2;
|
||||||
|
unsigned char out_src2;
|
||||||
|
} sfmt_st_plus;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_src1;
|
||||||
|
SI* i_src2;
|
||||||
|
INT f_simm16;
|
||||||
|
unsigned char in_src1;
|
||||||
|
unsigned char in_src2;
|
||||||
|
} sfmt_st_d;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_src1;
|
||||||
|
SI* i_src2;
|
||||||
|
UINT f_acc;
|
||||||
|
unsigned char in_src1;
|
||||||
|
unsigned char in_src2;
|
||||||
|
} sfmt_machi_a;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
SI* i_sr;
|
||||||
|
unsigned char in_sr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
unsigned char out_sr;
|
||||||
|
} sfmt_ld_plus;
|
||||||
|
struct { /* */
|
||||||
|
IADDR i_disp16;
|
||||||
|
SI* i_src1;
|
||||||
|
SI* i_src2;
|
||||||
|
unsigned char in_src1;
|
||||||
|
unsigned char in_src2;
|
||||||
|
} sfmt_beq;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
SI* i_sr;
|
||||||
|
UINT f_uimm16;
|
||||||
|
unsigned char in_sr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_and3;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
SI* i_sr;
|
||||||
|
INT f_simm16;
|
||||||
|
unsigned char in_sr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_add3;
|
||||||
|
struct { /* */
|
||||||
|
SI* i_dr;
|
||||||
|
SI* i_sr;
|
||||||
|
unsigned char in_dr;
|
||||||
|
unsigned char in_sr;
|
||||||
|
unsigned char out_dr;
|
||||||
|
} sfmt_add;
|
||||||
|
#if WITH_SCACHE_PBB
|
||||||
|
/* Writeback handler. */
|
||||||
|
struct {
|
||||||
|
/* Pointer to argbuf entry for insn whose results need writing back. */
|
||||||
|
const struct argbuf *abuf;
|
||||||
|
} write;
|
||||||
|
/* x-before handler */
|
||||||
|
struct {
|
||||||
|
/*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
|
||||||
|
int first_p;
|
||||||
|
} before;
|
||||||
|
/* x-after handler */
|
||||||
|
struct {
|
||||||
|
int empty;
|
||||||
|
} after;
|
||||||
|
/* This entry is used to terminate each pbb. */
|
||||||
|
struct {
|
||||||
|
/* Number of insns in pbb. */
|
||||||
|
int insn_count;
|
||||||
|
/* Next pbb to execute. */
|
||||||
|
SCACHE *next;
|
||||||
|
SCACHE *branch_target;
|
||||||
|
} chain;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The ARGBUF struct. */
|
||||||
|
struct argbuf {
|
||||||
|
/* These are the baseclass definitions. */
|
||||||
|
IADDR addr;
|
||||||
|
const IDESC *idesc;
|
||||||
|
char trace_p;
|
||||||
|
char profile_p;
|
||||||
|
/* ??? Temporary hack for skip insns. */
|
||||||
|
char skip_count;
|
||||||
|
char unused;
|
||||||
|
/* cpu specific data follows */
|
||||||
|
union sem semantic;
|
||||||
|
int written;
|
||||||
|
union sem_fields fields;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* A cached insn.
|
||||||
|
|
||||||
|
??? SCACHE used to contain more than just argbuf. We could delete the
|
||||||
|
type entirely and always just use ARGBUF, but for future concerns and as
|
||||||
|
a level of abstraction it is left in. */
|
||||||
|
|
||||||
|
struct scache {
|
||||||
|
struct argbuf argbuf;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Macros to simplify extraction, reading and semantic code.
|
||||||
|
These define and assign the local vars that contain the insn's fields. */
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_EMPTY_VARS \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_EMPTY_CODE \
|
||||||
|
length = 0; \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_ADD_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_ADD_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_ADD3_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
INT f_simm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_ADD3_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_AND3_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
UINT f_uimm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_AND3_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_OR3_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
UINT f_uimm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_OR3_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_ADDI_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
INT f_simm8; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_ADDI_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_simm8 = EXTRACT_MSB0_INT (insn, 16, 8, 8); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_ADDV3_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
INT f_simm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_ADDV3_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_BC8_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
SI f_disp8; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_BC8_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_disp8 = ((((EXTRACT_MSB0_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_BC24_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
SI f_disp24; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_BC24_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_disp24 = ((((EXTRACT_MSB0_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_BEQ_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
SI f_disp16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_BEQ_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_BEQZ_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
SI f_disp16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_BEQZ_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_CMP_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_CMP_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_CMPI_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
INT f_simm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_CMPI_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_CMPZ_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_CMPZ_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_DIV_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
INT f_simm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_DIV_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_JC_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_JC_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_LD24_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_uimm24; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_LD24_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_LDI16_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
INT f_simm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_LDI16_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_MACHI_A_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_acc; \
|
||||||
|
UINT f_op23; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_MACHI_A_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_acc = EXTRACT_MSB0_UINT (insn, 16, 8, 1); \
|
||||||
|
f_op23 = EXTRACT_MSB0_UINT (insn, 16, 9, 3); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_MVFACHI_A_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_accs; \
|
||||||
|
UINT f_op3; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_MVFACHI_A_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
|
||||||
|
f_op3 = EXTRACT_MSB0_UINT (insn, 16, 14, 2); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_MVFC_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_MVFC_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_MVTACHI_A_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_accs; \
|
||||||
|
UINT f_op3; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_MVTACHI_A_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
|
||||||
|
f_op3 = EXTRACT_MSB0_UINT (insn, 16, 14, 2); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_MVTC_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_MVTC_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_NOP_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_NOP_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_RAC_DSI_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_accd; \
|
||||||
|
UINT f_bits67; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_accs; \
|
||||||
|
UINT f_bit14; \
|
||||||
|
SI f_imm1; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_RAC_DSI_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_accd = EXTRACT_MSB0_UINT (insn, 16, 4, 2); \
|
||||||
|
f_bits67 = EXTRACT_MSB0_UINT (insn, 16, 6, 2); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_accs = EXTRACT_MSB0_UINT (insn, 16, 12, 2); \
|
||||||
|
f_bit14 = EXTRACT_MSB0_UINT (insn, 16, 14, 1); \
|
||||||
|
f_imm1 = ((EXTRACT_MSB0_UINT (insn, 16, 15, 1)) + (1)); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_SETH_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
UINT f_hi16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_SETH_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_SLLI_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_shift_op2; \
|
||||||
|
UINT f_uimm5; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_SLLI_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
|
||||||
|
f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_ST_D_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
INT f_simm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_ST_D_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_TRAP_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_uimm4; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_TRAP_CODE \
|
||||||
|
length = 2; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
|
||||||
|
f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
|
||||||
|
|
||||||
|
#define EXTRACT_IFMT_SATB_VARS \
|
||||||
|
UINT f_op1; \
|
||||||
|
UINT f_r1; \
|
||||||
|
UINT f_op2; \
|
||||||
|
UINT f_r2; \
|
||||||
|
UINT f_uimm16; \
|
||||||
|
unsigned int length;
|
||||||
|
#define EXTRACT_IFMT_SATB_CODE \
|
||||||
|
length = 4; \
|
||||||
|
f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
|
||||||
|
f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
|
||||||
|
f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
|
||||||
|
f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
|
||||||
|
f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
|
||||||
|
|
||||||
|
/* Queued output values of an instruction. */
|
||||||
|
|
||||||
|
struct parexec {
|
||||||
|
union {
|
||||||
|
struct { /* empty sformat for unspecified field list */
|
||||||
|
int empty;
|
||||||
|
} sfmt_empty;
|
||||||
|
struct { /* e.g. add $dr,$sr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_add;
|
||||||
|
struct { /* e.g. add3 $dr,$sr,$hash$slo16 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_add3;
|
||||||
|
struct { /* e.g. and3 $dr,$sr,$uimm16 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_and3;
|
||||||
|
struct { /* e.g. or3 $dr,$sr,$hash$ulo16 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_or3;
|
||||||
|
struct { /* e.g. addi $dr,$simm8 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_addi;
|
||||||
|
struct { /* e.g. addv $dr,$sr */
|
||||||
|
BI condbit;
|
||||||
|
SI dr;
|
||||||
|
} sfmt_addv;
|
||||||
|
struct { /* e.g. addv3 $dr,$sr,$simm16 */
|
||||||
|
BI condbit;
|
||||||
|
SI dr;
|
||||||
|
} sfmt_addv3;
|
||||||
|
struct { /* e.g. addx $dr,$sr */
|
||||||
|
BI condbit;
|
||||||
|
SI dr;
|
||||||
|
} sfmt_addx;
|
||||||
|
struct { /* e.g. bc.s $disp8 */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bc8;
|
||||||
|
struct { /* e.g. bc.l $disp24 */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bc24;
|
||||||
|
struct { /* e.g. beq $src1,$src2,$disp16 */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_beq;
|
||||||
|
struct { /* e.g. beqz $src2,$disp16 */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_beqz;
|
||||||
|
struct { /* e.g. bl.s $disp8 */
|
||||||
|
SI h_gr_14;
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bl8;
|
||||||
|
struct { /* e.g. bl.l $disp24 */
|
||||||
|
SI h_gr_14;
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bl24;
|
||||||
|
struct { /* e.g. bcl.s $disp8 */
|
||||||
|
SI h_gr_14;
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bcl8;
|
||||||
|
struct { /* e.g. bcl.l $disp24 */
|
||||||
|
SI h_gr_14;
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bcl24;
|
||||||
|
struct { /* e.g. bra.s $disp8 */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bra8;
|
||||||
|
struct { /* e.g. bra.l $disp24 */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_bra24;
|
||||||
|
struct { /* e.g. cmp $src1,$src2 */
|
||||||
|
BI condbit;
|
||||||
|
} sfmt_cmp;
|
||||||
|
struct { /* e.g. cmpi $src2,$simm16 */
|
||||||
|
BI condbit;
|
||||||
|
} sfmt_cmpi;
|
||||||
|
struct { /* e.g. cmpz $src2 */
|
||||||
|
BI condbit;
|
||||||
|
} sfmt_cmpz;
|
||||||
|
struct { /* e.g. div $dr,$sr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_div;
|
||||||
|
struct { /* e.g. jc $sr */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_jc;
|
||||||
|
struct { /* e.g. jl $sr */
|
||||||
|
SI h_gr_14;
|
||||||
|
USI pc;
|
||||||
|
} sfmt_jl;
|
||||||
|
struct { /* e.g. jmp $sr */
|
||||||
|
USI pc;
|
||||||
|
} sfmt_jmp;
|
||||||
|
struct { /* e.g. ld $dr,@$sr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_ld;
|
||||||
|
struct { /* e.g. ld $dr,@($slo16,$sr) */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_ld_d;
|
||||||
|
struct { /* e.g. ld $dr,@$sr+ */
|
||||||
|
SI dr;
|
||||||
|
SI sr;
|
||||||
|
} sfmt_ld_plus;
|
||||||
|
struct { /* e.g. ld24 $dr,$uimm24 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_ld24;
|
||||||
|
struct { /* e.g. ldi8 $dr,$simm8 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_ldi8;
|
||||||
|
struct { /* e.g. ldi16 $dr,$hash$slo16 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_ldi16;
|
||||||
|
struct { /* e.g. lock $dr,@$sr */
|
||||||
|
SI dr;
|
||||||
|
BI h_lock;
|
||||||
|
} sfmt_lock;
|
||||||
|
struct { /* e.g. machi $src1,$src2,$acc */
|
||||||
|
DI acc;
|
||||||
|
} sfmt_machi_a;
|
||||||
|
struct { /* e.g. mulhi $src1,$src2,$acc */
|
||||||
|
DI acc;
|
||||||
|
} sfmt_mulhi_a;
|
||||||
|
struct { /* e.g. mv $dr,$sr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_mv;
|
||||||
|
struct { /* e.g. mvfachi $dr,$accs */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_mvfachi_a;
|
||||||
|
struct { /* e.g. mvfc $dr,$scr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_mvfc;
|
||||||
|
struct { /* e.g. mvtachi $src1,$accs */
|
||||||
|
DI accs;
|
||||||
|
} sfmt_mvtachi_a;
|
||||||
|
struct { /* e.g. mvtc $sr,$dcr */
|
||||||
|
USI dcr;
|
||||||
|
} sfmt_mvtc;
|
||||||
|
struct { /* e.g. nop */
|
||||||
|
int empty;
|
||||||
|
} sfmt_nop;
|
||||||
|
struct { /* e.g. rac $accd,$accs,$imm1 */
|
||||||
|
DI accd;
|
||||||
|
} sfmt_rac_dsi;
|
||||||
|
struct { /* e.g. rte */
|
||||||
|
UQI h_bpsw;
|
||||||
|
USI h_cr_6;
|
||||||
|
UQI h_psw;
|
||||||
|
USI pc;
|
||||||
|
} sfmt_rte;
|
||||||
|
struct { /* e.g. seth $dr,$hash$hi16 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_seth;
|
||||||
|
struct { /* e.g. sll3 $dr,$sr,$simm16 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_sll3;
|
||||||
|
struct { /* e.g. slli $dr,$uimm5 */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_slli;
|
||||||
|
struct { /* e.g. st $src1,@$src2 */
|
||||||
|
SI h_memory_src2;
|
||||||
|
USI h_memory_src2_idx;
|
||||||
|
} sfmt_st;
|
||||||
|
struct { /* e.g. st $src1,@($slo16,$src2) */
|
||||||
|
SI h_memory_add__DFLT_src2_slo16;
|
||||||
|
USI h_memory_add__DFLT_src2_slo16_idx;
|
||||||
|
} sfmt_st_d;
|
||||||
|
struct { /* e.g. stb $src1,@$src2 */
|
||||||
|
QI h_memory_src2;
|
||||||
|
USI h_memory_src2_idx;
|
||||||
|
} sfmt_stb;
|
||||||
|
struct { /* e.g. stb $src1,@($slo16,$src2) */
|
||||||
|
QI h_memory_add__DFLT_src2_slo16;
|
||||||
|
USI h_memory_add__DFLT_src2_slo16_idx;
|
||||||
|
} sfmt_stb_d;
|
||||||
|
struct { /* e.g. sth $src1,@$src2 */
|
||||||
|
HI h_memory_src2;
|
||||||
|
USI h_memory_src2_idx;
|
||||||
|
} sfmt_sth;
|
||||||
|
struct { /* e.g. sth $src1,@($slo16,$src2) */
|
||||||
|
HI h_memory_add__DFLT_src2_slo16;
|
||||||
|
USI h_memory_add__DFLT_src2_slo16_idx;
|
||||||
|
} sfmt_sth_d;
|
||||||
|
struct { /* e.g. st $src1,@+$src2 */
|
||||||
|
SI h_memory_new_src2;
|
||||||
|
USI h_memory_new_src2_idx;
|
||||||
|
SI src2;
|
||||||
|
} sfmt_st_plus;
|
||||||
|
struct { /* e.g. trap $uimm4 */
|
||||||
|
UQI h_bbpsw;
|
||||||
|
UQI h_bpsw;
|
||||||
|
USI h_cr_14;
|
||||||
|
USI h_cr_6;
|
||||||
|
UQI h_psw;
|
||||||
|
SI pc;
|
||||||
|
} sfmt_trap;
|
||||||
|
struct { /* e.g. unlock $src1,@$src2 */
|
||||||
|
BI h_lock;
|
||||||
|
SI h_memory_src2;
|
||||||
|
USI h_memory_src2_idx;
|
||||||
|
} sfmt_unlock;
|
||||||
|
struct { /* e.g. satb $dr,$sr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_satb;
|
||||||
|
struct { /* e.g. sat $dr,$sr */
|
||||||
|
SI dr;
|
||||||
|
} sfmt_sat;
|
||||||
|
struct { /* e.g. sadd */
|
||||||
|
DI h_accums_0;
|
||||||
|
} sfmt_sadd;
|
||||||
|
struct { /* e.g. macwu1 $src1,$src2 */
|
||||||
|
DI h_accums_1;
|
||||||
|
} sfmt_macwu1;
|
||||||
|
struct { /* e.g. msblo $src1,$src2 */
|
||||||
|
DI accum;
|
||||||
|
} sfmt_msblo;
|
||||||
|
struct { /* e.g. mulwu1 $src1,$src2 */
|
||||||
|
DI h_accums_1;
|
||||||
|
} sfmt_mulwu1;
|
||||||
|
struct { /* e.g. sc */
|
||||||
|
int empty;
|
||||||
|
} sfmt_sc;
|
||||||
|
} operands;
|
||||||
|
/* For conditionally written operands, bitmask of which ones were. */
|
||||||
|
int written;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Collection of various things for the trace handler to use. */
|
||||||
|
|
||||||
|
typedef struct trace_record {
|
||||||
|
IADDR pc;
|
||||||
|
/* FIXME:wip */
|
||||||
|
} TRACE_RECORD;
|
||||||
|
|
||||||
|
#endif /* CPU_M32RXF_H */
|
2223
sim/m32r/decodex.c
Normal file
2223
sim/m32r/decodex.c
Normal file
File diff suppressed because it is too large
Load diff
143
sim/m32r/decodex.h
Normal file
143
sim/m32r/decodex.h
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
/* Decode header for m32rxf.
|
||||||
|
|
||||||
|
THIS FILE IS MACHINE GENERATED WITH CGEN.
|
||||||
|
|
||||||
|
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of the GNU Simulators.
|
||||||
|
|
||||||
|
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, 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 M32RXF_DECODE_H
|
||||||
|
#define M32RXF_DECODE_H
|
||||||
|
|
||||||
|
extern const IDESC *m32rxf_decode (SIM_CPU *, IADDR,
|
||||||
|
CGEN_INSN_INT, CGEN_INSN_INT,
|
||||||
|
ARGBUF *);
|
||||||
|
extern void m32rxf_init_idesc_table (SIM_CPU *);
|
||||||
|
extern void m32rxf_sem_init_idesc_table (SIM_CPU *);
|
||||||
|
extern void m32rxf_semf_init_idesc_table (SIM_CPU *);
|
||||||
|
|
||||||
|
/* Enum declaration for instructions in cpu family m32rxf. */
|
||||||
|
typedef enum m32rxf_insn_type {
|
||||||
|
M32RXF_INSN_X_INVALID, M32RXF_INSN_X_AFTER, M32RXF_INSN_X_BEFORE, M32RXF_INSN_X_CTI_CHAIN
|
||||||
|
, M32RXF_INSN_X_CHAIN, M32RXF_INSN_X_BEGIN, M32RXF_INSN_ADD, M32RXF_INSN_ADD3
|
||||||
|
, M32RXF_INSN_AND, M32RXF_INSN_AND3, M32RXF_INSN_OR, M32RXF_INSN_OR3
|
||||||
|
, M32RXF_INSN_XOR, M32RXF_INSN_XOR3, M32RXF_INSN_ADDI, M32RXF_INSN_ADDV
|
||||||
|
, M32RXF_INSN_ADDV3, M32RXF_INSN_ADDX, M32RXF_INSN_BC8, M32RXF_INSN_BC24
|
||||||
|
, M32RXF_INSN_BEQ, M32RXF_INSN_BEQZ, M32RXF_INSN_BGEZ, M32RXF_INSN_BGTZ
|
||||||
|
, M32RXF_INSN_BLEZ, M32RXF_INSN_BLTZ, M32RXF_INSN_BNEZ, M32RXF_INSN_BL8
|
||||||
|
, M32RXF_INSN_BL24, M32RXF_INSN_BCL8, M32RXF_INSN_BCL24, M32RXF_INSN_BNC8
|
||||||
|
, M32RXF_INSN_BNC24, M32RXF_INSN_BNE, M32RXF_INSN_BRA8, M32RXF_INSN_BRA24
|
||||||
|
, M32RXF_INSN_BNCL8, M32RXF_INSN_BNCL24, M32RXF_INSN_CMP, M32RXF_INSN_CMPI
|
||||||
|
, M32RXF_INSN_CMPU, M32RXF_INSN_CMPUI, M32RXF_INSN_CMPEQ, M32RXF_INSN_CMPZ
|
||||||
|
, M32RXF_INSN_DIV, M32RXF_INSN_DIVU, M32RXF_INSN_REM, M32RXF_INSN_REMU
|
||||||
|
, M32RXF_INSN_DIVH, M32RXF_INSN_JC, M32RXF_INSN_JNC, M32RXF_INSN_JL
|
||||||
|
, M32RXF_INSN_JMP, M32RXF_INSN_LD, M32RXF_INSN_LD_D, M32RXF_INSN_LDB
|
||||||
|
, M32RXF_INSN_LDB_D, M32RXF_INSN_LDH, M32RXF_INSN_LDH_D, M32RXF_INSN_LDUB
|
||||||
|
, M32RXF_INSN_LDUB_D, M32RXF_INSN_LDUH, M32RXF_INSN_LDUH_D, M32RXF_INSN_LD_PLUS
|
||||||
|
, M32RXF_INSN_LD24, M32RXF_INSN_LDI8, M32RXF_INSN_LDI16, M32RXF_INSN_LOCK
|
||||||
|
, M32RXF_INSN_MACHI_A, M32RXF_INSN_MACLO_A, M32RXF_INSN_MACWHI_A, M32RXF_INSN_MACWLO_A
|
||||||
|
, M32RXF_INSN_MUL, M32RXF_INSN_MULHI_A, M32RXF_INSN_MULLO_A, M32RXF_INSN_MULWHI_A
|
||||||
|
, M32RXF_INSN_MULWLO_A, M32RXF_INSN_MV, M32RXF_INSN_MVFACHI_A, M32RXF_INSN_MVFACLO_A
|
||||||
|
, M32RXF_INSN_MVFACMI_A, M32RXF_INSN_MVFC, M32RXF_INSN_MVTACHI_A, M32RXF_INSN_MVTACLO_A
|
||||||
|
, M32RXF_INSN_MVTC, M32RXF_INSN_NEG, M32RXF_INSN_NOP, M32RXF_INSN_NOT
|
||||||
|
, M32RXF_INSN_RAC_DSI, M32RXF_INSN_RACH_DSI, M32RXF_INSN_RTE, M32RXF_INSN_SETH
|
||||||
|
, M32RXF_INSN_SLL, M32RXF_INSN_SLL3, M32RXF_INSN_SLLI, M32RXF_INSN_SRA
|
||||||
|
, M32RXF_INSN_SRA3, M32RXF_INSN_SRAI, M32RXF_INSN_SRL, M32RXF_INSN_SRL3
|
||||||
|
, M32RXF_INSN_SRLI, M32RXF_INSN_ST, M32RXF_INSN_ST_D, M32RXF_INSN_STB
|
||||||
|
, M32RXF_INSN_STB_D, M32RXF_INSN_STH, M32RXF_INSN_STH_D, M32RXF_INSN_ST_PLUS
|
||||||
|
, M32RXF_INSN_ST_MINUS, M32RXF_INSN_SUB, M32RXF_INSN_SUBV, M32RXF_INSN_SUBX
|
||||||
|
, M32RXF_INSN_TRAP, M32RXF_INSN_UNLOCK, M32RXF_INSN_SATB, M32RXF_INSN_SATH
|
||||||
|
, M32RXF_INSN_SAT, M32RXF_INSN_PCMPBZ, M32RXF_INSN_SADD, M32RXF_INSN_MACWU1
|
||||||
|
, M32RXF_INSN_MSBLO, M32RXF_INSN_MULWU1, M32RXF_INSN_MACLH1, M32RXF_INSN_SC
|
||||||
|
, M32RXF_INSN_SNC, M32RXF_INSN_PAR_ADD, M32RXF_INSN_WRITE_ADD, M32RXF_INSN_PAR_AND
|
||||||
|
, M32RXF_INSN_WRITE_AND, M32RXF_INSN_PAR_OR, M32RXF_INSN_WRITE_OR, M32RXF_INSN_PAR_XOR
|
||||||
|
, M32RXF_INSN_WRITE_XOR, M32RXF_INSN_PAR_ADDI, M32RXF_INSN_WRITE_ADDI, M32RXF_INSN_PAR_ADDV
|
||||||
|
, M32RXF_INSN_WRITE_ADDV, M32RXF_INSN_PAR_ADDX, M32RXF_INSN_WRITE_ADDX, M32RXF_INSN_PAR_BC8
|
||||||
|
, M32RXF_INSN_WRITE_BC8, M32RXF_INSN_PAR_BL8, M32RXF_INSN_WRITE_BL8, M32RXF_INSN_PAR_BCL8
|
||||||
|
, M32RXF_INSN_WRITE_BCL8, M32RXF_INSN_PAR_BNC8, M32RXF_INSN_WRITE_BNC8, M32RXF_INSN_PAR_BRA8
|
||||||
|
, M32RXF_INSN_WRITE_BRA8, M32RXF_INSN_PAR_BNCL8, M32RXF_INSN_WRITE_BNCL8, M32RXF_INSN_PAR_CMP
|
||||||
|
, M32RXF_INSN_WRITE_CMP, M32RXF_INSN_PAR_CMPU, M32RXF_INSN_WRITE_CMPU, M32RXF_INSN_PAR_CMPEQ
|
||||||
|
, M32RXF_INSN_WRITE_CMPEQ, M32RXF_INSN_PAR_CMPZ, M32RXF_INSN_WRITE_CMPZ, M32RXF_INSN_PAR_JC
|
||||||
|
, M32RXF_INSN_WRITE_JC, M32RXF_INSN_PAR_JNC, M32RXF_INSN_WRITE_JNC, M32RXF_INSN_PAR_JL
|
||||||
|
, M32RXF_INSN_WRITE_JL, M32RXF_INSN_PAR_JMP, M32RXF_INSN_WRITE_JMP, M32RXF_INSN_PAR_LD
|
||||||
|
, M32RXF_INSN_WRITE_LD, M32RXF_INSN_PAR_LDB, M32RXF_INSN_WRITE_LDB, M32RXF_INSN_PAR_LDH
|
||||||
|
, M32RXF_INSN_WRITE_LDH, M32RXF_INSN_PAR_LDUB, M32RXF_INSN_WRITE_LDUB, M32RXF_INSN_PAR_LDUH
|
||||||
|
, M32RXF_INSN_WRITE_LDUH, M32RXF_INSN_PAR_LD_PLUS, M32RXF_INSN_WRITE_LD_PLUS, M32RXF_INSN_PAR_LDI8
|
||||||
|
, M32RXF_INSN_WRITE_LDI8, M32RXF_INSN_PAR_LOCK, M32RXF_INSN_WRITE_LOCK, M32RXF_INSN_PAR_MACHI_A
|
||||||
|
, M32RXF_INSN_WRITE_MACHI_A, M32RXF_INSN_PAR_MACLO_A, M32RXF_INSN_WRITE_MACLO_A, M32RXF_INSN_PAR_MACWHI_A
|
||||||
|
, M32RXF_INSN_WRITE_MACWHI_A, M32RXF_INSN_PAR_MACWLO_A, M32RXF_INSN_WRITE_MACWLO_A, M32RXF_INSN_PAR_MUL
|
||||||
|
, M32RXF_INSN_WRITE_MUL, M32RXF_INSN_PAR_MULHI_A, M32RXF_INSN_WRITE_MULHI_A, M32RXF_INSN_PAR_MULLO_A
|
||||||
|
, M32RXF_INSN_WRITE_MULLO_A, M32RXF_INSN_PAR_MULWHI_A, M32RXF_INSN_WRITE_MULWHI_A, M32RXF_INSN_PAR_MULWLO_A
|
||||||
|
, M32RXF_INSN_WRITE_MULWLO_A, M32RXF_INSN_PAR_MV, M32RXF_INSN_WRITE_MV, M32RXF_INSN_PAR_MVFACHI_A
|
||||||
|
, M32RXF_INSN_WRITE_MVFACHI_A, M32RXF_INSN_PAR_MVFACLO_A, M32RXF_INSN_WRITE_MVFACLO_A, M32RXF_INSN_PAR_MVFACMI_A
|
||||||
|
, M32RXF_INSN_WRITE_MVFACMI_A, M32RXF_INSN_PAR_MVFC, M32RXF_INSN_WRITE_MVFC, M32RXF_INSN_PAR_MVTACHI_A
|
||||||
|
, M32RXF_INSN_WRITE_MVTACHI_A, M32RXF_INSN_PAR_MVTACLO_A, M32RXF_INSN_WRITE_MVTACLO_A, M32RXF_INSN_PAR_MVTC
|
||||||
|
, M32RXF_INSN_WRITE_MVTC, M32RXF_INSN_PAR_NEG, M32RXF_INSN_WRITE_NEG, M32RXF_INSN_PAR_NOP
|
||||||
|
, M32RXF_INSN_WRITE_NOP, M32RXF_INSN_PAR_NOT, M32RXF_INSN_WRITE_NOT, M32RXF_INSN_PAR_RAC_DSI
|
||||||
|
, M32RXF_INSN_WRITE_RAC_DSI, M32RXF_INSN_PAR_RACH_DSI, M32RXF_INSN_WRITE_RACH_DSI, M32RXF_INSN_PAR_RTE
|
||||||
|
, M32RXF_INSN_WRITE_RTE, M32RXF_INSN_PAR_SLL, M32RXF_INSN_WRITE_SLL, M32RXF_INSN_PAR_SLLI
|
||||||
|
, M32RXF_INSN_WRITE_SLLI, M32RXF_INSN_PAR_SRA, M32RXF_INSN_WRITE_SRA, M32RXF_INSN_PAR_SRAI
|
||||||
|
, M32RXF_INSN_WRITE_SRAI, M32RXF_INSN_PAR_SRL, M32RXF_INSN_WRITE_SRL, M32RXF_INSN_PAR_SRLI
|
||||||
|
, M32RXF_INSN_WRITE_SRLI, M32RXF_INSN_PAR_ST, M32RXF_INSN_WRITE_ST, M32RXF_INSN_PAR_STB
|
||||||
|
, M32RXF_INSN_WRITE_STB, M32RXF_INSN_PAR_STH, M32RXF_INSN_WRITE_STH, M32RXF_INSN_PAR_ST_PLUS
|
||||||
|
, M32RXF_INSN_WRITE_ST_PLUS, M32RXF_INSN_PAR_ST_MINUS, M32RXF_INSN_WRITE_ST_MINUS, M32RXF_INSN_PAR_SUB
|
||||||
|
, M32RXF_INSN_WRITE_SUB, M32RXF_INSN_PAR_SUBV, M32RXF_INSN_WRITE_SUBV, M32RXF_INSN_PAR_SUBX
|
||||||
|
, M32RXF_INSN_WRITE_SUBX, M32RXF_INSN_PAR_TRAP, M32RXF_INSN_WRITE_TRAP, M32RXF_INSN_PAR_UNLOCK
|
||||||
|
, M32RXF_INSN_WRITE_UNLOCK, M32RXF_INSN_PAR_PCMPBZ, M32RXF_INSN_WRITE_PCMPBZ, M32RXF_INSN_PAR_SADD
|
||||||
|
, M32RXF_INSN_WRITE_SADD, M32RXF_INSN_PAR_MACWU1, M32RXF_INSN_WRITE_MACWU1, M32RXF_INSN_PAR_MSBLO
|
||||||
|
, M32RXF_INSN_WRITE_MSBLO, M32RXF_INSN_PAR_MULWU1, M32RXF_INSN_WRITE_MULWU1, M32RXF_INSN_PAR_MACLH1
|
||||||
|
, M32RXF_INSN_WRITE_MACLH1, M32RXF_INSN_PAR_SC, M32RXF_INSN_WRITE_SC, M32RXF_INSN_PAR_SNC
|
||||||
|
, M32RXF_INSN_WRITE_SNC, M32RXF_INSN_MAX
|
||||||
|
} M32RXF_INSN_TYPE;
|
||||||
|
|
||||||
|
/* Enum declaration for semantic formats in cpu family m32rxf. */
|
||||||
|
typedef enum m32rxf_sfmt_type {
|
||||||
|
M32RXF_SFMT_EMPTY, M32RXF_SFMT_ADD, M32RXF_SFMT_ADD3, M32RXF_SFMT_AND3
|
||||||
|
, M32RXF_SFMT_OR3, M32RXF_SFMT_ADDI, M32RXF_SFMT_ADDV, M32RXF_SFMT_ADDV3
|
||||||
|
, M32RXF_SFMT_ADDX, M32RXF_SFMT_BC8, M32RXF_SFMT_BC24, M32RXF_SFMT_BEQ
|
||||||
|
, M32RXF_SFMT_BEQZ, M32RXF_SFMT_BL8, M32RXF_SFMT_BL24, M32RXF_SFMT_BCL8
|
||||||
|
, M32RXF_SFMT_BCL24, M32RXF_SFMT_BRA8, M32RXF_SFMT_BRA24, M32RXF_SFMT_CMP
|
||||||
|
, M32RXF_SFMT_CMPI, M32RXF_SFMT_CMPZ, M32RXF_SFMT_DIV, M32RXF_SFMT_JC
|
||||||
|
, M32RXF_SFMT_JL, M32RXF_SFMT_JMP, M32RXF_SFMT_LD, M32RXF_SFMT_LD_D
|
||||||
|
, M32RXF_SFMT_LD_PLUS, M32RXF_SFMT_LD24, M32RXF_SFMT_LDI8, M32RXF_SFMT_LDI16
|
||||||
|
, M32RXF_SFMT_LOCK, M32RXF_SFMT_MACHI_A, M32RXF_SFMT_MULHI_A, M32RXF_SFMT_MV
|
||||||
|
, M32RXF_SFMT_MVFACHI_A, M32RXF_SFMT_MVFC, M32RXF_SFMT_MVTACHI_A, M32RXF_SFMT_MVTC
|
||||||
|
, M32RXF_SFMT_NOP, M32RXF_SFMT_RAC_DSI, M32RXF_SFMT_RTE, M32RXF_SFMT_SETH
|
||||||
|
, M32RXF_SFMT_SLL3, M32RXF_SFMT_SLLI, M32RXF_SFMT_ST, M32RXF_SFMT_ST_D
|
||||||
|
, M32RXF_SFMT_STB, M32RXF_SFMT_STB_D, M32RXF_SFMT_STH, M32RXF_SFMT_STH_D
|
||||||
|
, M32RXF_SFMT_ST_PLUS, M32RXF_SFMT_TRAP, M32RXF_SFMT_UNLOCK, M32RXF_SFMT_SATB
|
||||||
|
, M32RXF_SFMT_SAT, M32RXF_SFMT_SADD, M32RXF_SFMT_MACWU1, M32RXF_SFMT_MSBLO
|
||||||
|
, M32RXF_SFMT_MULWU1, M32RXF_SFMT_SC
|
||||||
|
} M32RXF_SFMT_TYPE;
|
||||||
|
|
||||||
|
/* Function unit handlers (user written). */
|
||||||
|
|
||||||
|
extern int m32rxf_model_m32rx_u_store (SIM_CPU *, const IDESC *, int /*unit_num*/, int /*referenced*/, INT /*src1*/, INT /*src2*/);
|
||||||
|
extern int m32rxf_model_m32rx_u_load (SIM_CPU *, const IDESC *, int /*unit_num*/, int /*referenced*/, INT /*sr*/, INT /*dr*/);
|
||||||
|
extern int m32rxf_model_m32rx_u_cti (SIM_CPU *, const IDESC *, int /*unit_num*/, int /*referenced*/, INT /*sr*/);
|
||||||
|
extern int m32rxf_model_m32rx_u_mac (SIM_CPU *, const IDESC *, int /*unit_num*/, int /*referenced*/, INT /*src1*/, INT /*src2*/);
|
||||||
|
extern int m32rxf_model_m32rx_u_cmp (SIM_CPU *, const IDESC *, int /*unit_num*/, int /*referenced*/, INT /*src1*/, INT /*src2*/);
|
||||||
|
extern int m32rxf_model_m32rx_u_exec (SIM_CPU *, const IDESC *, int /*unit_num*/, int /*referenced*/, INT /*sr*/, INT /*dr*/, INT /*dr*/);
|
||||||
|
|
||||||
|
/* Profiling before/after handlers (user written) */
|
||||||
|
|
||||||
|
extern void m32rxf_model_insn_before (SIM_CPU *, int /*first_p*/);
|
||||||
|
extern void m32rxf_model_insn_after (SIM_CPU *, int /*last_p*/, int /*cycles*/);
|
||||||
|
|
||||||
|
#endif /* M32RXF_DECODE_H */
|
|
@ -55,6 +55,15 @@ extern void m32rbf_h_psw_set_handler (SIM_CPU *, UQI);
|
||||||
extern DI m32rbf_h_accum_get_handler (SIM_CPU *);
|
extern DI m32rbf_h_accum_get_handler (SIM_CPU *);
|
||||||
extern void m32rbf_h_accum_set_handler (SIM_CPU *, DI);
|
extern void m32rbf_h_accum_set_handler (SIM_CPU *, DI);
|
||||||
|
|
||||||
|
extern USI m32rxf_h_cr_get_handler (SIM_CPU *, UINT);
|
||||||
|
extern void m32rxf_h_cr_set_handler (SIM_CPU *, UINT, USI);
|
||||||
|
extern UQI m32rxf_h_psw_get_handler (SIM_CPU *);
|
||||||
|
extern void m32rxf_h_psw_set_handler (SIM_CPU *, UQI);
|
||||||
|
extern DI m32rxf_h_accum_get_handler (SIM_CPU *);
|
||||||
|
extern void m32rxf_h_accum_set_handler (SIM_CPU *, DI);
|
||||||
|
|
||||||
|
extern DI m32rxf_h_accums_get_handler (SIM_CPU *, UINT);
|
||||||
|
extern void m32rxf_h_accums_set_handler (SIM_CPU *, UINT, DI);
|
||||||
|
|
||||||
/* Misc. profile data. */
|
/* Misc. profile data. */
|
||||||
|
|
||||||
|
@ -121,6 +130,32 @@ do { \
|
||||||
|
|
||||||
/* Additional execution support. */
|
/* Additional execution support. */
|
||||||
|
|
||||||
|
/* Result of semantic function is one of
|
||||||
|
- next address, branch only
|
||||||
|
- NEW_PC_SKIP, sc/snc insn
|
||||||
|
- NEW_PC_2, 2 byte non-branch non-sc/snc insn
|
||||||
|
- NEW_PC_4, 4 byte non-branch insn
|
||||||
|
The special values have bit 1 set so it's cheap to distinguish them.
|
||||||
|
This works because all cti's are defined to zero the bottom two bits
|
||||||
|
Note that the m32rx no longer doesn't implement its semantics with
|
||||||
|
functions, so this isn't used. It's kept around should it be needed
|
||||||
|
again. */
|
||||||
|
/* FIXME: replace 0xffff0001 with 1? */
|
||||||
|
#define NEW_PC_BASE 0xffff0001
|
||||||
|
#define NEW_PC_SKIP NEW_PC_BASE
|
||||||
|
#define NEW_PC_2 (NEW_PC_BASE + 2)
|
||||||
|
#define NEW_PC_4 (NEW_PC_BASE + 4)
|
||||||
|
#define NEW_PC_BRANCH_P(addr) (((addr) & 1) == 0)
|
||||||
|
|
||||||
|
/* Modify "next pc" support to handle parallel execution.
|
||||||
|
This is for the non-pbb case. The m32rx no longer implements this.
|
||||||
|
It's kept around should it be needed again. */
|
||||||
|
#if defined (WANT_CPU_M32RXF) && ! WITH_SCACHE_PBB_M32RXF
|
||||||
|
#undef SEM_NEXT_VPC
|
||||||
|
#define SEM_NEXT_VPC(abuf, len) (NEW_PC_BASE + (len))
|
||||||
|
#undef SEM_SKIP_INSN
|
||||||
|
#define SEM_SKIP_INSN(cpu, sc, vpcvar, yes) FIXME
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Hardware/device support.
|
/* Hardware/device support.
|
||||||
??? Will eventually want to move device stuff to config files. */
|
??? Will eventually want to move device stuff to config files. */
|
||||||
|
|
311
sim/m32r/m32rx.c
Normal file
311
sim/m32r/m32rx.c
Normal file
|
@ -0,0 +1,311 @@
|
||||||
|
/* m32rx simulator support code
|
||||||
|
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Contributed by Cygnus Support.
|
||||||
|
|
||||||
|
This file is part of GDB, the GNU debugger.
|
||||||
|
|
||||||
|
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, 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. */
|
||||||
|
|
||||||
|
#define WANT_CPU m32rxf
|
||||||
|
#define WANT_CPU_M32RXF
|
||||||
|
|
||||||
|
#include "sim-main.h"
|
||||||
|
#include "cgen-mem.h"
|
||||||
|
#include "cgen-ops.h"
|
||||||
|
|
||||||
|
/* The contents of BUF are in target byte order. */
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_fetch_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
|
||||||
|
{
|
||||||
|
return m32rbf_fetch_register (current_cpu, rn, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The contents of BUF are in target byte order. */
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_store_register (SIM_CPU *current_cpu, int rn, unsigned char *buf, int len)
|
||||||
|
{
|
||||||
|
return m32rbf_store_register (current_cpu, rn, buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cover fns to get/set the control registers.
|
||||||
|
FIXME: Duplicated from m32r.c. The issue is structure offsets. */
|
||||||
|
|
||||||
|
USI
|
||||||
|
m32rxf_h_cr_get_handler (SIM_CPU *current_cpu, UINT cr)
|
||||||
|
{
|
||||||
|
switch (cr)
|
||||||
|
{
|
||||||
|
case H_CR_PSW : /* psw */
|
||||||
|
return (((CPU (h_bpsw) & 0xc1) << 8)
|
||||||
|
| ((CPU (h_psw) & 0xc0) << 0)
|
||||||
|
| GET_H_COND ());
|
||||||
|
case H_CR_BBPSW : /* backup backup psw */
|
||||||
|
return CPU (h_bbpsw) & 0xc1;
|
||||||
|
case H_CR_CBR : /* condition bit */
|
||||||
|
return GET_H_COND ();
|
||||||
|
case H_CR_SPI : /* interrupt stack pointer */
|
||||||
|
if (! GET_H_SM ())
|
||||||
|
return CPU (h_gr[H_GR_SP]);
|
||||||
|
else
|
||||||
|
return CPU (h_cr[H_CR_SPI]);
|
||||||
|
case H_CR_SPU : /* user stack pointer */
|
||||||
|
if (GET_H_SM ())
|
||||||
|
return CPU (h_gr[H_GR_SP]);
|
||||||
|
else
|
||||||
|
return CPU (h_cr[H_CR_SPU]);
|
||||||
|
case H_CR_BPC : /* backup pc */
|
||||||
|
return CPU (h_cr[H_CR_BPC]) & 0xfffffffe;
|
||||||
|
case H_CR_BBPC : /* backup backup pc */
|
||||||
|
return CPU (h_cr[H_CR_BBPC]) & 0xfffffffe;
|
||||||
|
case 4 : /* ??? unspecified, but apparently available */
|
||||||
|
case 5 : /* ??? unspecified, but apparently available */
|
||||||
|
return CPU (h_cr[cr]);
|
||||||
|
default :
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_cr_set_handler (SIM_CPU *current_cpu, UINT cr, USI newval)
|
||||||
|
{
|
||||||
|
switch (cr)
|
||||||
|
{
|
||||||
|
case H_CR_PSW : /* psw */
|
||||||
|
{
|
||||||
|
int old_sm = (CPU (h_psw) & 0x80) != 0;
|
||||||
|
int new_sm = (newval & 0x80) != 0;
|
||||||
|
CPU (h_bpsw) = (newval >> 8) & 0xff;
|
||||||
|
CPU (h_psw) = newval & 0xff;
|
||||||
|
SET_H_COND (newval & 1);
|
||||||
|
/* When switching stack modes, update the registers. */
|
||||||
|
if (old_sm != new_sm)
|
||||||
|
{
|
||||||
|
if (old_sm)
|
||||||
|
{
|
||||||
|
/* Switching user -> system. */
|
||||||
|
CPU (h_cr[H_CR_SPU]) = CPU (h_gr[H_GR_SP]);
|
||||||
|
CPU (h_gr[H_GR_SP]) = CPU (h_cr[H_CR_SPI]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Switching system -> user. */
|
||||||
|
CPU (h_cr[H_CR_SPI]) = CPU (h_gr[H_GR_SP]);
|
||||||
|
CPU (h_gr[H_GR_SP]) = CPU (h_cr[H_CR_SPU]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case H_CR_BBPSW : /* backup backup psw */
|
||||||
|
CPU (h_bbpsw) = newval & 0xff;
|
||||||
|
break;
|
||||||
|
case H_CR_CBR : /* condition bit */
|
||||||
|
SET_H_COND (newval & 1);
|
||||||
|
break;
|
||||||
|
case H_CR_SPI : /* interrupt stack pointer */
|
||||||
|
if (! GET_H_SM ())
|
||||||
|
CPU (h_gr[H_GR_SP]) = newval;
|
||||||
|
else
|
||||||
|
CPU (h_cr[H_CR_SPI]) = newval;
|
||||||
|
break;
|
||||||
|
case H_CR_SPU : /* user stack pointer */
|
||||||
|
if (GET_H_SM ())
|
||||||
|
CPU (h_gr[H_GR_SP]) = newval;
|
||||||
|
else
|
||||||
|
CPU (h_cr[H_CR_SPU]) = newval;
|
||||||
|
break;
|
||||||
|
case H_CR_BPC : /* backup pc */
|
||||||
|
CPU (h_cr[H_CR_BPC]) = newval;
|
||||||
|
break;
|
||||||
|
case H_CR_BBPC : /* backup backup pc */
|
||||||
|
CPU (h_cr[H_CR_BBPC]) = newval;
|
||||||
|
break;
|
||||||
|
case 4 : /* ??? unspecified, but apparently available */
|
||||||
|
case 5 : /* ??? unspecified, but apparently available */
|
||||||
|
CPU (h_cr[cr]) = newval;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
/* ignore */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cover fns to access h-psw. */
|
||||||
|
|
||||||
|
UQI
|
||||||
|
m32rxf_h_psw_get_handler (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
return (CPU (h_psw) & 0xfe) | (CPU (h_cond) & 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_psw_set_handler (SIM_CPU *current_cpu, UQI newval)
|
||||||
|
{
|
||||||
|
CPU (h_psw) = newval;
|
||||||
|
CPU (h_cond) = newval & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cover fns to access h-accum. */
|
||||||
|
|
||||||
|
DI
|
||||||
|
m32rxf_h_accum_get_handler (SIM_CPU *current_cpu)
|
||||||
|
{
|
||||||
|
/* Sign extend the top 8 bits. */
|
||||||
|
DI r;
|
||||||
|
r = ANDDI (CPU (h_accum), MAKEDI (0xffffff, 0xffffffff));
|
||||||
|
r = XORDI (r, MAKEDI (0x800000, 0));
|
||||||
|
r = SUBDI (r, MAKEDI (0x800000, 0));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_accum_set_handler (SIM_CPU *current_cpu, DI newval)
|
||||||
|
{
|
||||||
|
CPU (h_accum) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cover fns to access h-accums. */
|
||||||
|
|
||||||
|
DI
|
||||||
|
m32rxf_h_accums_get_handler (SIM_CPU *current_cpu, UINT regno)
|
||||||
|
{
|
||||||
|
/* FIXME: Yes, this is just a quick hack. */
|
||||||
|
DI r;
|
||||||
|
if (regno == 0)
|
||||||
|
r = CPU (h_accum);
|
||||||
|
else
|
||||||
|
r = CPU (h_accums[1]);
|
||||||
|
/* Sign extend the top 8 bits. */
|
||||||
|
r = ANDDI (r, MAKEDI (0xffffff, 0xffffffff));
|
||||||
|
r = XORDI (r, MAKEDI (0x800000, 0));
|
||||||
|
r = SUBDI (r, MAKEDI (0x800000, 0));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_h_accums_set_handler (SIM_CPU *current_cpu, UINT regno, DI newval)
|
||||||
|
{
|
||||||
|
/* FIXME: Yes, this is just a quick hack. */
|
||||||
|
if (regno == 0)
|
||||||
|
CPU (h_accum) = newval;
|
||||||
|
else
|
||||||
|
CPU (h_accums[1]) = newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if WITH_PROFILE_MODEL_P
|
||||||
|
|
||||||
|
/* Initialize cycle counting for an insn.
|
||||||
|
FIRST_P is non-zero if this is the first insn in a set of parallel
|
||||||
|
insns. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_model_insn_before (SIM_CPU *cpu, int first_p)
|
||||||
|
{
|
||||||
|
m32rbf_model_insn_before (cpu, first_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Record the cycles computed for an insn.
|
||||||
|
LAST_P is non-zero if this is the last insn in a set of parallel insns,
|
||||||
|
and we update the total cycle count.
|
||||||
|
CYCLES is the cycle count of the insn. */
|
||||||
|
|
||||||
|
void
|
||||||
|
m32rxf_model_insn_after (SIM_CPU *cpu, int last_p, int cycles)
|
||||||
|
{
|
||||||
|
m32rbf_model_insn_after (cpu, last_p, cycles);
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE void
|
||||||
|
check_load_stall (SIM_CPU *cpu, int regno)
|
||||||
|
{
|
||||||
|
UINT h_gr = CPU_M32R_MISC_PROFILE (cpu)->load_regs;
|
||||||
|
|
||||||
|
if (regno != -1
|
||||||
|
&& (h_gr & (1 << regno)) != 0)
|
||||||
|
{
|
||||||
|
CPU_M32R_MISC_PROFILE (cpu)->load_stall += 2;
|
||||||
|
if (TRACE_INSN_P (cpu))
|
||||||
|
cgen_trace_printf (cpu, " ; Load stall of 2 cycles.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_model_m32rx_u_exec (SIM_CPU *cpu, const IDESC *idesc,
|
||||||
|
int unit_num, int referenced,
|
||||||
|
INT sr, INT sr2, INT dr)
|
||||||
|
{
|
||||||
|
check_load_stall (cpu, sr);
|
||||||
|
check_load_stall (cpu, sr2);
|
||||||
|
return idesc->timing->units[unit_num].done;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_model_m32rx_u_cmp (SIM_CPU *cpu, const IDESC *idesc,
|
||||||
|
int unit_num, int referenced,
|
||||||
|
INT src1, INT src2)
|
||||||
|
{
|
||||||
|
check_load_stall (cpu, src1);
|
||||||
|
check_load_stall (cpu, src2);
|
||||||
|
return idesc->timing->units[unit_num].done;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_model_m32rx_u_mac (SIM_CPU *cpu, const IDESC *idesc,
|
||||||
|
int unit_num, int referenced,
|
||||||
|
INT src1, INT src2)
|
||||||
|
{
|
||||||
|
check_load_stall (cpu, src1);
|
||||||
|
check_load_stall (cpu, src2);
|
||||||
|
return idesc->timing->units[unit_num].done;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_model_m32rx_u_cti (SIM_CPU *cpu, const IDESC *idesc,
|
||||||
|
int unit_num, int referenced,
|
||||||
|
INT sr)
|
||||||
|
{
|
||||||
|
PROFILE_DATA *profile = CPU_PROFILE_DATA (cpu);
|
||||||
|
int taken_p = (referenced & (1 << 1)) != 0;
|
||||||
|
|
||||||
|
check_load_stall (cpu, sr);
|
||||||
|
if (taken_p)
|
||||||
|
{
|
||||||
|
CPU_M32R_MISC_PROFILE (cpu)->cti_stall += 2;
|
||||||
|
PROFILE_MODEL_TAKEN_COUNT (profile) += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
PROFILE_MODEL_UNTAKEN_COUNT (profile) += 1;
|
||||||
|
return idesc->timing->units[unit_num].done;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_model_m32rx_u_load (SIM_CPU *cpu, const IDESC *idesc,
|
||||||
|
int unit_num, int referenced,
|
||||||
|
INT sr, INT dr)
|
||||||
|
{
|
||||||
|
CPU_M32R_MISC_PROFILE (cpu)->load_regs_pending |= (1 << dr);
|
||||||
|
return idesc->timing->units[unit_num].done;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
m32rxf_model_m32rx_u_store (SIM_CPU *cpu, const IDESC *idesc,
|
||||||
|
int unit_num, int referenced,
|
||||||
|
INT src1, INT src2)
|
||||||
|
{
|
||||||
|
return idesc->timing->units[unit_num].done;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* WITH_PROFILE_MODEL_P */
|
484
sim/m32r/mloopx.in
Normal file
484
sim/m32r/mloopx.in
Normal file
|
@ -0,0 +1,484 @@
|
||||||
|
# Simulator main loop for m32rx. -*- C -*-
|
||||||
|
# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file is part of the GNU Simulators.
|
||||||
|
#
|
||||||
|
# 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, 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.
|
||||||
|
|
||||||
|
# Syntax:
|
||||||
|
# /bin/sh mainloop.in command
|
||||||
|
#
|
||||||
|
# Command is one of:
|
||||||
|
#
|
||||||
|
# init
|
||||||
|
# support
|
||||||
|
# extract-{simple,scache,pbb}
|
||||||
|
# {full,fast}-exec-{simple,scache,pbb}
|
||||||
|
#
|
||||||
|
# A target need only provide a "full" version of one of simple,scache,pbb.
|
||||||
|
# If the target wants it can also provide a fast version of same, or if
|
||||||
|
# the slow (full featured) version is `simple', then the fast version can be
|
||||||
|
# one of scache/pbb.
|
||||||
|
# A target can't provide more than this.
|
||||||
|
|
||||||
|
# ??? After a few more ports are done, revisit.
|
||||||
|
# Will eventually need to machine generate a lot of this.
|
||||||
|
|
||||||
|
case "x$1" in
|
||||||
|
|
||||||
|
xsupport)
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
|
||||||
|
/* Emit insns to write back the results of insns executed in parallel.
|
||||||
|
SC points to a sufficient number of scache entries for the writeback
|
||||||
|
handlers.
|
||||||
|
SC1/ID1 is the first insn (left slot, lower address).
|
||||||
|
SC2/ID2 is the second insn (right slot, higher address). */
|
||||||
|
|
||||||
|
static INLINE void
|
||||||
|
emit_par_finish (SIM_CPU *current_cpu, PCADDR pc, SCACHE *sc,
|
||||||
|
SCACHE *sc1, const IDESC *id1, SCACHE *sc2, const IDESC *id2)
|
||||||
|
{
|
||||||
|
ARGBUF *abuf;
|
||||||
|
|
||||||
|
abuf = &sc->argbuf;
|
||||||
|
id1 = id1->par_idesc;
|
||||||
|
abuf->fields.write.abuf = &sc1->argbuf;
|
||||||
|
@cpu@_fill_argbuf (current_cpu, abuf, id1, pc, 0);
|
||||||
|
/* no need to set trace_p,profile_p */
|
||||||
|
#if 0 /* not currently needed for id2 since results written directly */
|
||||||
|
abuf = &sc[1].argbuf;
|
||||||
|
id2 = id2->par_idesc;
|
||||||
|
abuf->fields.write.abuf = &sc2->argbuf;
|
||||||
|
@cpu@_fill_argbuf (current_cpu, abuf, id2, pc + 2, 0);
|
||||||
|
/* no need to set trace_p,profile_p */
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE const IDESC *
|
||||||
|
emit_16 (SIM_CPU *current_cpu, PCADDR pc, CGEN_INSN_INT insn,
|
||||||
|
SCACHE *sc, int fast_p, int parallel_p)
|
||||||
|
{
|
||||||
|
ARGBUF *abuf = &sc->argbuf;
|
||||||
|
const IDESC *id = @cpu@_decode (current_cpu, pc, insn, insn, abuf);
|
||||||
|
|
||||||
|
if (parallel_p)
|
||||||
|
id = id->par_idesc;
|
||||||
|
@cpu@_fill_argbuf (current_cpu, abuf, id, pc, fast_p);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE const IDESC *
|
||||||
|
emit_full16 (SIM_CPU *current_cpu, PCADDR pc, CGEN_INSN_INT insn, SCACHE *sc,
|
||||||
|
int trace_p, int profile_p)
|
||||||
|
{
|
||||||
|
const IDESC *id;
|
||||||
|
|
||||||
|
@cpu@_emit_before (current_cpu, sc, pc, 1);
|
||||||
|
id = emit_16 (current_cpu, pc, insn, sc + 1, 0, 0);
|
||||||
|
@cpu@_emit_after (current_cpu, sc + 2, pc);
|
||||||
|
sc[1].argbuf.trace_p = trace_p;
|
||||||
|
sc[1].argbuf.profile_p = profile_p;
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE const IDESC *
|
||||||
|
emit_parallel (SIM_CPU *current_cpu, PCADDR pc, CGEN_INSN_INT insn,
|
||||||
|
SCACHE *sc, int fast_p)
|
||||||
|
{
|
||||||
|
const IDESC *id,*id2;
|
||||||
|
|
||||||
|
/* Emit both insns, then emit a finisher-upper.
|
||||||
|
We speed things up by handling the second insn serially
|
||||||
|
[not parallelly]. Then the writeback only has to deal
|
||||||
|
with the first insn. */
|
||||||
|
/* ??? Revisit to handle exceptions right. */
|
||||||
|
|
||||||
|
/* FIXME: No need to handle this parallely if second is nop. */
|
||||||
|
id = emit_16 (current_cpu, pc, insn >> 16, sc, fast_p, 1);
|
||||||
|
|
||||||
|
/* Note that this can never be a cti. No cti's go in the S pipeline. */
|
||||||
|
id2 = emit_16 (current_cpu, pc + 2, insn & 0x7fff, sc + 1, fast_p, 0);
|
||||||
|
|
||||||
|
/* Set sc/snc insns notion of where to skip to. */
|
||||||
|
if (IDESC_SKIP_P (id))
|
||||||
|
SEM_SKIP_COMPILE (current_cpu, sc, 1);
|
||||||
|
|
||||||
|
/* Emit code to finish executing the semantics
|
||||||
|
(write back the results). */
|
||||||
|
emit_par_finish (current_cpu, pc, sc + 2, sc, id, sc + 1, id2);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE const IDESC *
|
||||||
|
emit_full_parallel (SIM_CPU *current_cpu, PCADDR pc, CGEN_INSN_INT insn,
|
||||||
|
SCACHE *sc, int trace_p, int profile_p)
|
||||||
|
{
|
||||||
|
const IDESC *id,*id2;
|
||||||
|
|
||||||
|
/* Emit both insns, then emit a finisher-upper.
|
||||||
|
We speed things up by handling the second insn serially
|
||||||
|
[not parallelly]. Then the writeback only has to deal
|
||||||
|
with the first insn. */
|
||||||
|
/* ??? Revisit to handle exceptions right. */
|
||||||
|
|
||||||
|
@cpu@_emit_before (current_cpu, sc, pc, 1);
|
||||||
|
|
||||||
|
/* FIXME: No need to handle this parallelly if second is nop. */
|
||||||
|
id = emit_16 (current_cpu, pc, insn >> 16, sc + 1, 0, 1);
|
||||||
|
sc[1].argbuf.trace_p = trace_p;
|
||||||
|
sc[1].argbuf.profile_p = profile_p;
|
||||||
|
|
||||||
|
@cpu@_emit_before (current_cpu, sc + 2, pc, 0);
|
||||||
|
|
||||||
|
/* Note that this can never be a cti. No cti's go in the S pipeline. */
|
||||||
|
id2 = emit_16 (current_cpu, pc + 2, insn & 0x7fff, sc + 3, 0, 0);
|
||||||
|
sc[3].argbuf.trace_p = trace_p;
|
||||||
|
sc[3].argbuf.profile_p = profile_p;
|
||||||
|
|
||||||
|
/* Set sc/snc insns notion of where to skip to. */
|
||||||
|
if (IDESC_SKIP_P (id))
|
||||||
|
SEM_SKIP_COMPILE (current_cpu, sc, 4);
|
||||||
|
|
||||||
|
/* Emit code to finish executing the semantics
|
||||||
|
(write back the results). */
|
||||||
|
emit_par_finish (current_cpu, pc, sc + 4, sc + 1, id, sc + 3, id2);
|
||||||
|
|
||||||
|
@cpu@_emit_after (current_cpu, sc + 5, pc);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE const IDESC *
|
||||||
|
emit_32 (SIM_CPU *current_cpu, PCADDR pc, CGEN_INSN_INT insn,
|
||||||
|
SCACHE *sc, int fast_p)
|
||||||
|
{
|
||||||
|
ARGBUF *abuf = &sc->argbuf;
|
||||||
|
const IDESC *id = @cpu@_decode (current_cpu, pc,
|
||||||
|
(USI) insn >> 16, insn, abuf);
|
||||||
|
|
||||||
|
@cpu@_fill_argbuf (current_cpu, abuf, id, pc, fast_p);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INLINE const IDESC *
|
||||||
|
emit_full32 (SIM_CPU *current_cpu, PCADDR pc, CGEN_INSN_INT insn, SCACHE *sc,
|
||||||
|
int trace_p, int profile_p)
|
||||||
|
{
|
||||||
|
const IDESC *id;
|
||||||
|
|
||||||
|
@cpu@_emit_before (current_cpu, sc, pc, 1);
|
||||||
|
id = emit_32 (current_cpu, pc, insn, sc + 1, 0);
|
||||||
|
@cpu@_emit_after (current_cpu, sc + 2, pc);
|
||||||
|
sc[1].argbuf.trace_p = trace_p;
|
||||||
|
sc[1].argbuf.profile_p = profile_p;
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
xinit)
|
||||||
|
|
||||||
|
# Nothing needed.
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
xextract-pbb)
|
||||||
|
|
||||||
|
# Inputs: current_cpu, pc, sc, max_insns, FAST_P
|
||||||
|
# Outputs: sc, pc
|
||||||
|
# sc must be left pointing past the last created entry.
|
||||||
|
# pc must be left pointing past the last created entry.
|
||||||
|
# If the pbb is terminated by a cti insn, SET_CTI_VPC(sc) must be called
|
||||||
|
# to record the vpc of the cti insn.
|
||||||
|
# SET_INSN_COUNT(n) must be called to record number of real insns.
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
{
|
||||||
|
const IDESC *idesc;
|
||||||
|
int icount = 0;
|
||||||
|
|
||||||
|
if ((pc & 3) != 0)
|
||||||
|
{
|
||||||
|
/* This occurs when single stepping and when compiling the not-taken
|
||||||
|
part of conditional branches. */
|
||||||
|
UHI insn = GETIMEMUHI (current_cpu, pc);
|
||||||
|
int trace_p = PC_IN_TRACE_RANGE_P (current_cpu, pc);
|
||||||
|
int profile_p = PC_IN_PROFILE_RANGE_P (current_cpu, pc);
|
||||||
|
SCACHE *cti_sc; /* ??? tmp hack */
|
||||||
|
|
||||||
|
/* A parallel insn isn't allowed here, but we don't mind nops.
|
||||||
|
??? We need to wait until the insn is executed before signalling
|
||||||
|
the error, for situations where such signalling is wanted. */
|
||||||
|
#if 0
|
||||||
|
if ((insn & 0x8000) != 0
|
||||||
|
&& (insn & 0x7fff) != 0x7000) /* parallel nops are ok */
|
||||||
|
sim_engine_invalid_insn (current_cpu, pc, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Only emit before/after handlers if necessary. */
|
||||||
|
if (FAST_P || (! trace_p && ! profile_p))
|
||||||
|
{
|
||||||
|
idesc = emit_16 (current_cpu, pc, insn & 0x7fff, sc, FAST_P, 0);
|
||||||
|
cti_sc = sc;
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idesc = emit_full16 (current_cpu, pc, insn & 0x7fff, sc,
|
||||||
|
trace_p, profile_p);
|
||||||
|
cti_sc = sc + 1;
|
||||||
|
sc += 3;
|
||||||
|
max_insns -= 3;
|
||||||
|
}
|
||||||
|
++icount;
|
||||||
|
pc += 2;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (cti_sc);
|
||||||
|
goto Finish;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* There are two copies of the compiler: full(!fast) and fast.
|
||||||
|
The "full" case emits before/after handlers for each insn.
|
||||||
|
Having two copies of this code is a tradeoff, having one copy
|
||||||
|
seemed a bit more difficult to read (due to constantly testing
|
||||||
|
FAST_P). ??? On the other hand, with address ranges we'll want to
|
||||||
|
omit before/after handlers for unwanted insns. Having separate loops
|
||||||
|
for FAST/!FAST avoids constantly doing the test in the loop, but
|
||||||
|
typically FAST_P is a constant and such tests will get optimized out. */
|
||||||
|
|
||||||
|
if (FAST_P)
|
||||||
|
{
|
||||||
|
while (max_insns > 0)
|
||||||
|
{
|
||||||
|
USI insn = GETIMEMUSI (current_cpu, pc);
|
||||||
|
if ((SI) insn < 0)
|
||||||
|
{
|
||||||
|
/* 32 bit insn */
|
||||||
|
idesc = emit_32 (current_cpu, pc, insn, sc, 1);
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
++icount;
|
||||||
|
pc += 4;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (sc - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((insn & 0x8000) != 0) /* parallel? */
|
||||||
|
{
|
||||||
|
/* Yep. Here's the "interesting" [sic] part. */
|
||||||
|
idesc = emit_parallel (current_cpu, pc, insn, sc, 1);
|
||||||
|
sc += 3;
|
||||||
|
max_insns -= 3;
|
||||||
|
icount += 2;
|
||||||
|
pc += 4;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (sc - 3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* 2 serial 16 bit insns */
|
||||||
|
{
|
||||||
|
idesc = emit_16 (current_cpu, pc, insn >> 16, sc, 1, 0);
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
++icount;
|
||||||
|
pc += 2;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (sc - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* While we're guaranteed that there's room to extract the
|
||||||
|
insn, when single stepping we can't; the pbb must stop
|
||||||
|
after the first insn. */
|
||||||
|
if (max_insns == 0)
|
||||||
|
break;
|
||||||
|
idesc = emit_16 (current_cpu, pc, insn & 0x7fff, sc, 1, 0);
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
++icount;
|
||||||
|
pc += 2;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (sc - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* ! FAST_P */
|
||||||
|
{
|
||||||
|
while (max_insns > 0)
|
||||||
|
{
|
||||||
|
USI insn = GETIMEMUSI (current_cpu, pc);
|
||||||
|
int trace_p = PC_IN_TRACE_RANGE_P (current_cpu, pc);
|
||||||
|
int profile_p = PC_IN_PROFILE_RANGE_P (current_cpu, pc);
|
||||||
|
SCACHE *cti_sc; /* ??? tmp hack */
|
||||||
|
if ((SI) insn < 0)
|
||||||
|
{
|
||||||
|
/* 32 bit insn
|
||||||
|
Only emit before/after handlers if necessary. */
|
||||||
|
if (trace_p || profile_p)
|
||||||
|
{
|
||||||
|
idesc = emit_full32 (current_cpu, pc, insn, sc,
|
||||||
|
trace_p, profile_p);
|
||||||
|
cti_sc = sc + 1;
|
||||||
|
sc += 3;
|
||||||
|
max_insns -= 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idesc = emit_32 (current_cpu, pc, insn, sc, 0);
|
||||||
|
cti_sc = sc;
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
}
|
||||||
|
++icount;
|
||||||
|
pc += 4;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (cti_sc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((insn & 0x8000) != 0) /* parallel? */
|
||||||
|
{
|
||||||
|
/* Yep. Here's the "interesting" [sic] part.
|
||||||
|
Only emit before/after handlers if necessary. */
|
||||||
|
if (trace_p || profile_p)
|
||||||
|
{
|
||||||
|
idesc = emit_full_parallel (current_cpu, pc, insn, sc,
|
||||||
|
trace_p, profile_p);
|
||||||
|
cti_sc = sc + 1;
|
||||||
|
sc += 6;
|
||||||
|
max_insns -= 6;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idesc = emit_parallel (current_cpu, pc, insn, sc, 0);
|
||||||
|
cti_sc = sc;
|
||||||
|
sc += 3;
|
||||||
|
max_insns -= 3;
|
||||||
|
}
|
||||||
|
icount += 2;
|
||||||
|
pc += 4;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (cti_sc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* 2 serial 16 bit insns */
|
||||||
|
{
|
||||||
|
/* Only emit before/after handlers if necessary. */
|
||||||
|
if (trace_p || profile_p)
|
||||||
|
{
|
||||||
|
idesc = emit_full16 (current_cpu, pc, insn >> 16, sc,
|
||||||
|
trace_p, profile_p);
|
||||||
|
cti_sc = sc + 1;
|
||||||
|
sc += 3;
|
||||||
|
max_insns -= 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idesc = emit_16 (current_cpu, pc, insn >> 16, sc, 0, 0);
|
||||||
|
cti_sc = sc;
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
}
|
||||||
|
++icount;
|
||||||
|
pc += 2;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (cti_sc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* While we're guaranteed that there's room to extract the
|
||||||
|
insn, when single stepping we can't; the pbb must stop
|
||||||
|
after the first insn. */
|
||||||
|
if (max_insns <= 0)
|
||||||
|
break;
|
||||||
|
/* Use the same trace/profile address for the 2nd insn.
|
||||||
|
Saves us having to compute it and they come in pairs
|
||||||
|
anyway (e.g. can never branch to the 2nd insn). */
|
||||||
|
if (trace_p || profile_p)
|
||||||
|
{
|
||||||
|
idesc = emit_full16 (current_cpu, pc, insn & 0x7fff, sc,
|
||||||
|
trace_p, profile_p);
|
||||||
|
cti_sc = sc + 1;
|
||||||
|
sc += 3;
|
||||||
|
max_insns -= 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idesc = emit_16 (current_cpu, pc, insn & 0x7fff, sc, 0, 0);
|
||||||
|
cti_sc = sc;
|
||||||
|
++sc;
|
||||||
|
--max_insns;
|
||||||
|
}
|
||||||
|
++icount;
|
||||||
|
pc += 2;
|
||||||
|
if (IDESC_CTI_P (idesc))
|
||||||
|
{
|
||||||
|
SET_CTI_VPC (cti_sc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Finish:
|
||||||
|
SET_INSN_COUNT (icount);
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
xfull-exec-pbb)
|
||||||
|
|
||||||
|
# Inputs: current_cpu, vpc, FAST_P
|
||||||
|
# Outputs: vpc
|
||||||
|
# vpc is the virtual program counter.
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
#define DEFINE_SWITCH
|
||||||
|
#include "semx-switch.c"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Invalid argument to mainloop.in: $1" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
esac
|
2899
sim/m32r/modelx.c
Normal file
2899
sim/m32r/modelx.c
Normal file
File diff suppressed because it is too large
Load diff
6266
sim/m32r/semx-switch.c
Normal file
6266
sim/m32r/semx-switch.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -235,6 +235,11 @@ print_m32r_misc_cpu (SIM_CPU *cpu, int verbose)
|
||||||
PROFILE_LABEL_WIDTH, "Fill nops:",
|
PROFILE_LABEL_WIDTH, "Fill nops:",
|
||||||
sim_add_commas (buf, sizeof (buf),
|
sim_add_commas (buf, sizeof (buf),
|
||||||
CPU_M32R_MISC_PROFILE (cpu)->fillnop_count));
|
CPU_M32R_MISC_PROFILE (cpu)->fillnop_count));
|
||||||
|
if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_m32rx)
|
||||||
|
sim_io_printf (sd, " %-*s %s\n\n",
|
||||||
|
PROFILE_LABEL_WIDTH, "Parallel insns:",
|
||||||
|
sim_add_commas (buf, sizeof (buf),
|
||||||
|
CPU_M32R_MISC_PROFILE (cpu)->parallel_count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
/* Main header for the m32r. */
|
/* Main header for the m32r. */
|
||||||
|
|
||||||
#ifndef SIM_MAIN_H
|
#ifndef SIM_MAIN_H
|
||||||
|
@ -57,6 +58,8 @@ struct _sim_cpu {
|
||||||
go after here. Oh for a better language. */
|
go after here. Oh for a better language. */
|
||||||
#if defined (WANT_CPU_M32RBF)
|
#if defined (WANT_CPU_M32RBF)
|
||||||
M32RBF_CPU_DATA cpu_data;
|
M32RBF_CPU_DATA cpu_data;
|
||||||
|
#elif defined (WANT_CPU_M32RXF)
|
||||||
|
M32RXF_CPU_DATA cpu_data;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue