diff options
author | John Gilmore <gnu@cygnus> | 1991-08-14 00:00:25 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1991-08-14 00:00:25 +0000 |
commit | 5259796be2dcfdbb88a281cab9030d3f37c3bacb (patch) | |
tree | 33f4fc155f99dda448a3a29cfa2b19700b243270 /gdb/sparc-tdep.c | |
parent | 39c52804dfd59b6d75331ff51abfba02460c5a7a (diff) | |
download | gdb-5259796be2dcfdbb88a281cab9030d3f37c3bacb.zip gdb-5259796be2dcfdbb88a281cab9030d3f37c3bacb.tar.gz gdb-5259796be2dcfdbb88a281cab9030d3f37c3bacb.tar.bz2 |
* blockframe.c (frameless_look_for_prologue): Speed up by
calling SKIP_PROLOGUE_FRAMELESS_P if it's defined.
* tm-sparc.h (SKIP_PROLOGUE, SKIP_PROLOGUE_FRAMELESS_P):
Define two variants, one faster.
* sparc-tdep.c (sparc_frame_chain): Use target_read_memory
and return zero, rather than giving an error.
(setup_arbitrary_frame): Initialize the PC in the new frame.
(skip_prologue): Add a second arg saying whether we're just
checking for a frameless function or not.
Diffstat (limited to 'gdb/sparc-tdep.c')
-rw-r--r-- | gdb/sparc-tdep.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c index a59986d..b718e4c 100644 --- a/gdb/sparc-tdep.c +++ b/gdb/sparc-tdep.c @@ -5,19 +5,19 @@ This file is part of GDB. -GDB is free software; you can redistribute it and/or modify +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 1, or (at your option) -any later version. +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. -GDB is distributed in the hope that it will be useful, +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 GDB; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdio.h> #include "defs.h" @@ -127,9 +127,13 @@ sparc_frame_chain (thisframe) FRAME thisframe; { CORE_ADDR retval; - read_memory ((CORE_ADDR)&(((struct rwindow *)(thisframe->frame))->rw_in[6]), + int err; + err = target_read_memory + ((CORE_ADDR)&(((struct rwindow *)(thisframe->frame))->rw_in[6]), &retval, sizeof (CORE_ADDR)); + if (err) + return 0; return retval; } @@ -186,7 +190,7 @@ setup_arbitrary_frame (frame, stack) fatal ("internal: create_new_frame returned invalid frame id"); fid->bottom = stack; - + fid->pc = FRAME_SAVED_PC (fid); return fid; } @@ -286,11 +290,18 @@ do_restore_insn () restore_inferior_status (&inf_status); } -/* This routine should be more specific in it's actions; making sure +/* Given a pc value, skip it forward past the function prologue by + disassembling instructions that appear to be a prologue. + + If FRAMELESS_P is set, we are only testing to see if the function + is frameless. This allows a quicker answer. + + This routine should be more specific in its actions; making sure that it uses the same register in the initial prologue section. */ CORE_ADDR -skip_prologue (start_pc) +skip_prologue (start_pc, frameless_p) CORE_ADDR start_pc; + int frameless_p; { union { @@ -315,8 +326,6 @@ skip_prologue (start_pc) } x; int dest = -1; CORE_ADDR pc = start_pc; - /* Have we found a save instruction? */ - int found_save = 0; x.i = read_memory_integer (pc, 4); @@ -345,10 +354,16 @@ skip_prologue (start_pc) as there isn't any sign extension). */ if (x.add.op == 2 && (x.add.op3 ^ 32) == 28) { - found_save = 1; pc += 4; + if (frameless_p) /* If the save is all we care about, */ + return pc; /* return before doing more work */ x.i = read_memory_integer (pc, 4); } + else + { + /* Without a save instruction, it's not a prologue. */ + return start_pc; + } /* Now we need to recognize stores into the frame from the input registers. This recognizes all non alternate stores of input @@ -365,11 +380,7 @@ skip_prologue (start_pc) pc += 4; x.i = read_memory_integer (pc, 4); } - if (found_save) - return pc; - else - /* Without a save instruction, it's not a prologue. */ - return start_pc; + return pc; } /* Check instruction at ADDR to see if it is an annulled branch. |