diff options
author | nobody <> | 2004-02-14 00:00:34 +0000 |
---|---|---|
committer | nobody <> | 2004-02-14 00:00:34 +0000 |
commit | 2f344a4dcd2a8c4297702027a943e3587e6b60c8 (patch) | |
tree | 8614f4d9fc669ec37a90e4b4f70b31f00c489661 /gdb/mips-tdep.c | |
parent | a5dd37ab655106440e987830db5111b43f271ecc (diff) | |
download | binutils-cagney_bfdfile-20040213-branch.zip binutils-cagney_bfdfile-20040213-branch.tar.gz binutils-cagney_bfdfile-20040213-branch.tar.bz2 |
This commit was manufactured by cvs2svn to create branchcagney_bfdfile-20040213-branchpointcagney_bfdfile-20040213-branch
'cagney_bfdfile-20040213-branch'.
Sprout from cagney_bigcore-20040122-branch 2004-01-22 00:00:03 UTC nobody 'This commit was manufactured by cvs2svn to create branch'
Cherrypick from master 2004-02-14 00:00:33 UTC gdbadmin <gdbadmin@sourceware.org> '*** empty log message ***':
COPYING.NEWLIB
ChangeLog
Makefile.def
Makefile.in
bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/bfdio.c
bfd/cache.c
bfd/coff-h8300.c
bfd/config.in
bfd/configure
bfd/configure.in
bfd/elf-bfd.h
bfd/elf.c
bfd/elf32-arm.h
bfd/elf32-frv.c
bfd/elf32-h8300.c
bfd/elf64-alpha.c
bfd/elfxx-ia64.c
bfd/elfxx-mips.c
bfd/elfxx-mips.h
bfd/elfxx-target.h
bfd/libbfd-in.h
bfd/libbfd.h
bfd/version.h
binutils/ChangeLog
binutils/readelf.c
configure
configure.in
gas/ChangeLog
gas/config/tc-arm.c
gas/config/tc-ia64.c
gas/config/tc-ia64.h
gas/config/tc-m68k.c
gas/config/tc-m68k.h
gas/config/tc-mips.c
gas/config/tc-mips.h
gas/doc/internals.texi
gas/dwarf2dbg.c
gas/frags.c
gas/frags.h
gas/read.c
gas/read.h
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/arm.exp
gas/testsuite/gas/arm/undefined.l
gas/testsuite/gas/arm/undefined.s
gas/testsuite/gas/macros/test2.s
gas/testsuite/gas/mips/div.d
gas/testsuite/gas/mips/elf-rel-got-n32.d
gas/testsuite/gas/mips/elf-rel-got-n64.d
gas/testsuite/gas/mips/elf-rel-xgot-n32.d
gas/testsuite/gas/mips/elf-rel-xgot-n64.d
gas/testsuite/gas/mips/elf-rel19.d
gas/testsuite/gas/mips/elf-rel19.s
gas/testsuite/gas/mips/la-svr4pic.d
gas/testsuite/gas/mips/la-xgot.d
gas/testsuite/gas/mips/lca-svr4pic.d
gas/testsuite/gas/mips/lca-xgot.d
gas/testsuite/gas/mips/macro-warn-1-n32.d
gas/testsuite/gas/mips/macro-warn-1-n32.l
gas/testsuite/gas/mips/macro-warn-1.d
gas/testsuite/gas/mips/macro-warn-1.l
gas/testsuite/gas/mips/macro-warn-1.s
gas/testsuite/gas/mips/macro-warn-2-n32.d
gas/testsuite/gas/mips/macro-warn-2.d
gas/testsuite/gas/mips/macro-warn-2.l
gas/testsuite/gas/mips/macro-warn-2.s
gas/testsuite/gas/mips/macro-warn-3.d
gas/testsuite/gas/mips/macro-warn-3.l
gas/testsuite/gas/mips/macro-warn-3.s
gas/testsuite/gas/mips/macro-warn-4.d
gas/testsuite/gas/mips/macro-warn-4.l
gas/testsuite/gas/mips/macro-warn-4.s
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/relax-swap1-mips2.d
gas/testsuite/gas/mips/relax-swap1.s
gas/testsuite/gas/mips/relax-swap2.s
gas/testsuite/gas/sh/basic.exp
gas/testsuite/gas/sh/err-sh4a-fp.s
gas/testsuite/gas/sh/sh4a-fp.d
gas/testsuite/gas/sh/sh4a-fp.s
gdb/ChangeLog
gdb/Makefile.in
gdb/NEWS
gdb/PROBLEMS
gdb/ada-lang.c
gdb/alpha-tdep.c
gdb/arch-utils.c
gdb/arch-utils.h
gdb/arm-tdep.c
gdb/auxv.c
gdb/auxv.h
gdb/avr-tdep.c
gdb/ax-gdb.c
gdb/bcache.c
gdb/blockframe.c
gdb/breakpoint.c
gdb/breakpoint.h
gdb/buildsym.c
gdb/c-lang.c
gdb/cli/cli-cmds.c
gdb/cli/cli-decode.c
gdb/coffread.c
gdb/config/mips/tm-linux.h
gdb/config/nm-linux.h
gdb/config/sparc/nm-nbsd.h
gdb/config/sparc/obsd.mt
gdb/config/sparc/obsd64.mt
gdb/configure
gdb/configure.host
gdb/configure.in
gdb/configure.tgt
gdb/corelow.c
gdb/cp-namespace.c
gdb/cp-support.c
gdb/cp-support.h
gdb/cris-tdep.c
gdb/d10v-tdep.c
gdb/dbxread.c
gdb/defs.h
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/doc/gdbint.texinfo
gdb/doc/stabs.texinfo
gdb/dwarf2-frame.c
gdb/dwarf2-frame.h
gdb/dwarf2loc.c
gdb/dwarf2loc.h
gdb/dwarf2read.c
gdb/dwarfread.c
gdb/elfread.c
gdb/f-lang.c
gdb/findvar.c
gdb/frame.c
gdb/frame.h
gdb/frv-tdep.c
gdb/gdb-events.h
gdb/gdb-events.sh
gdb/gdb_curses.h
gdb/gdb_obstack.h
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-low.h
gdb/gdbserver/regcache.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/h8300-tdep.c
gdb/hppa-tdep.c
gdb/hpread.c
gdb/i386-linux-tdep.c
gdb/i386-nto-tdep.c
gdb/ia64-tdep.c
gdb/infcmd.c
gdb/infrun.c
gdb/inftarg.c
gdb/jv-lang.c
gdb/language.c
gdb/language.h
gdb/linespec.c
gdb/linux-proc.c
gdb/m2-lang.c
gdb/m32r-rom.c
gdb/m32r-tdep.c
gdb/m68hc11-tdep.c
gdb/m68k-tdep.c
gdb/m68klinux-tdep.c
gdb/main.c
gdb/mcore-tdep.c
gdb/mdebugread.c
gdb/mi/mi-cmd-stack.c
gdb/mi/mi-cmd-var.c
gdb/mi/mi-cmds.h
gdb/minsyms.c
gdb/mips-linux-nat.c
gdb/mips-linux-tdep.c
gdb/mips-tdep.c
gdb/mn10300-tdep.c
gdb/ns32k-tdep.c
gdb/objc-lang.c
gdb/objfiles.c
gdb/objfiles.h
gdb/osabi.c
gdb/p-lang.c
gdb/pa64solib.c
gdb/printcmd.c
gdb/proc-api.c
gdb/procfs.c
gdb/regcache.c
gdb/remote-fileio.c
gdb/remote-rdi.c
gdb/remote-sim.c
gdb/remote.c
gdb/rs6000-tdep.c
gdb/s390-tdep.c
gdb/scm-lang.c
gdb/ser-pipe.c
gdb/sh-tdep.c
gdb/sh64-tdep.c
gdb/sol-thread.c
gdb/solib-sunos.c
gdb/somread.c
gdb/somsolib.c
gdb/source.c
gdb/sparc-nat.c
gdb/sparc-tdep.c
gdb/sparc-tdep.h
gdb/sparc64-tdep.h
gdb/sparc64nbsd-tdep.c
gdb/sparc64obsd-tdep.c
gdb/sparcnbsd-tdep.c
gdb/sparcobsd-tdep.c
gdb/stabsread.c
gdb/stack.c
gdb/symfile.c
gdb/symfile.h
gdb/symmisc.c
gdb/symtab.c
gdb/symtab.h
gdb/target.h
gdb/testsuite/ChangeLog
gdb/testsuite/config/sim.exp
gdb/testsuite/gdb.arch/gdb1291.c
gdb/testsuite/gdb.arch/gdb1431.c
gdb/testsuite/gdb.asm/asm-source.exp
gdb/testsuite/gdb.asm/ia64.inc
gdb/testsuite/gdb.asm/openbsd.inc
gdb/testsuite/gdb.base/Makefile.in
gdb/testsuite/gdb.base/bang.exp
gdb/testsuite/gdb.base/call-ar-st.exp
gdb/testsuite/gdb.base/charset.c
gdb/testsuite/gdb.base/chng-syms.c
gdb/testsuite/gdb.base/chng-syms.exp
gdb/testsuite/gdb.base/completion.exp
gdb/testsuite/gdb.base/dump.c
gdb/testsuite/gdb.base/dump.exp
gdb/testsuite/gdb.base/fileio.c
gdb/testsuite/gdb.base/finish.exp
gdb/testsuite/gdb.base/gcore.exp
gdb/testsuite/gdb.base/huge.c
gdb/testsuite/gdb.base/huge.exp
gdb/testsuite/gdb.base/info-proc.exp
gdb/testsuite/gdb.base/langs.exp
gdb/testsuite/gdb.base/maint.exp
gdb/testsuite/gdb.base/pending.c
gdb/testsuite/gdb.base/pending.exp
gdb/testsuite/gdb.base/pendshr.c
gdb/testsuite/gdb.base/return2.exp
gdb/testsuite/gdb.base/shlib-call.exp
gdb/testsuite/gdb.cp/ambiguous.exp
gdb/testsuite/gdb.cp/annota2.exp
gdb/testsuite/gdb.cp/annota3.exp
gdb/testsuite/gdb.cp/anon-union.exp
gdb/testsuite/gdb.cp/breakpoint.cc
gdb/testsuite/gdb.cp/breakpoint.exp
gdb/testsuite/gdb.cp/bs15503.cc
gdb/testsuite/gdb.cp/casts.exp
gdb/testsuite/gdb.cp/class2.cc
gdb/testsuite/gdb.cp/classes.exp
gdb/testsuite/gdb.cp/cplusfuncs.exp
gdb/testsuite/gdb.cp/ctti.exp
gdb/testsuite/gdb.cp/cttiadd.cc
gdb/testsuite/gdb.cp/cttiadd1.cc
gdb/testsuite/gdb.cp/cttiadd2.cc
gdb/testsuite/gdb.cp/cttiadd3.cc
gdb/testsuite/gdb.cp/demangle.exp
gdb/testsuite/gdb.cp/derivation.exp
gdb/testsuite/gdb.cp/exception.cc
gdb/testsuite/gdb.cp/exception.exp
gdb/testsuite/gdb.cp/hang.exp
gdb/testsuite/gdb.cp/inherit.exp
gdb/testsuite/gdb.cp/local.exp
gdb/testsuite/gdb.cp/maint.exp
gdb/testsuite/gdb.cp/member-ptr.cc
gdb/testsuite/gdb.cp/member-ptr.exp
gdb/testsuite/gdb.cp/method.exp
gdb/testsuite/gdb.cp/misc.exp
gdb/testsuite/gdb.cp/namespace.cc
gdb/testsuite/gdb.cp/namespace.exp
gdb/testsuite/gdb.cp/namespace1.cc
gdb/testsuite/gdb.cp/overload.cc
gdb/testsuite/gdb.cp/overload.exp
gdb/testsuite/gdb.cp/ovldbreak.exp
gdb/testsuite/gdb.cp/psmang.exp
gdb/testsuite/gdb.cp/ref-types.exp
gdb/testsuite/gdb.cp/rtti.exp
gdb/testsuite/gdb.cp/rtti1.cc
gdb/testsuite/gdb.cp/templates.exp
gdb/testsuite/gdb.cp/userdef.exp
gdb/testsuite/gdb.cp/virtfunc.exp
gdb/testsuite/gdb.mi/mi-stack.exp
gdb/testsuite/gdb.mi/mi-var-child.exp
gdb/testsuite/gdb.objc/basicclass.exp
gdb/testsuite/gdb.threads/gcore-thread.exp
gdb/testsuite/gdb.threads/thread-specific.c
gdb/testsuite/gdb.threads/thread-specific.exp
gdb/testsuite/lib/compiler.c
gdb/testsuite/lib/compiler.cc
gdb/testsuite/lib/gdb.exp
gdb/tui/tui-command.c
gdb/tui/tui-data.c
gdb/tui/tui-data.h
gdb/tui/tui-disasm.c
gdb/tui/tui-file.c
gdb/tui/tui-hooks.c
gdb/tui/tui-hooks.h
gdb/tui/tui-interp.c
gdb/tui/tui-io.c
gdb/tui/tui-layout.c
gdb/tui/tui-layout.h
gdb/tui/tui-regs.c
gdb/tui/tui-regs.h
gdb/tui/tui-source.c
gdb/tui/tui-source.h
gdb/tui/tui-stack.c
gdb/tui/tui-stack.h
gdb/tui/tui-win.c
gdb/tui/tui-win.h
gdb/tui/tui-windata.c
gdb/tui/tui-windata.h
gdb/tui/tui-wingeneral.c
gdb/tui/tui-wingeneral.h
gdb/tui/tui-winsource.c
gdb/tui/tui-winsource.h
gdb/tui/tui.c
gdb/tui/tui.h
gdb/utils.c
gdb/v850-tdep.c
gdb/valops.c
gdb/values.c
gdb/vax-tdep.c
gdb/version.in
gdb/xcoffread.c
gdb/xstormy16-tdep.c
include/elf/ChangeLog
include/elf/common.h
include/opcode/ChangeLog
include/opcode/h8300.h
ld/ChangeLog
ld/emulparams/armelf.sh
ld/emulparams/armelf_linux.sh
ld/emulparams/elf32bmip.sh
ld/emulparams/elf32bmipn32.sh
ld/emulparams/elf32btsmipn32.sh
ld/emulparams/elf64_ia64.sh
ld/emulparams/shlelf_linux.sh
ld/emultempl/pe.em
ld/genscripts.sh
ld/testsuite/ChangeLog
ld/testsuite/ld-arm/arm-app-abs32.d
ld/testsuite/ld-arm/arm-app-abs32.r
ld/testsuite/ld-arm/arm-app-abs32.s
ld/testsuite/ld-arm/arm-elf.exp
ld/testsuite/ld-h8300/h8300.exp
ld/testsuite/ld-h8300/relax-5-coff.d
ld/testsuite/ld-h8300/relax-5.d
ld/testsuite/ld-h8300/relax-5.s
libiberty/ChangeLog
libiberty/Makefile.in
libiberty/configure
libiberty/configure.ac
libiberty/getpwd.c
libiberty/maint-tool
opcodes/ChangeLog
opcodes/m32r-dis.c
opcodes/sh-opc.h
readline/ChangeLog.gdb
readline/bind.c
readline/mbutil.c
readline/readline.c
readline/vi_mode.c
sim/ChangeLog
sim/configure
sim/configure.in
sim/m32r/ChangeLog
sim/m32r/mloop2.in
sim/m32r/mloopx.in
sim/ppc/ChangeLog
sim/ppc/ppc-instructions
sim/sh/ChangeLog
sim/sh/gencode.c
sim/sh/interp.c
sim/testsuite/ChangeLog
sim/testsuite/lib/sim-defs.exp
sim/testsuite/sim/mips/ChangeLog
sim/testsuite/sim/mips/basic.exp
sim/testsuite/sim/mips/sanity.s
sim/testsuite/sim/mips/testutils.inc
sim/testsuite/sim/sh/ChangeLog
sim/testsuite/sim/sh/allinsn.exp
sim/testsuite/sim/sh/and.s
sim/testsuite/sim/sh/movi.s
sim/testsuite/sim/sh/sett.s
sim/testsuite/sim/sh/testutils.inc
Delete:
gdb/testsuite/gdb.mi/mi1-basics.exp
gdb/testsuite/gdb.mi/mi1-break.exp
gdb/testsuite/gdb.mi/mi1-console.exp
gdb/testsuite/gdb.mi/mi1-disassemble.exp
gdb/testsuite/gdb.mi/mi1-eval.exp
gdb/testsuite/gdb.mi/mi1-hack-cli.exp
gdb/testsuite/gdb.mi/mi1-pthreads.exp
gdb/testsuite/gdb.mi/mi1-read-memory.exp
gdb/testsuite/gdb.mi/mi1-regs.exp
gdb/testsuite/gdb.mi/mi1-return.exp
gdb/testsuite/gdb.mi/mi1-simplerun.exp
gdb/testsuite/gdb.mi/mi1-stack.exp
gdb/testsuite/gdb.mi/mi1-stepi.exp
gdb/testsuite/gdb.mi/mi1-symbol.exp
gdb/testsuite/gdb.mi/mi1-until.exp
gdb/testsuite/gdb.mi/mi1-var-block.exp
gdb/testsuite/gdb.mi/mi1-var-child.exp
gdb/testsuite/gdb.mi/mi1-var-cmd.exp
gdb/testsuite/gdb.mi/mi1-var-display.exp
gdb/testsuite/gdb.mi/mi1-watch.exp
Diffstat (limited to 'gdb/mips-tdep.c')
-rw-r--r-- | gdb/mips-tdep.c | 693 |
1 files changed, 202 insertions, 491 deletions
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 41bfc7c..fb80964 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -50,6 +50,9 @@ #include "symcat.h" #include "sim-regno.h" #include "dis-asm.h" +#include "frame-unwind.h" +#include "frame-base.h" +#include "trad-frame.h" static void set_reg_offset (CORE_ADDR *saved_regs, int regnum, CORE_ADDR off); static struct type *mips_register_type (struct gdbarch *gdbarch, int regnum); @@ -286,7 +289,6 @@ mips_xfer_register (struct regcache *regcache, int reg_num, int length, enum bfd_endian endian, bfd_byte * in, const bfd_byte * out, int buf_offset) { - bfd_byte reg[MAX_REGISTER_SIZE]; int reg_offset = 0; gdb_assert (reg_num >= NUM_REGS); /* Need to transfer the left or right part of the register, based on @@ -810,6 +812,25 @@ mips_read_pc (ptid_t ptid) return read_signed_register_pid (mips_regnum (current_gdbarch)->pc, ptid); } +static CORE_ADDR +mips_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame) +{ + return frame_unwind_register_signed (next_frame, + NUM_REGS + mips_regnum (gdbarch)->pc); +} + +/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that + dummy frame. The frame ID's base needs to match the TOS value + saved by save_dummy_frame_tos(), and the PC match the dummy frame's + breakpoint. */ + +static struct frame_id +mips_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame) +{ + return frame_id_build (frame_unwind_register_signed (next_frame, NUM_REGS + SP_REGNUM), + frame_pc_unwind (next_frame)); +} + static void mips_write_pc (CORE_ADDR pc, ptid_t ptid) { @@ -936,6 +957,34 @@ mips_fetch_instruction (CORE_ADDR addr) return extract_unsigned_integer (buf, instlen); } +static ULONGEST +mips16_fetch_instruction (CORE_ADDR addr) +{ + char buf[MIPS_INSTLEN]; + int instlen; + int status; + + instlen = MIPS16_INSTLEN; + addr = unmake_mips16_addr (addr); + status = read_memory_nobpt (addr, buf, instlen); + if (status) + memory_error (status, addr); + return extract_unsigned_integer (buf, instlen); +} + +static ULONGEST +mips32_fetch_instruction (CORE_ADDR addr) +{ + char buf[MIPS_INSTLEN]; + int instlen; + int status; + instlen = MIPS_INSTLEN; + status = read_memory_nobpt (addr, buf, instlen); + if (status) + memory_error (status, addr); + return extract_unsigned_integer (buf, instlen); +} + /* These the fields of 32 bit mips instructions */ #define mips32_op(x) (x >> 26) @@ -1426,98 +1475,57 @@ mips_next_pc (CORE_ADDR pc) return mips32_next_pc (pc); } -/* Set up the 'saved_regs' array. This is a data structure containing - the addresses on the stack where each register has been saved, for - each stack frame. Registers that have not been saved will have - zero here. The stack pointer register is special: rather than the - address where the stack register has been saved, - saved_regs[SP_REGNUM] will have the actual value of the previous - frame's stack register. */ +struct mips_frame_cache +{ + CORE_ADDR base; + struct trad_frame_saved_reg *saved_regs; +}; -static void -mips_find_saved_regs (struct frame_info *fci) + +static struct mips_frame_cache * +mips_mdebug_frame_cache (struct frame_info *next_frame, void **this_cache) { - int ireg; + mips_extra_func_info_t proc_desc; + struct mips_frame_cache *cache; + struct gdbarch *gdbarch = get_frame_arch (next_frame); + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* r0 bit means kernel trap */ int kernel_trap; /* What registers have been saved? Bitmasks. */ unsigned long gen_mask, float_mask; - mips_extra_func_info_t proc_desc; - t_inst inst; - CORE_ADDR *saved_regs; - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - - if (deprecated_get_frame_saved_regs (fci) != NULL) - return; - saved_regs = frame_saved_regs_zalloc (fci); - - /* If it is the frame for sigtramp, the saved registers are located - in a sigcontext structure somewhere on the stack. If the stack - layout for sigtramp changes we might have to change these - constants and the companion fixup_sigtramp in mdebugread.c */ -#ifndef SIGFRAME_BASE - /* To satisfy alignment restrictions, sigcontext is located 4 bytes - above the sigtramp frame. */ -#define SIGFRAME_BASE mips_regsize (current_gdbarch) -/* FIXME! Are these correct?? */ -#define SIGFRAME_PC_OFF (SIGFRAME_BASE + 2 * mips_regsize (current_gdbarch)) -#define SIGFRAME_REGSAVE_OFF (SIGFRAME_BASE + 3 * mips_regsize (current_gdbarch)) -#define SIGFRAME_FPREGSAVE_OFF \ - (SIGFRAME_REGSAVE_OFF + MIPS_NUMREGS * mips_regsize (current_gdbarch) + 3 * mips_regsize (current_gdbarch)) -#endif - if ((get_frame_type (fci) == SIGTRAMP_FRAME)) - { - for (ireg = 0; ireg < MIPS_NUMREGS; ireg++) - { - CORE_ADDR reg_position = - (get_frame_base (fci) + SIGFRAME_REGSAVE_OFF + - ireg * mips_regsize (current_gdbarch)); - set_reg_offset (saved_regs, ireg, reg_position); - } - for (ireg = 0; ireg < MIPS_NUMREGS; ireg++) - { - CORE_ADDR reg_position = (get_frame_base (fci) - + SIGFRAME_FPREGSAVE_OFF - + ireg * mips_regsize (current_gdbarch)); - set_reg_offset (saved_regs, - mips_regnum (current_gdbarch)->fp0 + ireg, - reg_position); - } - set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->pc, - get_frame_base (fci) + SIGFRAME_PC_OFF); - /* SP_REGNUM, contains the value and not the address. */ - set_reg_offset (saved_regs, SP_REGNUM, get_frame_base (fci)); - return; - } + if ((*this_cache) != NULL) + return (*this_cache); + cache = FRAME_OBSTACK_ZALLOC (struct mips_frame_cache); + (*this_cache) = cache; + cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); - proc_desc = get_frame_extra_info (fci)->proc_desc; + /* Get the mdebug proc descriptor. */ + proc_desc = find_proc_desc (frame_pc_unwind (next_frame), next_frame, 1); if (proc_desc == NULL) /* I'm not sure how/whether this can happen. Normally when we can't find a proc_desc, we "synthesize" one using heuristic_proc_desc and set the saved_regs right away. */ - return; + return cache; + + /* Extract the frame's base. */ + cache->base = (frame_unwind_register_signed (next_frame, NUM_REGS + PROC_FRAME_REG (proc_desc)) + + PROC_FRAME_OFFSET (proc_desc) - PROC_FRAME_ADJUST (proc_desc)); kernel_trap = PROC_REG_MASK (proc_desc) & 1; gen_mask = kernel_trap ? 0xFFFFFFFF : PROC_REG_MASK (proc_desc); float_mask = kernel_trap ? 0xFFFFFFFF : PROC_FREG_MASK (proc_desc); - - if ( /* In any frame other than the innermost or a frame interrupted - by a signal, we assume that all registers have been saved. - This assumes that all register saves in a function happen - before the first function call. */ - (get_next_frame (fci) == NULL - || (get_frame_type (get_next_frame (fci)) == SIGTRAMP_FRAME)) - /* In a dummy frame we know exactly where things are saved. */ - && !PROC_DESC_IS_DUMMY (proc_desc) - /* Don't bother unless we are inside a function prologue. - Outside the prologue, we know where everything is. */ - && in_prologue (get_frame_pc (fci), PROC_LOW_ADDR (proc_desc)) - /* Not sure exactly what kernel_trap means, but if it means the - kernel saves the registers without a prologue doing it, we - better not examine the prologue to see whether registers - have been saved yet. */ - && !kernel_trap) + + /* In any frame other than the innermost or a frame interrupted by a + signal, we assume that all registers have been saved. This + assumes that all register saves in a function happen before the + first function call. */ + if (in_prologue (frame_pc_unwind (next_frame), PROC_LOW_ADDR (proc_desc)) + /* Not sure exactly what kernel_trap means, but if it means the + kernel saves the registers without a prologue doing it, we + better not examine the prologue to see whether registers + have been saved yet. */ + && !kernel_trap) { /* We need to figure out whether the registers that the proc_desc claims are saved have been saved yet. */ @@ -1527,22 +1535,28 @@ mips_find_saved_regs (struct frame_info *fci) /* Bitmasks; set if we have found a save for the register. */ unsigned long gen_save_found = 0; unsigned long float_save_found = 0; - int instlen; + int mips16; /* If the address is odd, assume this is MIPS16 code. */ addr = PROC_LOW_ADDR (proc_desc); - instlen = pc_is_mips16 (addr) ? MIPS16_INSTLEN : MIPS_INSTLEN; + mips16 = pc_is_mips16 (addr); /* Scan through this function's instructions preceding the current PC, and look for those that save registers. */ - while (addr < get_frame_pc (fci)) + while (addr < frame_pc_unwind (next_frame)) { - inst = mips_fetch_instruction (addr); - if (pc_is_mips16 (addr)) - mips16_decode_reg_save (inst, &gen_save_found); + if (mips16) + { + mips16_decode_reg_save (mips16_fetch_instruction (addr), + &gen_save_found); + addr += MIPS16_INSTLEN; + } else - mips32_decode_reg_save (inst, &gen_save_found, &float_save_found); - addr += instlen; + { + mips32_decode_reg_save (mips32_fetch_instruction (addr), + &gen_save_found, &float_save_found); + addr += MIPS_INSTLEN; + } } gen_mask = gen_save_found; float_mask = float_save_found; @@ -1551,12 +1565,13 @@ mips_find_saved_regs (struct frame_info *fci) /* Fill in the offsets for the registers which gen_mask says were saved. */ { - CORE_ADDR reg_position = (get_frame_base (fci) + CORE_ADDR reg_position = (cache->base + PROC_REG_OFFSET (proc_desc)); + int ireg; for (ireg = MIPS_NUMREGS - 1; gen_mask; --ireg, gen_mask <<= 1) if (gen_mask & 0x80000000) { - set_reg_offset (saved_regs, ireg, reg_position); + cache->saved_regs[NUM_REGS + ireg].addr = reg_position; reg_position -= mips_saved_regsize (tdep); } } @@ -1567,7 +1582,7 @@ mips_find_saved_regs (struct frame_info *fci) instruction that saves $s0 or $s1, correct their saved addresses. */ if (pc_is_mips16 (PROC_LOW_ADDR (proc_desc))) { - inst = mips_fetch_instruction (PROC_LOW_ADDR (proc_desc)); + ULONGEST inst = mips16_fetch_instruction (PROC_LOW_ADDR (proc_desc)); if ((inst & 0xf81f) == 0xe809 && (inst & 0x700) != 0x700) /* entry */ { @@ -1575,16 +1590,18 @@ mips_find_saved_regs (struct frame_info *fci) int sreg_count = (inst >> 6) & 3; /* Check if the ra register was pushed on the stack. */ - CORE_ADDR reg_position = (get_frame_base (fci) + CORE_ADDR reg_position = (cache->base + PROC_REG_OFFSET (proc_desc)); if (inst & 0x20) reg_position -= mips_saved_regsize (tdep); /* Check if the s0 and s1 registers were pushed on the stack. */ + /* NOTE: cagney/2004-02-08: Huh? This is doing no such + check. */ for (reg = 16; reg < sreg_count + 16; reg++) { - set_reg_offset (saved_regs, reg, reg_position); + cache->saved_regs[NUM_REGS + reg].addr = reg_position; reg_position -= mips_saved_regsize (tdep); } } @@ -1593,9 +1610,9 @@ mips_find_saved_regs (struct frame_info *fci) /* Fill in the offsets for the registers which float_mask says were saved. */ { - CORE_ADDR reg_position = (get_frame_base (fci) + CORE_ADDR reg_position = (cache->base + PROC_FREG_OFFSET (proc_desc)); - + int ireg; /* Fill in the offsets for the float registers which float_mask says were saved. */ for (ireg = MIPS_NUMREGS - 1; float_mask; --ireg, float_mask <<= 1) @@ -1627,27 +1644,83 @@ mips_find_saved_regs (struct frame_info *fci) reg_position is decremented each time through the loop). */ if ((ireg & 1)) - set_reg_offset (saved_regs, - mips_regnum (current_gdbarch)->fp0 + ireg, - reg_position - mips_saved_regsize (tdep)); + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->fp0 + ireg] + .addr = reg_position - mips_saved_regsize (tdep); else - set_reg_offset (saved_regs, - mips_regnum (current_gdbarch)->fp0 + ireg, - reg_position + mips_saved_regsize (tdep)); + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->fp0 + ireg] + .addr = reg_position + mips_saved_regsize (tdep); } else - set_reg_offset (saved_regs, - mips_regnum (current_gdbarch)->fp0 + ireg, - reg_position); + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->fp0 + ireg] + .addr = reg_position; reg_position -= mips_saved_regsize (tdep); } - set_reg_offset (saved_regs, mips_regnum (current_gdbarch)->pc, - saved_regs[RA_REGNUM]); + cache->saved_regs[NUM_REGS + mips_regnum (current_gdbarch)->pc] + = cache->saved_regs[NUM_REGS + RA_REGNUM]; } /* SP_REGNUM, contains the value and not the address. */ - set_reg_offset (saved_regs, SP_REGNUM, get_frame_base (fci)); + trad_frame_set_value (cache->saved_regs, NUM_REGS + SP_REGNUM, cache->base); + + return (*this_cache); +} + +static void +mips_mdebug_frame_this_id (struct frame_info *next_frame, void **this_cache, + struct frame_id *this_id) +{ + struct mips_frame_cache *info = mips_mdebug_frame_cache (next_frame, + this_cache); + (*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame)); +} + +static void +mips_mdebug_frame_prev_register (struct frame_info *next_frame, + void **this_cache, + int regnum, int *optimizedp, + enum lval_type *lvalp, CORE_ADDR *addrp, + int *realnump, void *valuep) +{ + struct mips_frame_cache *info = mips_mdebug_frame_cache (next_frame, + this_cache); + trad_frame_prev_register (next_frame, info->saved_regs, regnum, + optimizedp, lvalp, addrp, realnump, valuep); +} + +static const struct frame_unwind mips_mdebug_frame_unwind = +{ + NORMAL_FRAME, + mips_mdebug_frame_this_id, + mips_mdebug_frame_prev_register +}; + +static const struct frame_unwind * +mips_mdebug_frame_sniffer (struct frame_info *next_frame) +{ + return &mips_mdebug_frame_unwind; +} + +static CORE_ADDR +mips_mdebug_frame_base_address (struct frame_info *next_frame, + void **this_cache) +{ + struct mips_frame_cache *info = mips_mdebug_frame_cache (next_frame, + this_cache); + return info->base; +} + +static const struct frame_base mips_mdebug_frame_base = { + &mips_mdebug_frame_unwind, + mips_mdebug_frame_base_address, + mips_mdebug_frame_base_address, + mips_mdebug_frame_base_address +}; + +static const struct frame_base * +mips_mdebug_frame_base_sniffer (struct frame_info *next_frame) +{ + return &mips_mdebug_frame_base; } static CORE_ADDR @@ -1726,52 +1799,6 @@ mips_software_single_step (enum target_signal sig, int insert_breakpoints_p) target_remove_breakpoint (next_pc, break_mem); } -static CORE_ADDR -mips_init_frame_pc_first (int fromleaf, struct frame_info *prev) -{ - CORE_ADDR pc, tmp; - - pc = ((fromleaf) - ? DEPRECATED_SAVED_PC_AFTER_CALL (get_next_frame (prev)) - : get_next_frame (prev) - ? DEPRECATED_FRAME_SAVED_PC (get_next_frame (prev)) : read_pc ()); - tmp = SKIP_TRAMPOLINE_CODE (pc); - return tmp ? tmp : pc; -} - - -static CORE_ADDR -mips_frame_saved_pc (struct frame_info *frame) -{ - CORE_ADDR saved_pc; - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - - if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0)) - { - /* Always unwind the cooked PC register value. */ - saved_pc = frame_unwind_register_signed (frame, NUM_REGS + mips_regnum (current_gdbarch)->pc); - } - else - { - mips_extra_func_info_t proc_desc - = get_frame_extra_info (frame)->proc_desc; - if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc)) - saved_pc = read_memory_integer ((get_frame_base (frame) - - mips_saved_regsize (tdep)), - mips_saved_regsize (tdep)); - else - { - /* We have to get the saved pc from the sigcontext if it is - a signal handler frame. */ - int pcreg = (get_frame_type (frame) == SIGTRAMP_FRAME - ? mips_regnum (current_gdbarch)->pc - : proc_desc ? PROC_PC_REG (proc_desc) : RA_REGNUM); - saved_pc = read_next_frame_reg (frame, NUM_REGS + pcreg); - } - } - return ADDR_BITS_REMOVE (saved_pc); -} - static struct mips_extra_func_info temp_proc_desc; /* This hack will go away once the get_prev_frame() code has been @@ -2286,7 +2313,7 @@ non_heuristic_proc_desc (CORE_ADDR pc, CORE_ADDR *addrptr) This means that we should not bother with this method on 64-bit targets (until that is fixed). */ - priv = obstack_alloc (&sec->objfile->psymbol_obstack, + priv = obstack_alloc (&sec->objfile->objfile_obstack, sizeof (struct mips_objfile_private)); priv->size = 0; sec->objfile->obj_private = priv; @@ -2295,14 +2322,14 @@ non_heuristic_proc_desc (CORE_ADDR pc, CORE_ADDR *addrptr) { asection *bfdsec; - priv = obstack_alloc (&sec->objfile->psymbol_obstack, + priv = obstack_alloc (&sec->objfile->objfile_obstack, sizeof (struct mips_objfile_private)); bfdsec = bfd_get_section_by_name (sec->objfile->obfd, ".pdr"); if (bfdsec != NULL) { priv->size = bfd_section_size (sec->objfile->obfd, bfdsec); - priv->contents = obstack_alloc (&sec->objfile->psymbol_obstack, + priv->contents = obstack_alloc (&sec->objfile->objfile_obstack, priv->size); bfd_get_section_contents (sec->objfile->obfd, bfdsec, priv->contents, 0, priv->size); @@ -2354,7 +2381,7 @@ non_heuristic_proc_desc (CORE_ADDR pc, CORE_ADDR *addrptr) /* Fill in what we need of the proc_desc. */ proc_desc = (mips_extra_func_info_t) - obstack_alloc (&sec->objfile->psymbol_obstack, + obstack_alloc (&sec->objfile->objfile_obstack, sizeof (struct mips_extra_func_info)); PROC_LOW_ADDR (proc_desc) = startaddr; @@ -2471,154 +2498,6 @@ find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int cur_frame) return proc_desc; } -static CORE_ADDR -get_frame_pointer (struct frame_info *frame, mips_extra_func_info_t proc_desc) -{ - return (read_next_frame_reg (frame, NUM_REGS + PROC_FRAME_REG (proc_desc)) - + PROC_FRAME_OFFSET (proc_desc) - PROC_FRAME_ADJUST (proc_desc)); -} - -static mips_extra_func_info_t cached_proc_desc; - -static CORE_ADDR -mips_frame_chain (struct frame_info *frame) -{ - mips_extra_func_info_t proc_desc; - CORE_ADDR tmp; - CORE_ADDR saved_pc = DEPRECATED_FRAME_SAVED_PC (frame); - - /* Check if the PC is inside a call stub. If it is, fetch the - PC of the caller of that stub. */ - if ((tmp = SKIP_TRAMPOLINE_CODE (saved_pc)) != 0) - saved_pc = tmp; - - if (DEPRECATED_PC_IN_CALL_DUMMY (saved_pc, 0, 0)) - { - /* A dummy frame, uses SP not FP. Get the old SP value. If all - is well, frame->frame the bottom of the current frame will - contain that value. */ - return get_frame_base (frame); - } - - /* Look up the procedure descriptor for this PC. */ - proc_desc = find_proc_desc (saved_pc, frame, 1); - if (!proc_desc) - return 0; - - cached_proc_desc = proc_desc; - - /* If no frame pointer and frame size is zero, we must be at end - of stack (or otherwise hosed). If we don't check frame size, - we loop forever if we see a zero size frame. */ - if (PROC_FRAME_REG (proc_desc) == SP_REGNUM - && PROC_FRAME_OFFSET (proc_desc) == 0 - /* The previous frame from a sigtramp frame might be frameless - and have frame size zero. */ - && !(get_frame_type (frame) == SIGTRAMP_FRAME) - /* For a generic dummy frame, let get_frame_pointer() unwind a - register value saved as part of the dummy frame call. */ - && !(DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0))) - return 0; - else - return get_frame_pointer (frame, proc_desc); -} - -static void -mips_init_extra_frame_info (int fromleaf, struct frame_info *fci) -{ - int regnum; - mips_extra_func_info_t proc_desc; - - if (get_frame_type (fci) == DUMMY_FRAME) - return; - - /* Use proc_desc calculated in frame_chain. When there is no - next frame, i.e, get_next_frame (fci) == NULL, we call - find_proc_desc () to calculate it, passing an explicit - NULL as the frame parameter. */ - proc_desc = - get_next_frame (fci) - ? cached_proc_desc - : find_proc_desc (get_frame_pc (fci), - NULL /* i.e, get_next_frame (fci) */ , - 1); - - frame_extra_info_zalloc (fci, sizeof (struct frame_extra_info)); - - get_frame_extra_info (fci)->proc_desc = - proc_desc == &temp_proc_desc ? 0 : proc_desc; - if (proc_desc) - { - /* Fixup frame-pointer - only needed for top frame */ - /* This may not be quite right, if proc has a real frame register. - Get the value of the frame relative sp, procedure might have been - interrupted by a signal at it's very start. */ - if (get_frame_pc (fci) == PROC_LOW_ADDR (proc_desc) - && !PROC_DESC_IS_DUMMY (proc_desc)) - deprecated_update_frame_base_hack (fci, - read_next_frame_reg (get_next_frame - (fci), - NUM_REGS + - SP_REGNUM)); - else if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (fci), 0, 0)) - /* Do not ``fix'' fci->frame. It will have the value of the - generic dummy frame's top-of-stack (since the draft - fci->frame is obtained by returning the unwound stack - pointer) and that is what we want. That way the fci->frame - value will match the top-of-stack value that was saved as - part of the dummy frames data. */ - /* Do nothing. */ ; - else - deprecated_update_frame_base_hack (fci, - get_frame_pointer (get_next_frame - (fci), - proc_desc)); - - if (proc_desc == &temp_proc_desc) - { - char *name; - - /* Do not set the saved registers for a sigtramp frame, - mips_find_saved_registers will do that for us. We can't - use (get_frame_type (fci) == SIGTRAMP_FRAME), it is not - yet set. */ - /* FIXME: cagney/2002-11-18: This problem will go away once - frame.c:get_prev_frame() is modified to set the frame's - type before calling functions like this. */ - find_pc_partial_function (get_frame_pc (fci), &name, - (CORE_ADDR *) NULL, (CORE_ADDR *) NULL); - if (!PC_IN_SIGTRAMP (get_frame_pc (fci), name)) - { - frame_saved_regs_zalloc (fci); - /* Set value of previous frame's stack pointer. - Remember that saved_regs[SP_REGNUM] is special in - that it contains the value of the stack pointer - register. The other saved_regs values are addresses - (in the inferior) at which a given register's value - may be found. */ - set_reg_offset (temp_saved_regs, SP_REGNUM, - get_frame_base (fci)); - set_reg_offset (temp_saved_regs, mips_regnum (current_gdbarch)->pc, - temp_saved_regs[RA_REGNUM]); - memcpy (deprecated_get_frame_saved_regs (fci), temp_saved_regs, - SIZEOF_FRAME_SAVED_REGS); - } - } - - /* hack: if argument regs are saved, guess these contain args */ - /* assume we can't tell how many args for now */ - get_frame_extra_info (fci)->num_args = -1; - for (regnum = MIPS_LAST_ARG_REGNUM; regnum >= A0_REGNUM; regnum--) - { - if (PROC_REG_MASK (proc_desc) & (1 << regnum)) - { - get_frame_extra_info (fci)->num_args = regnum - A0_REGNUM + 1; - break; - } - } - } -} - /* MIPS stack frames are almost impenetrable. When execution stops, we basically have to look at symbol information for the function that we stopped in, which tells us *which* register (if any) is @@ -3215,7 +3094,6 @@ mips_n32n64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, for (argnum = 0; argnum < nargs; argnum++) { char *val; - char valbuf[MAX_REGISTER_SIZE]; struct value *arg = args[argnum]; struct type *arg_type = check_typedef (VALUE_TYPE (arg)); int len = TYPE_LENGTH (arg_type); @@ -3429,7 +3307,6 @@ mips_n32n64_return_value (struct gdbarch *gdbarch, /* A struct that contains one or two floats. Each value is part in the least significant part of their floating point register.. */ - bfd_byte reg[MAX_REGISTER_SIZE]; int regnum; int field; for (field = 0, regnum = mips_regnum (current_gdbarch)->fp0; @@ -3480,7 +3357,6 @@ mips_n32n64_return_value (struct gdbarch *gdbarch, offset += register_size (current_gdbarch, regnum), regnum++) { int xfer = register_size (current_gdbarch, regnum); - int pos = 0; if (offset + xfer > TYPE_LENGTH (type)) xfer = TYPE_LENGTH (type) - offset; if (mips_debug) @@ -3557,7 +3433,6 @@ mips_o32_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, for (argnum = 0; argnum < nargs; argnum++) { char *val; - char valbuf[MAX_REGISTER_SIZE]; struct value *arg = args[argnum]; struct type *arg_type = check_typedef (VALUE_TYPE (arg)); int len = TYPE_LENGTH (arg_type); @@ -3932,7 +3807,6 @@ mips_o32_return_value (struct gdbarch *gdbarch, struct type *type, offset += mips_stack_argsize (tdep), regnum++) { int xfer = mips_stack_argsize (tdep); - int pos = 0; if (offset + xfer > TYPE_LENGTH (type)) xfer = TYPE_LENGTH (type) - offset; if (mips_debug) @@ -4011,7 +3885,6 @@ mips_o64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr, for (argnum = 0; argnum < nargs; argnum++) { char *val; - char valbuf[MAX_REGISTER_SIZE]; struct value *arg = args[argnum]; struct type *arg_type = check_typedef (VALUE_TYPE (arg)); int len = TYPE_LENGTH (arg_type); @@ -4302,87 +4175,6 @@ mips_o64_store_return_value (struct type *valtype, char *valbuf) } } -static void -mips_pop_frame (void) -{ - int regnum; - struct frame_info *frame = get_current_frame (); - CORE_ADDR new_sp = get_frame_base (frame); - mips_extra_func_info_t proc_desc; - struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); - - if (DEPRECATED_PC_IN_CALL_DUMMY (get_frame_pc (frame), 0, 0)) - { - generic_pop_dummy_frame (); - flush_cached_frames (); - return; - } - - proc_desc = get_frame_extra_info (frame)->proc_desc; - write_register (mips_regnum (current_gdbarch)->pc, - DEPRECATED_FRAME_SAVED_PC (frame)); - mips_find_saved_regs (frame); - for (regnum = 0; regnum < NUM_REGS; regnum++) - if (regnum != SP_REGNUM && regnum != mips_regnum (current_gdbarch)->pc - && deprecated_get_frame_saved_regs (frame)[regnum]) - { - /* Floating point registers must not be sign extended, in case - mips_saved_regsize() = 4 but sizeof (FP0_REGNUM) == 8. */ - - if (mips_regnum (current_gdbarch)->fp0 <= regnum - && regnum < mips_regnum (current_gdbarch)->fp0 + 32) - write_register (regnum, - read_memory_unsigned_integer - (deprecated_get_frame_saved_regs (frame)[regnum], - mips_saved_regsize (tdep))); - else - write_register (regnum, - read_memory_integer (deprecated_get_frame_saved_regs - (frame)[regnum], - mips_saved_regsize (tdep))); - } - - write_register (SP_REGNUM, new_sp); - flush_cached_frames (); - - if (proc_desc && PROC_DESC_IS_DUMMY (proc_desc)) - { - struct linked_proc_info *pi_ptr, *prev_ptr; - - for (pi_ptr = linked_proc_desc_table, prev_ptr = NULL; - pi_ptr != NULL; prev_ptr = pi_ptr, pi_ptr = pi_ptr->next) - { - if (&pi_ptr->info == proc_desc) - break; - } - - if (pi_ptr == NULL) - error ("Can't locate dummy extra frame info\n"); - - if (prev_ptr != NULL) - prev_ptr->next = pi_ptr->next; - else - linked_proc_desc_table = pi_ptr->next; - - xfree (pi_ptr); - - write_register (mips_regnum (current_gdbarch)->hi, - read_memory_integer ((new_sp - - 2 * mips_saved_regsize (tdep)), - mips_saved_regsize (tdep))); - write_register (mips_regnum (current_gdbarch)->lo, - read_memory_integer ((new_sp - - 3 * mips_saved_regsize (tdep)), - mips_saved_regsize (tdep))); - if (MIPS_FPU_TYPE != MIPS_FPU_NONE) - write_register (mips_regnum (current_gdbarch)->fp_control_status, - read_memory_integer ((new_sp - - - 4 * mips_saved_regsize (tdep)), - mips_saved_regsize (tdep))); - } -} - /* Floating point register management. Background: MIPS1 & 2 fp registers are 32 bits wide. To support @@ -4506,8 +4298,8 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame, int regnum) { /* do values for FP (float) regs */ char *raw_buffer; - double doub, flt1, flt2; /* doubles extracted from raw hex data */ - int inv1, inv2, namelen; + double doub, flt1; /* doubles extracted from raw hex data */ + int inv1, inv2; raw_buffer = (char *) alloca (2 * @@ -5498,65 +5290,6 @@ mips_ignore_helper (CORE_ADDR pc) } -/* When debugging a 64 MIPS target running a 32 bit ABI, the size of - the register stored on the stack (32) is different to its real raw - size (64). The below ensures that registers are fetched from the - stack using their ABI size and then stored into the RAW_BUFFER - using their raw size. - - The alternative to adding this function would be to add an ABI - macro - REGISTER_STACK_SIZE(). */ - -static void -mips_get_saved_register (char *raw_buffer, - int *optimizedp, - CORE_ADDR *addrp, - struct frame_info *frame, - int regnum, enum lval_type *lvalp) -{ - CORE_ADDR addrx; - enum lval_type lvalx; - int optimizedx; - int realnumx; - - /* Always a pseudo. */ - gdb_assert (regnum >= NUM_REGS); - - /* Make certain that all needed parameters are present. */ - if (addrp == NULL) - addrp = &addrx; - if (lvalp == NULL) - lvalp = &lvalx; - if (optimizedp == NULL) - optimizedp = &optimizedx; - - if ((regnum % NUM_REGS) == SP_REGNUM) - /* The SP_REGNUM is special, its value is stored in saved_regs. - In fact, it is so special that it can even only be fetched - using a raw register number! Once this code as been converted - to frame-unwind the problem goes away. */ - frame_register_unwind (deprecated_get_next_frame_hack (frame), - regnum % NUM_REGS, optimizedp, lvalp, addrp, - &realnumx, raw_buffer); - else - /* Get it from the next frame. */ - frame_register_unwind (deprecated_get_next_frame_hack (frame), - regnum, optimizedp, lvalp, addrp, - &realnumx, raw_buffer); -} - -/* Immediately after a function call, return the saved pc. - Can't always go through the frames for this because on some machines - the new frame is not set up until the new function executes - some instructions. */ - -static CORE_ADDR -mips_saved_pc_after_call (struct frame_info *frame) -{ - return read_signed_register (RA_REGNUM); -} - - /* Convert a dbx stab register number (from `r' declaration) to a GDB [1 * NUM_REGS .. 2 * NUM_REGS) REGNUM. */ @@ -6024,17 +5757,17 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_read_pc (gdbarch, mips_read_pc); set_gdbarch_write_pc (gdbarch, mips_write_pc); - set_gdbarch_deprecated_target_read_fp (gdbarch, mips_read_sp); /* Draft FRAME base. */ set_gdbarch_read_sp (gdbarch, mips_read_sp); /* Add/remove bits from an address. The MIPS needs be careful to ensure that all 32 bit addresses are sign extended to 64 bits. */ set_gdbarch_addr_bits_remove (gdbarch, mips_addr_bits_remove); - /* There's a mess in stack frame creation. See comments in - blockframe.c near reference to DEPRECATED_INIT_FRAME_PC_FIRST. */ - set_gdbarch_deprecated_init_frame_pc_first (gdbarch, - mips_init_frame_pc_first); + /* Unwind the frame. */ + set_gdbarch_unwind_pc (gdbarch, mips_unwind_pc); + frame_unwind_append_sniffer (gdbarch, mips_mdebug_frame_sniffer); + set_gdbarch_unwind_dummy_id (gdbarch, mips_unwind_dummy_id); + frame_base_append_sniffer (gdbarch, mips_mdebug_frame_base_sniffer); /* Map debug register numbers onto internal register numbers. */ set_gdbarch_stab_reg_to_regnum (gdbarch, mips_stab_reg_to_regnum); @@ -6046,42 +5779,22 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) mips_dwarf_dwarf2_ecoff_reg_to_regnum); set_gdbarch_register_sim_regno (gdbarch, mips_register_sim_regno); - /* Initialize a frame */ - set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, - mips_find_saved_regs); - set_gdbarch_deprecated_init_extra_frame_info (gdbarch, - mips_init_extra_frame_info); - /* MIPS version of CALL_DUMMY */ /* NOTE: cagney/2003-08-05: Eventually call dummy location will be replaced by a command, and all targets will default to on stack (regardless of the stack's execute status). */ set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL); - set_gdbarch_deprecated_pop_frame (gdbarch, mips_pop_frame); set_gdbarch_frame_align (gdbarch, mips_frame_align); - set_gdbarch_deprecated_save_dummy_frame_tos (gdbarch, - generic_save_dummy_frame_tos); set_gdbarch_convert_register_p (gdbarch, mips_convert_register_p); set_gdbarch_register_to_value (gdbarch, mips_register_to_value); set_gdbarch_value_to_register (gdbarch, mips_value_to_register); - set_gdbarch_deprecated_frame_chain (gdbarch, mips_frame_chain); - set_gdbarch_frameless_function_invocation (gdbarch, - generic_frameless_function_invocation_not); - set_gdbarch_deprecated_frame_saved_pc (gdbarch, mips_frame_saved_pc); - set_gdbarch_frame_args_skip (gdbarch, 0); - - set_gdbarch_deprecated_get_saved_register (gdbarch, - mips_get_saved_register); - set_gdbarch_inner_than (gdbarch, core_addr_lessthan); set_gdbarch_breakpoint_from_pc (gdbarch, mips_breakpoint_from_pc); set_gdbarch_skip_prologue (gdbarch, mips_skip_prologue); - set_gdbarch_deprecated_saved_pc_after_call (gdbarch, - mips_saved_pc_after_call); set_gdbarch_pointer_to_address (gdbarch, signed_pointer_to_address); set_gdbarch_address_to_pointer (gdbarch, address_to_signed_pointer); @@ -6102,13 +5815,22 @@ mips_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) is sitting on? */ set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1); - /* Hook in OS ABI-specific overrides, if they have been registered. */ - gdbarch_init_osabi (info, gdbarch); - set_gdbarch_skip_trampoline_code (gdbarch, mips_skip_stub); - set_gdbarch_in_solib_call_trampoline (gdbarch, mips_in_call_stub); - set_gdbarch_in_solib_return_trampoline (gdbarch, mips_in_return_stub); + /* NOTE drow/2004-02-11: We overload the core solib trampoline code + to support MIPS16. This is a bad thing. Make sure not to do it + if we have an OS ABI that actually supports shared libraries, since + shared library support is more important. If we have an OS someday + that supports both shared libraries and MIPS16, we'll have to find + a better place for these. */ + if (info.osabi == GDB_OSABI_UNKNOWN) + { + set_gdbarch_in_solib_call_trampoline (gdbarch, mips_in_call_stub); + set_gdbarch_in_solib_return_trampoline (gdbarch, mips_in_return_stub); + } + + /* Hook in OS ABI-specific overrides, if they have been registered. */ + gdbarch_init_osabi (info, gdbarch); return gdbarch; } @@ -6321,17 +6043,6 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file) fprintf_unfiltered (file, "mips_dump_tdep: SET_PROC_DESC_IS_DUMMY = function?\n"); fprintf_unfiltered (file, - "mips_dump_tdep: SIGFRAME_BASE = %d\n", SIGFRAME_BASE); - fprintf_unfiltered (file, - "mips_dump_tdep: SIGFRAME_FPREGSAVE_OFF = %d\n", - SIGFRAME_FPREGSAVE_OFF); - fprintf_unfiltered (file, - "mips_dump_tdep: SIGFRAME_PC_OFF = %d\n", - SIGFRAME_PC_OFF); - fprintf_unfiltered (file, - "mips_dump_tdep: SIGFRAME_REGSAVE_OFF = %d\n", - SIGFRAME_REGSAVE_OFF); - fprintf_unfiltered (file, "mips_dump_tdep: SKIP_TRAMPOLINE_CODE # %s\n", XSTRING (SKIP_TRAMPOLINE_CODE (PC))); fprintf_unfiltered (file, |