xref: /openbsd-src/gnu/usr.bin/binutils/gdb/frame.c (revision 87cf858720881a7186d0b2629ad7019b8e9760e4)
1b725ae77Skettenis /* Cache and manage frames for GDB, the GNU debugger.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1986, 1987, 1989, 1991, 1994, 1995, 1996, 1998, 2000,
4b725ae77Skettenis    2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5b725ae77Skettenis 
6b725ae77Skettenis    This file is part of GDB.
7b725ae77Skettenis 
8b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis    it under the terms of the GNU General Public License as published by
10b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis    (at your option) any later version.
12b725ae77Skettenis 
13b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b725ae77Skettenis    GNU General Public License for more details.
17b725ae77Skettenis 
18b725ae77Skettenis    You should have received a copy of the GNU General Public License
19b725ae77Skettenis    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23b725ae77Skettenis #include "defs.h"
24b725ae77Skettenis #include "frame.h"
25b725ae77Skettenis #include "target.h"
26b725ae77Skettenis #include "value.h"
27b725ae77Skettenis #include "inferior.h"	/* for inferior_ptid */
28b725ae77Skettenis #include "regcache.h"
29b725ae77Skettenis #include "gdb_assert.h"
30b725ae77Skettenis #include "gdb_string.h"
31b725ae77Skettenis #include "user-regs.h"
32b725ae77Skettenis #include "gdb_obstack.h"
33b725ae77Skettenis #include "dummy-frame.h"
34b725ae77Skettenis #include "sentinel-frame.h"
35b725ae77Skettenis #include "gdbcore.h"
36b725ae77Skettenis #include "annotate.h"
37b725ae77Skettenis #include "language.h"
38b725ae77Skettenis #include "frame-unwind.h"
39b725ae77Skettenis #include "frame-base.h"
40b725ae77Skettenis #include "command.h"
41b725ae77Skettenis #include "gdbcmd.h"
4263addd46Skettenis #include "observer.h"
4363addd46Skettenis #include "objfiles.h"
4463addd46Skettenis 
4563addd46Skettenis static struct frame_info *get_prev_frame_1 (struct frame_info *this_frame);
46b725ae77Skettenis 
47b725ae77Skettenis /* We keep a cache of stack frames, each of which is a "struct
48b725ae77Skettenis    frame_info".  The innermost one gets allocated (in
49b725ae77Skettenis    wait_for_inferior) each time the inferior stops; current_frame
50b725ae77Skettenis    points to it.  Additional frames get allocated (in get_prev_frame)
51b725ae77Skettenis    as needed, and are chained through the next and prev fields.  Any
52b725ae77Skettenis    time that the frame cache becomes invalid (most notably when we
53b725ae77Skettenis    execute something, but also if we change how we interpret the
54b725ae77Skettenis    frames (e.g. "set heuristic-fence-post" in mips-tdep.c, or anything
55b725ae77Skettenis    which reads new symbols)), we should call reinit_frame_cache.  */
56b725ae77Skettenis 
57b725ae77Skettenis struct frame_info
58b725ae77Skettenis {
59b725ae77Skettenis   /* Level of this frame.  The inner-most (youngest) frame is at level
60b725ae77Skettenis      0.  As you move towards the outer-most (oldest) frame, the level
61b725ae77Skettenis      increases.  This is a cached value.  It could just as easily be
62b725ae77Skettenis      computed by counting back from the selected frame to the inner
63b725ae77Skettenis      most frame.  */
6463addd46Skettenis   /* NOTE: cagney/2002-04-05: Perhaps a level of ``-1'' should be
65b725ae77Skettenis      reserved to indicate a bogus frame - one that has been created
66b725ae77Skettenis      just to keep GDB happy (GDB always needs a frame).  For the
67b725ae77Skettenis      moment leave this as speculation.  */
68b725ae77Skettenis   int level;
69b725ae77Skettenis 
70b725ae77Skettenis   /* The frame's low-level unwinder and corresponding cache.  The
71b725ae77Skettenis      low-level unwinder is responsible for unwinding register values
72b725ae77Skettenis      for the previous frame.  The low-level unwind methods are
7363addd46Skettenis      selected based on the presence, or otherwise, of register unwind
74b725ae77Skettenis      information such as CFI.  */
75b725ae77Skettenis   void *prologue_cache;
76b725ae77Skettenis   const struct frame_unwind *unwind;
77b725ae77Skettenis 
78b725ae77Skettenis   /* Cached copy of the previous frame's resume address.  */
79b725ae77Skettenis   struct {
80b725ae77Skettenis     int p;
81b725ae77Skettenis     CORE_ADDR value;
82b725ae77Skettenis   } prev_pc;
83b725ae77Skettenis 
84b725ae77Skettenis   /* Cached copy of the previous frame's function address.  */
85b725ae77Skettenis   struct
86b725ae77Skettenis   {
87b725ae77Skettenis     CORE_ADDR addr;
88b725ae77Skettenis     int p;
89b725ae77Skettenis   } prev_func;
90b725ae77Skettenis 
91b725ae77Skettenis   /* This frame's ID.  */
92b725ae77Skettenis   struct
93b725ae77Skettenis   {
94b725ae77Skettenis     int p;
95b725ae77Skettenis     struct frame_id value;
96b725ae77Skettenis   } this_id;
97b725ae77Skettenis 
98b725ae77Skettenis   /* The frame's high-level base methods, and corresponding cache.
99b725ae77Skettenis      The high level base methods are selected based on the frame's
100b725ae77Skettenis      debug info.  */
101b725ae77Skettenis   const struct frame_base *base;
102b725ae77Skettenis   void *base_cache;
103b725ae77Skettenis 
104b725ae77Skettenis   /* Pointers to the next (down, inner, younger) and previous (up,
105b725ae77Skettenis      outer, older) frame_info's in the frame cache.  */
106b725ae77Skettenis   struct frame_info *next; /* down, inner, younger */
107b725ae77Skettenis   int prev_p;
108b725ae77Skettenis   struct frame_info *prev; /* up, outer, older */
109b725ae77Skettenis };
110b725ae77Skettenis 
111b725ae77Skettenis /* Flag to control debugging.  */
112b725ae77Skettenis 
113b725ae77Skettenis static int frame_debug;
114b725ae77Skettenis 
115b725ae77Skettenis /* Flag to indicate whether backtraces should stop at main et.al.  */
116b725ae77Skettenis 
117b725ae77Skettenis static int backtrace_past_main;
118b725ae77Skettenis static unsigned int backtrace_limit = UINT_MAX;
119b725ae77Skettenis 
12063addd46Skettenis static void
fprint_field(struct ui_file * file,const char * name,int p,CORE_ADDR addr)12163addd46Skettenis fprint_field (struct ui_file *file, const char *name, int p, CORE_ADDR addr)
12263addd46Skettenis {
12363addd46Skettenis   if (p)
12463addd46Skettenis     fprintf_unfiltered (file, "%s=0x%s", name, paddr_nz (addr));
12563addd46Skettenis   else
12663addd46Skettenis     fprintf_unfiltered (file, "!%s", name);
12763addd46Skettenis }
128b725ae77Skettenis 
129b725ae77Skettenis void
fprint_frame_id(struct ui_file * file,struct frame_id id)130b725ae77Skettenis fprint_frame_id (struct ui_file *file, struct frame_id id)
131b725ae77Skettenis {
13263addd46Skettenis   fprintf_unfiltered (file, "{");
13363addd46Skettenis   fprint_field (file, "stack", id.stack_addr_p, id.stack_addr);
13463addd46Skettenis   fprintf_unfiltered (file, ",");
13563addd46Skettenis   fprint_field (file, "code", id.code_addr_p, id.code_addr);
13663addd46Skettenis   fprintf_unfiltered (file, ",");
13763addd46Skettenis   fprint_field (file, "special", id.special_addr_p, id.special_addr);
13863addd46Skettenis   fprintf_unfiltered (file, "}");
139b725ae77Skettenis }
140b725ae77Skettenis 
141b725ae77Skettenis static void
fprint_frame_type(struct ui_file * file,enum frame_type type)142b725ae77Skettenis fprint_frame_type (struct ui_file *file, enum frame_type type)
143b725ae77Skettenis {
144b725ae77Skettenis   switch (type)
145b725ae77Skettenis     {
146b725ae77Skettenis     case NORMAL_FRAME:
147b725ae77Skettenis       fprintf_unfiltered (file, "NORMAL_FRAME");
148b725ae77Skettenis       return;
149b725ae77Skettenis     case DUMMY_FRAME:
150b725ae77Skettenis       fprintf_unfiltered (file, "DUMMY_FRAME");
151b725ae77Skettenis       return;
152b725ae77Skettenis     case SIGTRAMP_FRAME:
153b725ae77Skettenis       fprintf_unfiltered (file, "SIGTRAMP_FRAME");
154b725ae77Skettenis       return;
155b725ae77Skettenis     default:
156b725ae77Skettenis       fprintf_unfiltered (file, "<unknown type>");
157b725ae77Skettenis       return;
158b725ae77Skettenis     };
159b725ae77Skettenis }
160b725ae77Skettenis 
161b725ae77Skettenis static void
fprint_frame(struct ui_file * file,struct frame_info * fi)162b725ae77Skettenis fprint_frame (struct ui_file *file, struct frame_info *fi)
163b725ae77Skettenis {
164b725ae77Skettenis   if (fi == NULL)
165b725ae77Skettenis     {
166b725ae77Skettenis       fprintf_unfiltered (file, "<NULL frame>");
167b725ae77Skettenis       return;
168b725ae77Skettenis     }
169b725ae77Skettenis   fprintf_unfiltered (file, "{");
170b725ae77Skettenis   fprintf_unfiltered (file, "level=%d", fi->level);
171b725ae77Skettenis   fprintf_unfiltered (file, ",");
172b725ae77Skettenis   fprintf_unfiltered (file, "type=");
17363addd46Skettenis   if (fi->unwind != NULL)
17463addd46Skettenis     fprint_frame_type (file, fi->unwind->type);
17563addd46Skettenis   else
17663addd46Skettenis     fprintf_unfiltered (file, "<unknown>");
177b725ae77Skettenis   fprintf_unfiltered (file, ",");
178b725ae77Skettenis   fprintf_unfiltered (file, "unwind=");
179b725ae77Skettenis   if (fi->unwind != NULL)
180b725ae77Skettenis     gdb_print_host_address (fi->unwind, file);
181b725ae77Skettenis   else
182b725ae77Skettenis     fprintf_unfiltered (file, "<unknown>");
183b725ae77Skettenis   fprintf_unfiltered (file, ",");
184b725ae77Skettenis   fprintf_unfiltered (file, "pc=");
185b725ae77Skettenis   if (fi->next != NULL && fi->next->prev_pc.p)
186b725ae77Skettenis     fprintf_unfiltered (file, "0x%s", paddr_nz (fi->next->prev_pc.value));
187b725ae77Skettenis   else
188b725ae77Skettenis     fprintf_unfiltered (file, "<unknown>");
189b725ae77Skettenis   fprintf_unfiltered (file, ",");
190b725ae77Skettenis   fprintf_unfiltered (file, "id=");
191b725ae77Skettenis   if (fi->this_id.p)
192b725ae77Skettenis     fprint_frame_id (file, fi->this_id.value);
193b725ae77Skettenis   else
194b725ae77Skettenis     fprintf_unfiltered (file, "<unknown>");
195b725ae77Skettenis   fprintf_unfiltered (file, ",");
196b725ae77Skettenis   fprintf_unfiltered (file, "func=");
197b725ae77Skettenis   if (fi->next != NULL && fi->next->prev_func.p)
198b725ae77Skettenis     fprintf_unfiltered (file, "0x%s", paddr_nz (fi->next->prev_func.addr));
199b725ae77Skettenis   else
200b725ae77Skettenis     fprintf_unfiltered (file, "<unknown>");
201b725ae77Skettenis   fprintf_unfiltered (file, "}");
202b725ae77Skettenis }
203b725ae77Skettenis 
204b725ae77Skettenis /* Return a frame uniq ID that can be used to, later, re-find the
205b725ae77Skettenis    frame.  */
206b725ae77Skettenis 
207b725ae77Skettenis struct frame_id
get_frame_id(struct frame_info * fi)208b725ae77Skettenis get_frame_id (struct frame_info *fi)
209b725ae77Skettenis {
210b725ae77Skettenis   if (fi == NULL)
211b725ae77Skettenis     {
212b725ae77Skettenis       return null_frame_id;
213b725ae77Skettenis     }
214b725ae77Skettenis   if (!fi->this_id.p)
215b725ae77Skettenis     {
216b725ae77Skettenis       if (frame_debug)
217b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "{ get_frame_id (fi=%d) ",
218b725ae77Skettenis 			    fi->level);
219b725ae77Skettenis       /* Find the unwinder.  */
220b725ae77Skettenis       if (fi->unwind == NULL)
22163addd46Skettenis 	fi->unwind = frame_unwind_find_by_frame (fi->next,
22263addd46Skettenis 						 &fi->prologue_cache);
223b725ae77Skettenis       /* Find THIS frame's ID.  */
224b725ae77Skettenis       fi->unwind->this_id (fi->next, &fi->prologue_cache, &fi->this_id.value);
225b725ae77Skettenis       fi->this_id.p = 1;
226b725ae77Skettenis       if (frame_debug)
227b725ae77Skettenis 	{
228b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, "-> ");
229b725ae77Skettenis 	  fprint_frame_id (gdb_stdlog, fi->this_id.value);
230b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, " }\n");
231b725ae77Skettenis 	}
232b725ae77Skettenis     }
233b725ae77Skettenis   return fi->this_id.value;
234b725ae77Skettenis }
235b725ae77Skettenis 
23663addd46Skettenis struct frame_id
frame_unwind_id(struct frame_info * next_frame)23763addd46Skettenis frame_unwind_id (struct frame_info *next_frame)
23863addd46Skettenis {
23963addd46Skettenis   /* Use prev_frame, and not get_prev_frame.  The latter will truncate
24063addd46Skettenis      the frame chain, leading to this function unintentionally
24163addd46Skettenis      returning a null_frame_id (e.g., when a caller requests the frame
24263addd46Skettenis      ID of "main()"s caller.  */
24363addd46Skettenis   return get_frame_id (get_prev_frame_1 (next_frame));
24463addd46Skettenis }
24563addd46Skettenis 
246b725ae77Skettenis const struct frame_id null_frame_id; /* All zeros.  */
247b725ae77Skettenis 
248b725ae77Skettenis struct frame_id
frame_id_build_special(CORE_ADDR stack_addr,CORE_ADDR code_addr,CORE_ADDR special_addr)249b725ae77Skettenis frame_id_build_special (CORE_ADDR stack_addr, CORE_ADDR code_addr,
250b725ae77Skettenis                         CORE_ADDR special_addr)
251b725ae77Skettenis {
25263addd46Skettenis   struct frame_id id = null_frame_id;
253b725ae77Skettenis   id.stack_addr = stack_addr;
25463addd46Skettenis   id.stack_addr_p = 1;
255b725ae77Skettenis   id.code_addr = code_addr;
25663addd46Skettenis   id.code_addr_p = 1;
257b725ae77Skettenis   id.special_addr = special_addr;
25863addd46Skettenis   id.special_addr_p = 1;
259b725ae77Skettenis   return id;
260b725ae77Skettenis }
261b725ae77Skettenis 
262b725ae77Skettenis struct frame_id
frame_id_build(CORE_ADDR stack_addr,CORE_ADDR code_addr)263b725ae77Skettenis frame_id_build (CORE_ADDR stack_addr, CORE_ADDR code_addr)
264b725ae77Skettenis {
26563addd46Skettenis   struct frame_id id = null_frame_id;
26663addd46Skettenis   id.stack_addr = stack_addr;
26763addd46Skettenis   id.stack_addr_p = 1;
26863addd46Skettenis   id.code_addr = code_addr;
26963addd46Skettenis   id.code_addr_p = 1;
27063addd46Skettenis   return id;
27163addd46Skettenis }
27263addd46Skettenis 
27363addd46Skettenis struct frame_id
frame_id_build_wild(CORE_ADDR stack_addr)27463addd46Skettenis frame_id_build_wild (CORE_ADDR stack_addr)
27563addd46Skettenis {
27663addd46Skettenis   struct frame_id id = null_frame_id;
27763addd46Skettenis   id.stack_addr = stack_addr;
27863addd46Skettenis   id.stack_addr_p = 1;
27963addd46Skettenis   return id;
280b725ae77Skettenis }
281b725ae77Skettenis 
282b725ae77Skettenis int
frame_id_p(struct frame_id l)283b725ae77Skettenis frame_id_p (struct frame_id l)
284b725ae77Skettenis {
285b725ae77Skettenis   int p;
28663addd46Skettenis   /* The frame is valid iff it has a valid stack address.  */
28763addd46Skettenis   p = l.stack_addr_p;
288b725ae77Skettenis   if (frame_debug)
289b725ae77Skettenis     {
290b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "{ frame_id_p (l=");
291b725ae77Skettenis       fprint_frame_id (gdb_stdlog, l);
292b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, ") -> %d }\n", p);
293b725ae77Skettenis     }
294b725ae77Skettenis   return p;
295b725ae77Skettenis }
296b725ae77Skettenis 
297b725ae77Skettenis int
frame_id_eq(struct frame_id l,struct frame_id r)298b725ae77Skettenis frame_id_eq (struct frame_id l, struct frame_id r)
299b725ae77Skettenis {
300b725ae77Skettenis   int eq;
30163addd46Skettenis   if (!l.stack_addr_p || !r.stack_addr_p)
30263addd46Skettenis     /* Like a NaN, if either ID is invalid, the result is false.
30363addd46Skettenis        Note that a frame ID is invalid iff it is the null frame ID.  */
304b725ae77Skettenis     eq = 0;
305b725ae77Skettenis   else if (l.stack_addr != r.stack_addr)
306b725ae77Skettenis     /* If .stack addresses are different, the frames are different.  */
307b725ae77Skettenis     eq = 0;
30863addd46Skettenis   else if (!l.code_addr_p || !r.code_addr_p)
30963addd46Skettenis     /* An invalid code addr is a wild card, always succeed.  */
310b725ae77Skettenis     eq = 1;
311b725ae77Skettenis   else if (l.code_addr != r.code_addr)
312b725ae77Skettenis     /* If .code addresses are different, the frames are different.  */
313b725ae77Skettenis     eq = 0;
31463addd46Skettenis   else if (!l.special_addr_p || !r.special_addr_p)
31563addd46Skettenis     /* An invalid special addr is a wild card (or unused), always succeed.  */
316b725ae77Skettenis     eq = 1;
317b725ae77Skettenis   else if (l.special_addr == r.special_addr)
318b725ae77Skettenis     /* Frames are equal.  */
319b725ae77Skettenis     eq = 1;
320b725ae77Skettenis   else
321b725ae77Skettenis     /* No luck.  */
322b725ae77Skettenis     eq = 0;
323b725ae77Skettenis   if (frame_debug)
324b725ae77Skettenis     {
325b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "{ frame_id_eq (l=");
326b725ae77Skettenis       fprint_frame_id (gdb_stdlog, l);
327b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, ",r=");
328b725ae77Skettenis       fprint_frame_id (gdb_stdlog, r);
329b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, ") -> %d }\n", eq);
330b725ae77Skettenis     }
331b725ae77Skettenis   return eq;
332b725ae77Skettenis }
333b725ae77Skettenis 
334b725ae77Skettenis int
frame_id_inner(struct frame_id l,struct frame_id r)335b725ae77Skettenis frame_id_inner (struct frame_id l, struct frame_id r)
336b725ae77Skettenis {
337b725ae77Skettenis   int inner;
33863addd46Skettenis   if (!l.stack_addr_p || !r.stack_addr_p)
339b725ae77Skettenis     /* Like NaN, any operation involving an invalid ID always fails.  */
340b725ae77Skettenis     inner = 0;
341b725ae77Skettenis   else
342b725ae77Skettenis     /* Only return non-zero when strictly inner than.  Note that, per
343b725ae77Skettenis        comment in "frame.h", there is some fuzz here.  Frameless
344b725ae77Skettenis        functions are not strictly inner than (same .stack but
345b725ae77Skettenis        different .code and/or .special address).  */
346b725ae77Skettenis     inner = INNER_THAN (l.stack_addr, r.stack_addr);
347b725ae77Skettenis   if (frame_debug)
348b725ae77Skettenis     {
349b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "{ frame_id_inner (l=");
350b725ae77Skettenis       fprint_frame_id (gdb_stdlog, l);
351b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, ",r=");
352b725ae77Skettenis       fprint_frame_id (gdb_stdlog, r);
353b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, ") -> %d }\n", inner);
354b725ae77Skettenis     }
355b725ae77Skettenis   return inner;
356b725ae77Skettenis }
357b725ae77Skettenis 
358b725ae77Skettenis struct frame_info *
frame_find_by_id(struct frame_id id)359b725ae77Skettenis frame_find_by_id (struct frame_id id)
360b725ae77Skettenis {
361b725ae77Skettenis   struct frame_info *frame;
362b725ae77Skettenis 
363b725ae77Skettenis   /* ZERO denotes the null frame, let the caller decide what to do
364b725ae77Skettenis      about it.  Should it instead return get_current_frame()?  */
365b725ae77Skettenis   if (!frame_id_p (id))
366b725ae77Skettenis     return NULL;
367b725ae77Skettenis 
368b725ae77Skettenis   for (frame = get_current_frame ();
369b725ae77Skettenis        frame != NULL;
370b725ae77Skettenis        frame = get_prev_frame (frame))
371b725ae77Skettenis     {
372b725ae77Skettenis       struct frame_id this = get_frame_id (frame);
373b725ae77Skettenis       if (frame_id_eq (id, this))
374b725ae77Skettenis 	/* An exact match.  */
375b725ae77Skettenis 	return frame;
376b725ae77Skettenis       if (frame_id_inner (id, this))
377b725ae77Skettenis 	/* Gone to far.  */
378b725ae77Skettenis 	return NULL;
37963addd46Skettenis       /* Either we're not yet gone far enough out along the frame
38063addd46Skettenis          chain (inner(this,id)), or we're comparing frameless functions
381b725ae77Skettenis          (same .base, different .func, no test available).  Struggle
382b725ae77Skettenis          on until we've definitly gone to far.  */
383b725ae77Skettenis     }
384b725ae77Skettenis   return NULL;
385b725ae77Skettenis }
386b725ae77Skettenis 
387b725ae77Skettenis CORE_ADDR
frame_pc_unwind(struct frame_info * this_frame)388b725ae77Skettenis frame_pc_unwind (struct frame_info *this_frame)
389b725ae77Skettenis {
390b725ae77Skettenis   if (!this_frame->prev_pc.p)
391b725ae77Skettenis     {
392b725ae77Skettenis       CORE_ADDR pc;
393b725ae77Skettenis       if (gdbarch_unwind_pc_p (current_gdbarch))
394b725ae77Skettenis 	{
395b725ae77Skettenis 	  /* The right way.  The `pure' way.  The one true way.  This
396b725ae77Skettenis 	     method depends solely on the register-unwind code to
397b725ae77Skettenis 	     determine the value of registers in THIS frame, and hence
398b725ae77Skettenis 	     the value of this frame's PC (resume address).  A typical
399b725ae77Skettenis 	     implementation is no more than:
400b725ae77Skettenis 
401b725ae77Skettenis 	     frame_unwind_register (this_frame, ISA_PC_REGNUM, buf);
402b725ae77Skettenis 	     return extract_unsigned_integer (buf, size of ISA_PC_REGNUM);
403b725ae77Skettenis 
404b725ae77Skettenis 	     Note: this method is very heavily dependent on a correct
405b725ae77Skettenis 	     register-unwind implementation, it pays to fix that
406b725ae77Skettenis 	     method first; this method is frame type agnostic, since
407b725ae77Skettenis 	     it only deals with register values, it works with any
408b725ae77Skettenis 	     frame.  This is all in stark contrast to the old
409b725ae77Skettenis 	     FRAME_SAVED_PC which would try to directly handle all the
410b725ae77Skettenis 	     different ways that a PC could be unwound.  */
411b725ae77Skettenis 	  pc = gdbarch_unwind_pc (current_gdbarch, this_frame);
412b725ae77Skettenis 	}
413b725ae77Skettenis       else if (this_frame->level < 0)
414b725ae77Skettenis 	{
41563addd46Skettenis 	  /* FIXME: cagney/2003-03-06: Old code and a sentinel
416b725ae77Skettenis              frame.  Do like was always done.  Fetch the PC's value
41763addd46Skettenis              directly from the global registers array (via read_pc).
418b725ae77Skettenis              This assumes that this frame belongs to the current
419b725ae77Skettenis              global register cache.  The assumption is dangerous.  */
420b725ae77Skettenis 	  pc = read_pc ();
421b725ae77Skettenis 	}
422b725ae77Skettenis       else
423b725ae77Skettenis 	internal_error (__FILE__, __LINE__, "No gdbarch_unwind_pc method");
424b725ae77Skettenis       this_frame->prev_pc.value = pc;
425b725ae77Skettenis       this_frame->prev_pc.p = 1;
426b725ae77Skettenis       if (frame_debug)
427b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog,
428b725ae77Skettenis 			    "{ frame_pc_unwind (this_frame=%d) -> 0x%s }\n",
429b725ae77Skettenis 			    this_frame->level,
430b725ae77Skettenis 			    paddr_nz (this_frame->prev_pc.value));
431b725ae77Skettenis     }
432b725ae77Skettenis   return this_frame->prev_pc.value;
433b725ae77Skettenis }
434b725ae77Skettenis 
435b725ae77Skettenis CORE_ADDR
frame_func_unwind(struct frame_info * fi)436b725ae77Skettenis frame_func_unwind (struct frame_info *fi)
437b725ae77Skettenis {
438b725ae77Skettenis   if (!fi->prev_func.p)
439b725ae77Skettenis     {
440b725ae77Skettenis       /* Make certain that this, and not the adjacent, function is
441b725ae77Skettenis          found.  */
442b725ae77Skettenis       CORE_ADDR addr_in_block = frame_unwind_address_in_block (fi);
443b725ae77Skettenis       fi->prev_func.p = 1;
444b725ae77Skettenis       fi->prev_func.addr = get_pc_function_start (addr_in_block);
445b725ae77Skettenis       if (frame_debug)
446b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog,
447b725ae77Skettenis 			    "{ frame_func_unwind (fi=%d) -> 0x%s }\n",
448b725ae77Skettenis 			    fi->level, paddr_nz (fi->prev_func.addr));
449b725ae77Skettenis     }
450b725ae77Skettenis   return fi->prev_func.addr;
451b725ae77Skettenis }
452b725ae77Skettenis 
453b725ae77Skettenis CORE_ADDR
get_frame_func(struct frame_info * fi)454b725ae77Skettenis get_frame_func (struct frame_info *fi)
455b725ae77Skettenis {
456b725ae77Skettenis   return frame_func_unwind (fi->next);
457b725ae77Skettenis }
458b725ae77Skettenis 
459b725ae77Skettenis static int
do_frame_register_read(void * src,int regnum,void * buf)46063addd46Skettenis do_frame_register_read (void *src, int regnum, void *buf)
461b725ae77Skettenis {
46263addd46Skettenis   frame_register_read (src, regnum, buf);
463b725ae77Skettenis   return 1;
464b725ae77Skettenis }
465b725ae77Skettenis 
46663addd46Skettenis struct regcache *
frame_save_as_regcache(struct frame_info * this_frame)46763addd46Skettenis frame_save_as_regcache (struct frame_info *this_frame)
46863addd46Skettenis {
46963addd46Skettenis   struct regcache *regcache = regcache_xmalloc (current_gdbarch);
47063addd46Skettenis   struct cleanup *cleanups = make_cleanup_regcache_xfree (regcache);
47163addd46Skettenis   regcache_save (regcache, do_frame_register_read, this_frame);
47263addd46Skettenis   discard_cleanups (cleanups);
47363addd46Skettenis   return regcache;
47463addd46Skettenis }
47563addd46Skettenis 
476b725ae77Skettenis void
frame_pop(struct frame_info * this_frame)477b725ae77Skettenis frame_pop (struct frame_info *this_frame)
478b725ae77Skettenis {
47963addd46Skettenis   /* Make a copy of all the register values unwound from this frame.
48063addd46Skettenis      Save them in a scratch buffer so that there isn't a race between
48163addd46Skettenis      trying to extract the old values from the current_regcache while
48263addd46Skettenis      at the same time writing new values into that same cache.  */
48363addd46Skettenis   struct regcache *scratch
48463addd46Skettenis     = frame_save_as_regcache (get_prev_frame_1 (this_frame));
485b725ae77Skettenis   struct cleanup *cleanups = make_cleanup_regcache_xfree (scratch);
48663addd46Skettenis 
487b725ae77Skettenis   /* FIXME: cagney/2003-03-16: It should be possible to tell the
48863addd46Skettenis      target's register cache that it is about to be hit with a burst
48963addd46Skettenis      register transfer and that the sequence of register writes should
49063addd46Skettenis      be batched.  The pair target_prepare_to_store() and
49163addd46Skettenis      target_store_registers() kind of suggest this functionality.
49263addd46Skettenis      Unfortunately, they don't implement it.  Their lack of a formal
49363addd46Skettenis      definition can lead to targets writing back bogus values
49463addd46Skettenis      (arguably a bug in the target code mind).  */
495b725ae77Skettenis   /* Now copy those saved registers into the current regcache.
496b725ae77Skettenis      Here, regcache_cpy() calls regcache_restore().  */
497b725ae77Skettenis   regcache_cpy (current_regcache, scratch);
498b725ae77Skettenis   do_cleanups (cleanups);
49963addd46Skettenis 
500b725ae77Skettenis   /* We've made right mess of GDB's local state, just discard
501b725ae77Skettenis      everything.  */
502b725ae77Skettenis   flush_cached_frames ();
503b725ae77Skettenis }
504b725ae77Skettenis 
505b725ae77Skettenis void
frame_register_unwind(struct frame_info * frame,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)506b725ae77Skettenis frame_register_unwind (struct frame_info *frame, int regnum,
507b725ae77Skettenis 		       int *optimizedp, enum lval_type *lvalp,
508b725ae77Skettenis 		       CORE_ADDR *addrp, int *realnump, void *bufferp)
509b725ae77Skettenis {
510b725ae77Skettenis   struct frame_unwind_cache *cache;
511b725ae77Skettenis 
512b725ae77Skettenis   if (frame_debug)
513b725ae77Skettenis     {
514b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "\
515b725ae77Skettenis { frame_register_unwind (frame=%d,regnum=%d(%s),...) ",
516b725ae77Skettenis 			  frame->level, regnum,
517b725ae77Skettenis 			  frame_map_regnum_to_name (frame, regnum));
518b725ae77Skettenis     }
519b725ae77Skettenis 
520b725ae77Skettenis   /* Require all but BUFFERP to be valid.  A NULL BUFFERP indicates
521b725ae77Skettenis      that the value proper does not need to be fetched.  */
522b725ae77Skettenis   gdb_assert (optimizedp != NULL);
523b725ae77Skettenis   gdb_assert (lvalp != NULL);
524b725ae77Skettenis   gdb_assert (addrp != NULL);
525b725ae77Skettenis   gdb_assert (realnump != NULL);
526b725ae77Skettenis   /* gdb_assert (bufferp != NULL); */
527b725ae77Skettenis 
528b725ae77Skettenis   /* NOTE: cagney/2002-11-27: A program trying to unwind a NULL frame
529b725ae77Skettenis      is broken.  There is always a frame.  If there, for some reason,
53063addd46Skettenis      isn't a frame, there is some pretty busted code as it should have
531b725ae77Skettenis      detected the problem before calling here.  */
532b725ae77Skettenis   gdb_assert (frame != NULL);
533b725ae77Skettenis 
534b725ae77Skettenis   /* Find the unwinder.  */
535b725ae77Skettenis   if (frame->unwind == NULL)
53663addd46Skettenis     frame->unwind = frame_unwind_find_by_frame (frame->next,
53763addd46Skettenis 						&frame->prologue_cache);
538b725ae77Skettenis 
539b725ae77Skettenis   /* Ask this frame to unwind its register.  See comment in
54063addd46Skettenis      "frame-unwind.h" for why NEXT frame and this unwind cache are
541b725ae77Skettenis      passed in.  */
542b725ae77Skettenis   frame->unwind->prev_register (frame->next, &frame->prologue_cache, regnum,
543b725ae77Skettenis 				optimizedp, lvalp, addrp, realnump, bufferp);
544b725ae77Skettenis 
545b725ae77Skettenis   if (frame_debug)
546b725ae77Skettenis     {
547b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "->");
548b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " *optimizedp=%d", (*optimizedp));
549b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " *lvalp=%d", (int) (*lvalp));
550b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " *addrp=0x%s", paddr_nz ((*addrp)));
551b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " *bufferp=");
552b725ae77Skettenis       if (bufferp == NULL)
553b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "<NULL>");
554b725ae77Skettenis       else
555b725ae77Skettenis 	{
556b725ae77Skettenis 	  int i;
557b725ae77Skettenis 	  const unsigned char *buf = bufferp;
558b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, "[");
559b725ae77Skettenis 	  for (i = 0; i < register_size (current_gdbarch, regnum); i++)
560b725ae77Skettenis 	    fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]);
561b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, "]");
562b725ae77Skettenis 	}
563b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " }\n");
564b725ae77Skettenis     }
565b725ae77Skettenis }
566b725ae77Skettenis 
567b725ae77Skettenis void
frame_register(struct frame_info * frame,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)568b725ae77Skettenis frame_register (struct frame_info *frame, int regnum,
569b725ae77Skettenis 		int *optimizedp, enum lval_type *lvalp,
570b725ae77Skettenis 		CORE_ADDR *addrp, int *realnump, void *bufferp)
571b725ae77Skettenis {
572b725ae77Skettenis   /* Require all but BUFFERP to be valid.  A NULL BUFFERP indicates
573b725ae77Skettenis      that the value proper does not need to be fetched.  */
574b725ae77Skettenis   gdb_assert (optimizedp != NULL);
575b725ae77Skettenis   gdb_assert (lvalp != NULL);
576b725ae77Skettenis   gdb_assert (addrp != NULL);
577b725ae77Skettenis   gdb_assert (realnump != NULL);
578b725ae77Skettenis   /* gdb_assert (bufferp != NULL); */
579b725ae77Skettenis 
580b725ae77Skettenis   /* Obtain the register value by unwinding the register from the next
581b725ae77Skettenis      (more inner frame).  */
582b725ae77Skettenis   gdb_assert (frame != NULL && frame->next != NULL);
583b725ae77Skettenis   frame_register_unwind (frame->next, regnum, optimizedp, lvalp, addrp,
584b725ae77Skettenis 			 realnump, bufferp);
585b725ae77Skettenis }
586b725ae77Skettenis 
587b725ae77Skettenis void
frame_unwind_register(struct frame_info * frame,int regnum,void * buf)588b725ae77Skettenis frame_unwind_register (struct frame_info *frame, int regnum, void *buf)
589b725ae77Skettenis {
590b725ae77Skettenis   int optimized;
591b725ae77Skettenis   CORE_ADDR addr;
592b725ae77Skettenis   int realnum;
593b725ae77Skettenis   enum lval_type lval;
594b725ae77Skettenis   frame_register_unwind (frame, regnum, &optimized, &lval, &addr,
595b725ae77Skettenis 			 &realnum, buf);
596b725ae77Skettenis }
597b725ae77Skettenis 
598b725ae77Skettenis void
get_frame_register(struct frame_info * frame,int regnum,void * buf)599b725ae77Skettenis get_frame_register (struct frame_info *frame,
600b725ae77Skettenis 		    int regnum, void *buf)
601b725ae77Skettenis {
602b725ae77Skettenis   frame_unwind_register (frame->next, regnum, buf);
603b725ae77Skettenis }
604b725ae77Skettenis 
605b725ae77Skettenis LONGEST
frame_unwind_register_signed(struct frame_info * frame,int regnum)606b725ae77Skettenis frame_unwind_register_signed (struct frame_info *frame, int regnum)
607b725ae77Skettenis {
608b725ae77Skettenis   char buf[MAX_REGISTER_SIZE];
609b725ae77Skettenis   frame_unwind_register (frame, regnum, buf);
61063addd46Skettenis   return extract_signed_integer (buf, register_size (get_frame_arch (frame),
61163addd46Skettenis 						     regnum));
612b725ae77Skettenis }
613b725ae77Skettenis 
614b725ae77Skettenis LONGEST
get_frame_register_signed(struct frame_info * frame,int regnum)615b725ae77Skettenis get_frame_register_signed (struct frame_info *frame, int regnum)
616b725ae77Skettenis {
617b725ae77Skettenis   return frame_unwind_register_signed (frame->next, regnum);
618b725ae77Skettenis }
619b725ae77Skettenis 
620b725ae77Skettenis ULONGEST
frame_unwind_register_unsigned(struct frame_info * frame,int regnum)621b725ae77Skettenis frame_unwind_register_unsigned (struct frame_info *frame, int regnum)
622b725ae77Skettenis {
623b725ae77Skettenis   char buf[MAX_REGISTER_SIZE];
624b725ae77Skettenis   frame_unwind_register (frame, regnum, buf);
62563addd46Skettenis   return extract_unsigned_integer (buf, register_size (get_frame_arch (frame),
62663addd46Skettenis 						       regnum));
627b725ae77Skettenis }
628b725ae77Skettenis 
629b725ae77Skettenis ULONGEST
get_frame_register_unsigned(struct frame_info * frame,int regnum)630b725ae77Skettenis get_frame_register_unsigned (struct frame_info *frame, int regnum)
631b725ae77Skettenis {
632b725ae77Skettenis   return frame_unwind_register_unsigned (frame->next, regnum);
633b725ae77Skettenis }
634b725ae77Skettenis 
635b725ae77Skettenis void
frame_unwind_unsigned_register(struct frame_info * frame,int regnum,ULONGEST * val)636b725ae77Skettenis frame_unwind_unsigned_register (struct frame_info *frame, int regnum,
637b725ae77Skettenis 				ULONGEST *val)
638b725ae77Skettenis {
639b725ae77Skettenis   char buf[MAX_REGISTER_SIZE];
640b725ae77Skettenis   frame_unwind_register (frame, regnum, buf);
64163addd46Skettenis   (*val) = extract_unsigned_integer (buf,
64263addd46Skettenis 				     register_size (get_frame_arch (frame),
64363addd46Skettenis 						    regnum));
644b725ae77Skettenis }
645b725ae77Skettenis 
646b725ae77Skettenis void
put_frame_register(struct frame_info * frame,int regnum,const void * buf)647b725ae77Skettenis put_frame_register (struct frame_info *frame, int regnum, const void *buf)
648b725ae77Skettenis {
649b725ae77Skettenis   struct gdbarch *gdbarch = get_frame_arch (frame);
650b725ae77Skettenis   int realnum;
651b725ae77Skettenis   int optim;
652b725ae77Skettenis   enum lval_type lval;
653b725ae77Skettenis   CORE_ADDR addr;
654b725ae77Skettenis   frame_register (frame, regnum, &optim, &lval, &addr, &realnum, NULL);
655b725ae77Skettenis   if (optim)
656b725ae77Skettenis     error ("Attempt to assign to a value that was optimized out.");
657b725ae77Skettenis   switch (lval)
658b725ae77Skettenis     {
659b725ae77Skettenis     case lval_memory:
660b725ae77Skettenis       {
661b725ae77Skettenis 	/* FIXME: write_memory doesn't yet take constant buffers.
662b725ae77Skettenis            Arrrg!  */
663b725ae77Skettenis 	char tmp[MAX_REGISTER_SIZE];
664b725ae77Skettenis 	memcpy (tmp, buf, register_size (gdbarch, regnum));
665b725ae77Skettenis 	write_memory (addr, tmp, register_size (gdbarch, regnum));
666b725ae77Skettenis 	break;
667b725ae77Skettenis       }
668b725ae77Skettenis     case lval_register:
669b725ae77Skettenis       regcache_cooked_write (current_regcache, realnum, buf);
670b725ae77Skettenis       break;
671b725ae77Skettenis     default:
672b725ae77Skettenis       error ("Attempt to assign to an unmodifiable value.");
673b725ae77Skettenis     }
674b725ae77Skettenis }
675b725ae77Skettenis 
676b725ae77Skettenis /* frame_register_read ()
677b725ae77Skettenis 
678b725ae77Skettenis    Find and return the value of REGNUM for the specified stack frame.
67963addd46Skettenis    The number of bytes copied is REGISTER_SIZE (REGNUM).
680b725ae77Skettenis 
681b725ae77Skettenis    Returns 0 if the register value could not be found.  */
682b725ae77Skettenis 
683b725ae77Skettenis int
frame_register_read(struct frame_info * frame,int regnum,void * myaddr)684b725ae77Skettenis frame_register_read (struct frame_info *frame, int regnum, void *myaddr)
685b725ae77Skettenis {
686b725ae77Skettenis   int optimized;
687b725ae77Skettenis   enum lval_type lval;
688b725ae77Skettenis   CORE_ADDR addr;
689b725ae77Skettenis   int realnum;
690b725ae77Skettenis   frame_register (frame, regnum, &optimized, &lval, &addr, &realnum, myaddr);
691b725ae77Skettenis 
69263addd46Skettenis   /* FIXME: cagney/2002-05-15: This test is just bogus.
693b725ae77Skettenis 
694b725ae77Skettenis      It indicates that the target failed to supply a value for a
695b725ae77Skettenis      register because it was "not available" at this time.  Problem
696b725ae77Skettenis      is, the target still has the register and so get saved_register()
697b725ae77Skettenis      may be returning a value saved on the stack.  */
698b725ae77Skettenis 
699b725ae77Skettenis   if (register_cached (regnum) < 0)
700b725ae77Skettenis     return 0;			/* register value not available */
701b725ae77Skettenis 
702b725ae77Skettenis   return !optimized;
703b725ae77Skettenis }
704b725ae77Skettenis 
705b725ae77Skettenis 
706b725ae77Skettenis /* Map between a frame register number and its name.  A frame register
707b725ae77Skettenis    space is a superset of the cooked register space --- it also
708b725ae77Skettenis    includes builtin registers.  */
709b725ae77Skettenis 
710b725ae77Skettenis int
frame_map_name_to_regnum(struct frame_info * frame,const char * name,int len)711b725ae77Skettenis frame_map_name_to_regnum (struct frame_info *frame, const char *name, int len)
712b725ae77Skettenis {
713b725ae77Skettenis   return user_reg_map_name_to_regnum (get_frame_arch (frame), name, len);
714b725ae77Skettenis }
715b725ae77Skettenis 
716b725ae77Skettenis const char *
frame_map_regnum_to_name(struct frame_info * frame,int regnum)717b725ae77Skettenis frame_map_regnum_to_name (struct frame_info *frame, int regnum)
718b725ae77Skettenis {
719b725ae77Skettenis   return user_reg_map_regnum_to_name (get_frame_arch (frame), regnum);
720b725ae77Skettenis }
721b725ae77Skettenis 
722b725ae77Skettenis /* Create a sentinel frame.  */
723b725ae77Skettenis 
724b725ae77Skettenis static struct frame_info *
create_sentinel_frame(struct regcache * regcache)725b725ae77Skettenis create_sentinel_frame (struct regcache *regcache)
726b725ae77Skettenis {
727b725ae77Skettenis   struct frame_info *frame = FRAME_OBSTACK_ZALLOC (struct frame_info);
728b725ae77Skettenis   frame->level = -1;
729b725ae77Skettenis   /* Explicitly initialize the sentinel frame's cache.  Provide it
730b725ae77Skettenis      with the underlying regcache.  In the future additional
731b725ae77Skettenis      information, such as the frame's thread will be added.  */
732b725ae77Skettenis   frame->prologue_cache = sentinel_frame_cache (regcache);
733b725ae77Skettenis   /* For the moment there is only one sentinel frame implementation.  */
734b725ae77Skettenis   frame->unwind = sentinel_frame_unwind;
735b725ae77Skettenis   /* Link this frame back to itself.  The frame is self referential
736b725ae77Skettenis      (the unwound PC is the same as the pc), so make it so.  */
737b725ae77Skettenis   frame->next = frame;
738b725ae77Skettenis   /* Make the sentinel frame's ID valid, but invalid.  That way all
739b725ae77Skettenis      comparisons with it should fail.  */
740b725ae77Skettenis   frame->this_id.p = 1;
741b725ae77Skettenis   frame->this_id.value = null_frame_id;
742b725ae77Skettenis   if (frame_debug)
743b725ae77Skettenis     {
744b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "{ create_sentinel_frame (...) -> ");
745b725ae77Skettenis       fprint_frame (gdb_stdlog, frame);
746b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " }\n");
747b725ae77Skettenis     }
748b725ae77Skettenis   return frame;
749b725ae77Skettenis }
750b725ae77Skettenis 
751b725ae77Skettenis /* Info about the innermost stack frame (contents of FP register) */
752b725ae77Skettenis 
753b725ae77Skettenis static struct frame_info *current_frame;
754b725ae77Skettenis 
755b725ae77Skettenis /* Cache for frame addresses already read by gdb.  Valid only while
756b725ae77Skettenis    inferior is stopped.  Control variables for the frame cache should
757b725ae77Skettenis    be local to this module.  */
758b725ae77Skettenis 
759b725ae77Skettenis static struct obstack frame_cache_obstack;
760b725ae77Skettenis 
761b725ae77Skettenis void *
frame_obstack_zalloc(unsigned long size)762b725ae77Skettenis frame_obstack_zalloc (unsigned long size)
763b725ae77Skettenis {
764b725ae77Skettenis   void *data = obstack_alloc (&frame_cache_obstack, size);
765b725ae77Skettenis   memset (data, 0, size);
766b725ae77Skettenis   return data;
767b725ae77Skettenis }
768b725ae77Skettenis 
769b725ae77Skettenis /* Return the innermost (currently executing) stack frame.  This is
770b725ae77Skettenis    split into two functions.  The function unwind_to_current_frame()
771b725ae77Skettenis    is wrapped in catch exceptions so that, even when the unwind of the
772b725ae77Skettenis    sentinel frame fails, the function still returns a stack frame.  */
773b725ae77Skettenis 
774b725ae77Skettenis static int
unwind_to_current_frame(struct ui_out * ui_out,void * args)775b725ae77Skettenis unwind_to_current_frame (struct ui_out *ui_out, void *args)
776b725ae77Skettenis {
777b725ae77Skettenis   struct frame_info *frame = get_prev_frame (args);
77863addd46Skettenis   /* A sentinel frame can fail to unwind, e.g., because its PC value
779b725ae77Skettenis      lands in somewhere like start.  */
780b725ae77Skettenis   if (frame == NULL)
781b725ae77Skettenis     return 1;
782b725ae77Skettenis   current_frame = frame;
783b725ae77Skettenis   return 0;
784b725ae77Skettenis }
785b725ae77Skettenis 
786b725ae77Skettenis struct frame_info *
get_current_frame(void)787b725ae77Skettenis get_current_frame (void)
788b725ae77Skettenis {
789b725ae77Skettenis   /* First check, and report, the lack of registers.  Having GDB
790b725ae77Skettenis      report "No stack!" or "No memory" when the target doesn't even
791b725ae77Skettenis      have registers is very confusing.  Besides, "printcmd.exp"
792b725ae77Skettenis      explicitly checks that ``print $pc'' with no registers prints "No
793b725ae77Skettenis      registers".  */
794b725ae77Skettenis   if (!target_has_registers)
795b725ae77Skettenis     error ("No registers.");
796b725ae77Skettenis   if (!target_has_stack)
797b725ae77Skettenis     error ("No stack.");
798b725ae77Skettenis   if (!target_has_memory)
799b725ae77Skettenis     error ("No memory.");
800b725ae77Skettenis   if (current_frame == NULL)
801b725ae77Skettenis     {
802b725ae77Skettenis       struct frame_info *sentinel_frame =
803b725ae77Skettenis 	create_sentinel_frame (current_regcache);
804b725ae77Skettenis       if (catch_exceptions (uiout, unwind_to_current_frame, sentinel_frame,
805b725ae77Skettenis 			    NULL, RETURN_MASK_ERROR) != 0)
806b725ae77Skettenis 	{
807b725ae77Skettenis 	  /* Oops! Fake a current frame?  Is this useful?  It has a PC
808b725ae77Skettenis              of zero, for instance.  */
809b725ae77Skettenis 	  current_frame = sentinel_frame;
810b725ae77Skettenis 	}
811b725ae77Skettenis     }
812b725ae77Skettenis   return current_frame;
813b725ae77Skettenis }
814b725ae77Skettenis 
815b725ae77Skettenis /* The "selected" stack frame is used by default for local and arg
816b725ae77Skettenis    access.  May be zero, for no selected frame.  */
817b725ae77Skettenis 
818b725ae77Skettenis struct frame_info *deprecated_selected_frame;
819b725ae77Skettenis 
82063addd46Skettenis /* Return the selected frame.  Always non-NULL (unless there isn't an
821b725ae77Skettenis    inferior sufficient for creating a frame) in which case an error is
822b725ae77Skettenis    thrown.  */
823b725ae77Skettenis 
824b725ae77Skettenis struct frame_info *
get_selected_frame(void)825b725ae77Skettenis get_selected_frame (void)
826b725ae77Skettenis {
827b725ae77Skettenis   if (deprecated_selected_frame == NULL)
828b725ae77Skettenis     /* Hey!  Don't trust this.  It should really be re-finding the
829b725ae77Skettenis        last selected frame of the currently selected thread.  This,
830b725ae77Skettenis        though, is better than nothing.  */
831b725ae77Skettenis     select_frame (get_current_frame ());
832b725ae77Skettenis   /* There is always a frame.  */
833b725ae77Skettenis   gdb_assert (deprecated_selected_frame != NULL);
834b725ae77Skettenis   return deprecated_selected_frame;
835b725ae77Skettenis }
836b725ae77Skettenis 
83763addd46Skettenis /* This is a variant of get_selected_frame() which can be called when
838b725ae77Skettenis    the inferior does not have a frame; in that case it will return
839b725ae77Skettenis    NULL instead of calling error().  */
840b725ae77Skettenis 
841b725ae77Skettenis struct frame_info *
deprecated_safe_get_selected_frame(void)842b725ae77Skettenis deprecated_safe_get_selected_frame (void)
843b725ae77Skettenis {
844b725ae77Skettenis   if (!target_has_registers || !target_has_stack || !target_has_memory)
845b725ae77Skettenis     return NULL;
846b725ae77Skettenis   return get_selected_frame ();
847b725ae77Skettenis }
848b725ae77Skettenis 
849b725ae77Skettenis /* Select frame FI (or NULL - to invalidate the current frame).  */
850b725ae77Skettenis 
851b725ae77Skettenis void
select_frame(struct frame_info * fi)852b725ae77Skettenis select_frame (struct frame_info *fi)
853b725ae77Skettenis {
854b725ae77Skettenis   struct symtab *s;
855b725ae77Skettenis 
856b725ae77Skettenis   deprecated_selected_frame = fi;
85763addd46Skettenis   /* NOTE: cagney/2002-05-04: FI can be NULL.  This occurs when the
858b725ae77Skettenis      frame is being invalidated.  */
85963addd46Skettenis   if (deprecated_selected_frame_level_changed_hook)
86063addd46Skettenis     deprecated_selected_frame_level_changed_hook (frame_relative_level (fi));
861b725ae77Skettenis 
862b725ae77Skettenis   /* FIXME: kseitz/2002-08-28: It would be nice to call
86363addd46Skettenis      selected_frame_level_changed_event() right here, but due to limitations
864b725ae77Skettenis      in the current interfaces, we would end up flooding UIs with events
86563addd46Skettenis      because select_frame() is used extensively internally.
866b725ae77Skettenis 
867b725ae77Skettenis      Once we have frame-parameterized frame (and frame-related) commands,
868b725ae77Skettenis      the event notification can be moved here, since this function will only
86963addd46Skettenis      be called when the user's selected frame is being changed. */
870b725ae77Skettenis 
871b725ae77Skettenis   /* Ensure that symbols for this frame are read in.  Also, determine the
872b725ae77Skettenis      source language of this frame, and switch to it if desired.  */
873b725ae77Skettenis   if (fi)
874b725ae77Skettenis     {
875b725ae77Skettenis       /* We retrieve the frame's symtab by using the frame PC.  However
87663addd46Skettenis          we cannot use the frame PC as-is, because it usually points to
877b725ae77Skettenis          the instruction following the "call", which is sometimes the
878b725ae77Skettenis          first instruction of another function.  So we rely on
879b725ae77Skettenis          get_frame_address_in_block() which provides us with a PC which
880b725ae77Skettenis          is guaranteed to be inside the frame's code block.  */
881b725ae77Skettenis       s = find_pc_symtab (get_frame_address_in_block (fi));
882b725ae77Skettenis       if (s
883b725ae77Skettenis 	  && s->language != current_language->la_language
884b725ae77Skettenis 	  && s->language != language_unknown
885b725ae77Skettenis 	  && language_mode == language_mode_auto)
886b725ae77Skettenis 	{
887b725ae77Skettenis 	  set_language (s->language);
888b725ae77Skettenis 	}
889b725ae77Skettenis     }
890b725ae77Skettenis }
891b725ae77Skettenis 
892b725ae77Skettenis /* Create an arbitrary (i.e. address specified by user) or innermost frame.
893b725ae77Skettenis    Always returns a non-NULL value.  */
894b725ae77Skettenis 
895b725ae77Skettenis struct frame_info *
create_new_frame(CORE_ADDR addr,CORE_ADDR pc)896b725ae77Skettenis create_new_frame (CORE_ADDR addr, CORE_ADDR pc)
897b725ae77Skettenis {
898b725ae77Skettenis   struct frame_info *fi;
899b725ae77Skettenis 
900b725ae77Skettenis   if (frame_debug)
901b725ae77Skettenis     {
902b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog,
903b725ae77Skettenis 			  "{ create_new_frame (addr=0x%s, pc=0x%s) ",
904b725ae77Skettenis 			  paddr_nz (addr), paddr_nz (pc));
905b725ae77Skettenis     }
906b725ae77Skettenis 
907b725ae77Skettenis   fi = frame_obstack_zalloc (sizeof (struct frame_info));
908b725ae77Skettenis 
909b725ae77Skettenis   fi->next = create_sentinel_frame (current_regcache);
910b725ae77Skettenis 
911b725ae77Skettenis   /* Select/initialize both the unwind function and the frame's type
912b725ae77Skettenis      based on the PC.  */
91363addd46Skettenis   fi->unwind = frame_unwind_find_by_frame (fi->next, &fi->prologue_cache);
914b725ae77Skettenis 
915b725ae77Skettenis   fi->this_id.p = 1;
916b725ae77Skettenis   deprecated_update_frame_base_hack (fi, addr);
917b725ae77Skettenis   deprecated_update_frame_pc_hack (fi, pc);
918b725ae77Skettenis 
919b725ae77Skettenis   if (frame_debug)
920b725ae77Skettenis     {
921b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "-> ");
922b725ae77Skettenis       fprint_frame (gdb_stdlog, fi);
923b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " }\n");
924b725ae77Skettenis     }
925b725ae77Skettenis 
926b725ae77Skettenis   return fi;
927b725ae77Skettenis }
928b725ae77Skettenis 
929b725ae77Skettenis /* Return the frame that THIS_FRAME calls (NULL if THIS_FRAME is the
930b725ae77Skettenis    innermost frame).  Be careful to not fall off the bottom of the
931b725ae77Skettenis    frame chain and onto the sentinel frame.  */
932b725ae77Skettenis 
933b725ae77Skettenis struct frame_info *
get_next_frame(struct frame_info * this_frame)934b725ae77Skettenis get_next_frame (struct frame_info *this_frame)
935b725ae77Skettenis {
936b725ae77Skettenis   if (this_frame->level > 0)
937b725ae77Skettenis     return this_frame->next;
938b725ae77Skettenis   else
939b725ae77Skettenis     return NULL;
940b725ae77Skettenis }
941b725ae77Skettenis 
94263addd46Skettenis /* Observer for the target_changed event.  */
94363addd46Skettenis 
94463addd46Skettenis void
frame_observer_target_changed(struct target_ops * target)94563addd46Skettenis frame_observer_target_changed (struct target_ops *target)
94663addd46Skettenis {
94763addd46Skettenis   flush_cached_frames ();
94863addd46Skettenis }
94963addd46Skettenis 
950b725ae77Skettenis /* Flush the entire frame cache.  */
951b725ae77Skettenis 
952b725ae77Skettenis void
flush_cached_frames(void)953b725ae77Skettenis flush_cached_frames (void)
954b725ae77Skettenis {
955b725ae77Skettenis   /* Since we can't really be sure what the first object allocated was */
956b725ae77Skettenis   obstack_free (&frame_cache_obstack, 0);
957b725ae77Skettenis   obstack_init (&frame_cache_obstack);
958b725ae77Skettenis 
959b725ae77Skettenis   current_frame = NULL;		/* Invalidate cache */
960b725ae77Skettenis   select_frame (NULL);
961b725ae77Skettenis   annotate_frames_invalid ();
962b725ae77Skettenis   if (frame_debug)
963b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "{ flush_cached_frames () }\n");
964b725ae77Skettenis }
965b725ae77Skettenis 
966b725ae77Skettenis /* Flush the frame cache, and start a new one if necessary.  */
967b725ae77Skettenis 
968b725ae77Skettenis void
reinit_frame_cache(void)969b725ae77Skettenis reinit_frame_cache (void)
970b725ae77Skettenis {
971b725ae77Skettenis   flush_cached_frames ();
972b725ae77Skettenis 
973b725ae77Skettenis   /* FIXME: The inferior_ptid test is wrong if there is a corefile.  */
974b725ae77Skettenis   if (PIDGET (inferior_ptid) != 0)
975b725ae77Skettenis     {
976b725ae77Skettenis       select_frame (get_current_frame ());
977b725ae77Skettenis     }
978b725ae77Skettenis }
979b725ae77Skettenis 
98063addd46Skettenis /* Return a "struct frame_info" corresponding to the frame that called
98163addd46Skettenis    THIS_FRAME.  Returns NULL if there is no such frame.
98263addd46Skettenis 
98363addd46Skettenis    Unlike get_prev_frame, this function always tries to unwind the
98463addd46Skettenis    frame.  */
985b725ae77Skettenis 
986b725ae77Skettenis static struct frame_info *
get_prev_frame_1(struct frame_info * this_frame)98763addd46Skettenis get_prev_frame_1 (struct frame_info *this_frame)
988b725ae77Skettenis {
989b725ae77Skettenis   struct frame_info *prev_frame;
99052ba75afSkettenis   struct frame_id this_id;
991b725ae77Skettenis 
99263addd46Skettenis   gdb_assert (this_frame != NULL);
99363addd46Skettenis 
994b725ae77Skettenis   if (frame_debug)
995b725ae77Skettenis     {
99663addd46Skettenis       fprintf_unfiltered (gdb_stdlog, "{ get_prev_frame_1 (this_frame=");
997b725ae77Skettenis       if (this_frame != NULL)
998b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "%d", this_frame->level);
999b725ae77Skettenis       else
1000b725ae77Skettenis 	fprintf_unfiltered (gdb_stdlog, "<NULL>");
1001b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, ") ");
1002b725ae77Skettenis     }
1003b725ae77Skettenis 
1004b725ae77Skettenis   /* Only try to do the unwind once.  */
1005b725ae77Skettenis   if (this_frame->prev_p)
1006b725ae77Skettenis     {
1007b725ae77Skettenis       if (frame_debug)
1008b725ae77Skettenis 	{
1009b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, "-> ");
1010b725ae77Skettenis 	  fprint_frame (gdb_stdlog, this_frame->prev);
1011b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, " // cached \n");
1012b725ae77Skettenis 	}
1013b725ae77Skettenis       return this_frame->prev;
1014b725ae77Skettenis     }
1015b725ae77Skettenis   this_frame->prev_p = 1;
1016b725ae77Skettenis 
1017b725ae77Skettenis   /* Check that this frame's ID was valid.  If it wasn't, don't try to
1018b725ae77Skettenis      unwind to the prev frame.  Be careful to not apply this test to
1019b725ae77Skettenis      the sentinel frame.  */
102052ba75afSkettenis   this_id = get_frame_id (this_frame);
102152ba75afSkettenis   if (this_frame->level >= 0 && !frame_id_p (this_id))
1022b725ae77Skettenis     {
1023b725ae77Skettenis       if (frame_debug)
1024b725ae77Skettenis 	{
1025b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, "-> ");
1026b725ae77Skettenis 	  fprint_frame (gdb_stdlog, NULL);
1027b725ae77Skettenis 	  fprintf_unfiltered (gdb_stdlog, " // this ID is NULL }\n");
1028b725ae77Skettenis 	}
1029b725ae77Skettenis       return NULL;
1030b725ae77Skettenis     }
1031b725ae77Skettenis 
1032b725ae77Skettenis   /* Check that this frame's ID isn't inner to (younger, below, next)
1033b725ae77Skettenis      the next frame.  This happens when a frame unwind goes backwards.
103463addd46Skettenis      Exclude signal trampolines (due to sigaltstack the frame ID can
103563addd46Skettenis      go backwards) and sentinel frames (the test is meaningless).  */
103663addd46Skettenis   if (this_frame->next->level >= 0
103763addd46Skettenis       && this_frame->next->unwind->type != SIGTRAMP_FRAME
103852ba75afSkettenis       && frame_id_inner (this_id, get_frame_id (this_frame->next)))
1039b725ae77Skettenis     error ("Previous frame inner to this frame (corrupt stack?)");
1040b725ae77Skettenis 
1041b725ae77Skettenis   /* Check that this and the next frame are not identical.  If they
1042b725ae77Skettenis      are, there is most likely a stack cycle.  As with the inner-than
1043b725ae77Skettenis      test above, avoid comparing the inner-most and sentinel frames.  */
1044b725ae77Skettenis   if (this_frame->level > 0
104552ba75afSkettenis       && frame_id_eq (this_id, get_frame_id (this_frame->next)))
1046b725ae77Skettenis     error ("Previous frame identical to this frame (corrupt stack?)");
1047b725ae77Skettenis 
1048b725ae77Skettenis   /* Allocate the new frame but do not wire it in to the frame chain.
1049b725ae77Skettenis      Some (bad) code in INIT_FRAME_EXTRA_INFO tries to look along
1050b725ae77Skettenis      frame->next to pull some fancy tricks (of course such code is, by
1051b725ae77Skettenis      definition, recursive).  Try to prevent it.
1052b725ae77Skettenis 
1053b725ae77Skettenis      There is no reason to worry about memory leaks, should the
1054b725ae77Skettenis      remainder of the function fail.  The allocated memory will be
1055b725ae77Skettenis      quickly reclaimed when the frame cache is flushed, and the `we've
1056b725ae77Skettenis      been here before' check above will stop repeated memory
1057b725ae77Skettenis      allocation calls.  */
1058b725ae77Skettenis   prev_frame = FRAME_OBSTACK_ZALLOC (struct frame_info);
1059b725ae77Skettenis   prev_frame->level = this_frame->level + 1;
1060b725ae77Skettenis 
1061b725ae77Skettenis   /* Don't yet compute ->unwind (and hence ->type).  It is computed
1062b725ae77Skettenis      on-demand in get_frame_type, frame_register_unwind, and
1063b725ae77Skettenis      get_frame_id.  */
1064b725ae77Skettenis 
1065b725ae77Skettenis   /* Don't yet compute the frame's ID.  It is computed on-demand by
1066b725ae77Skettenis      get_frame_id().  */
1067b725ae77Skettenis 
1068b725ae77Skettenis   /* The unwound frame ID is validate at the start of this function,
1069b725ae77Skettenis      as part of the logic to decide if that frame should be further
1070b725ae77Skettenis      unwound, and not here while the prev frame is being created.
1071b725ae77Skettenis      Doing this makes it possible for the user to examine a frame that
1072b725ae77Skettenis      has an invalid frame ID.
1073b725ae77Skettenis 
1074b725ae77Skettenis      Some very old VAX code noted: [...]  For the sake of argument,
1075b725ae77Skettenis      suppose that the stack is somewhat trashed (which is one reason
1076b725ae77Skettenis      that "info frame" exists).  So, return 0 (indicating we don't
1077b725ae77Skettenis      know the address of the arglist) if we don't know what frame this
1078b725ae77Skettenis      frame calls.  */
1079b725ae77Skettenis 
1080b725ae77Skettenis   /* Link it in.  */
1081b725ae77Skettenis   this_frame->prev = prev_frame;
1082b725ae77Skettenis   prev_frame->next = this_frame;
1083b725ae77Skettenis 
1084b725ae77Skettenis   if (frame_debug)
1085b725ae77Skettenis     {
1086b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, "-> ");
1087b725ae77Skettenis       fprint_frame (gdb_stdlog, prev_frame);
1088b725ae77Skettenis       fprintf_unfiltered (gdb_stdlog, " }\n");
1089b725ae77Skettenis     }
1090b725ae77Skettenis 
1091b725ae77Skettenis   return prev_frame;
1092b725ae77Skettenis }
1093b725ae77Skettenis 
109463addd46Skettenis /* Debug routine to print a NULL frame being returned.  */
109563addd46Skettenis 
109663addd46Skettenis static void
frame_debug_got_null_frame(struct ui_file * file,struct frame_info * this_frame,const char * reason)109763addd46Skettenis frame_debug_got_null_frame (struct ui_file *file,
109863addd46Skettenis 			    struct frame_info *this_frame,
109963addd46Skettenis 			    const char *reason)
110063addd46Skettenis {
110163addd46Skettenis   if (frame_debug)
110263addd46Skettenis     {
110363addd46Skettenis       fprintf_unfiltered (gdb_stdlog, "{ get_prev_frame (this_frame=");
110463addd46Skettenis       if (this_frame != NULL)
110563addd46Skettenis 	fprintf_unfiltered (gdb_stdlog, "%d", this_frame->level);
110663addd46Skettenis       else
110763addd46Skettenis 	fprintf_unfiltered (gdb_stdlog, "<NULL>");
110863addd46Skettenis       fprintf_unfiltered (gdb_stdlog, ") -> // %s}\n", reason);
110963addd46Skettenis     }
111063addd46Skettenis }
111163addd46Skettenis 
111263addd46Skettenis /* Is this (non-sentinel) frame in the "main"() function?  */
111363addd46Skettenis 
111463addd46Skettenis static int
inside_main_func(struct frame_info * this_frame)111563addd46Skettenis inside_main_func (struct frame_info *this_frame)
111663addd46Skettenis {
111763addd46Skettenis   struct minimal_symbol *msymbol;
111863addd46Skettenis   CORE_ADDR maddr;
111963addd46Skettenis 
112063addd46Skettenis   if (symfile_objfile == 0)
112163addd46Skettenis     return 0;
112263addd46Skettenis   msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
112363addd46Skettenis   if (msymbol == NULL)
112463addd46Skettenis     return 0;
112563addd46Skettenis   /* Make certain that the code, and not descriptor, address is
112663addd46Skettenis      returned.  */
112763addd46Skettenis   maddr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
112863addd46Skettenis 					      SYMBOL_VALUE_ADDRESS (msymbol),
112963addd46Skettenis 					      &current_target);
113063addd46Skettenis   return maddr == get_frame_func (this_frame);
113163addd46Skettenis }
113263addd46Skettenis 
113363addd46Skettenis /* Return a structure containing various interesting information about
113463addd46Skettenis    the frame that called THIS_FRAME.  Returns NULL if there is entier
113563addd46Skettenis    no such frame or the frame fails any of a set of target-independent
113663addd46Skettenis    condition that should terminate the frame chain (e.g., as unwinding
113763addd46Skettenis    past main()).
113863addd46Skettenis 
113963addd46Skettenis    This function should not contain target-dependent tests, such as
114063addd46Skettenis    checking whether the program-counter is zero.  */
114163addd46Skettenis 
114263addd46Skettenis struct frame_info *
get_prev_frame(struct frame_info * this_frame)114363addd46Skettenis get_prev_frame (struct frame_info *this_frame)
114463addd46Skettenis {
114563addd46Skettenis   struct frame_info *prev_frame;
114663addd46Skettenis 
114763addd46Skettenis   /* Return the inner-most frame, when the caller passes in NULL.  */
114863addd46Skettenis   /* NOTE: cagney/2002-11-09: Not sure how this would happen.  The
114963addd46Skettenis      caller should have previously obtained a valid frame using
115063addd46Skettenis      get_selected_frame() and then called this code - only possibility
115163addd46Skettenis      I can think of is code behaving badly.
115263addd46Skettenis 
115363addd46Skettenis      NOTE: cagney/2003-01-10: Talk about code behaving badly.  Check
115463addd46Skettenis      block_innermost_frame().  It does the sequence: frame = NULL;
115563addd46Skettenis      while (1) { frame = get_prev_frame (frame); .... }.  Ulgh!  Why
115663addd46Skettenis      it couldn't be written better, I don't know.
115763addd46Skettenis 
115863addd46Skettenis      NOTE: cagney/2003-01-11: I suspect what is happening in
115963addd46Skettenis      block_innermost_frame() is, when the target has no state
116063addd46Skettenis      (registers, memory, ...), it is still calling this function.  The
116163addd46Skettenis      assumption being that this function will return NULL indicating
116263addd46Skettenis      that a frame isn't possible, rather than checking that the target
116363addd46Skettenis      has state and then calling get_current_frame() and
116463addd46Skettenis      get_prev_frame().  This is a guess mind.  */
116563addd46Skettenis   if (this_frame == NULL)
116663addd46Skettenis     {
116763addd46Skettenis       /* NOTE: cagney/2002-11-09: There was a code segment here that
116863addd46Skettenis 	 would error out when CURRENT_FRAME was NULL.  The comment
116963addd46Skettenis 	 that went with it made the claim ...
117063addd46Skettenis 
117163addd46Skettenis 	 ``This screws value_of_variable, which just wants a nice
117263addd46Skettenis 	 clean NULL return from block_innermost_frame if there are no
117363addd46Skettenis 	 frames.  I don't think I've ever seen this message happen
117463addd46Skettenis 	 otherwise.  And returning NULL here is a perfectly legitimate
117563addd46Skettenis 	 thing to do.''
117663addd46Skettenis 
117763addd46Skettenis          Per the above, this code shouldn't even be called with a NULL
117863addd46Skettenis          THIS_FRAME.  */
117963addd46Skettenis       frame_debug_got_null_frame (gdb_stdlog, this_frame, "this_frame NULL");
118063addd46Skettenis       return current_frame;
118163addd46Skettenis     }
118263addd46Skettenis 
118363addd46Skettenis   /* There is always a frame.  If this assertion fails, suspect that
118463addd46Skettenis      something should be calling get_selected_frame() or
118563addd46Skettenis      get_current_frame().  */
118663addd46Skettenis   gdb_assert (this_frame != NULL);
118763addd46Skettenis 
118863addd46Skettenis   if (this_frame->level >= 0
118963addd46Skettenis       && !backtrace_past_main
119063addd46Skettenis       && inside_main_func (this_frame))
119163addd46Skettenis     /* Don't unwind past main().  Note, this is done _before_ the
119263addd46Skettenis        frame has been marked as previously unwound.  That way if the
119363addd46Skettenis        user later decides to enable unwinds past main(), that will
119463addd46Skettenis        automatically happen.  */
119563addd46Skettenis     {
119663addd46Skettenis       frame_debug_got_null_frame (gdb_stdlog, this_frame, "inside main func");
119763addd46Skettenis       return NULL;
119863addd46Skettenis     }
119963addd46Skettenis 
120063addd46Skettenis   if (this_frame->level > backtrace_limit)
120163addd46Skettenis     {
120263addd46Skettenis       error ("Backtrace limit of %d exceeded", backtrace_limit);
120363addd46Skettenis     }
120463addd46Skettenis 
120563addd46Skettenis   /* If we're already inside the entry function for the main objfile,
120663addd46Skettenis      then it isn't valid.  Don't apply this test to a dummy frame -
120763addd46Skettenis      dummy frame PCs typically land in the entry func.  Don't apply
120863addd46Skettenis      this test to the sentinel frame.  Sentinel frames should always
120963addd46Skettenis      be allowed to unwind.  */
121063addd46Skettenis   /* NOTE: cagney/2003-02-25: Don't enable until someone has found
121163addd46Skettenis      hard evidence that this is needed.  */
121263addd46Skettenis   /* NOTE: cagney/2003-07-07: Fixed a bug in inside_main_func() -
121363addd46Skettenis      wasn't checking for "main" in the minimal symbols.  With that
121463addd46Skettenis      fixed asm-source tests now stop in "main" instead of halting the
121563addd46Skettenis      backtrace in weird and wonderful ways somewhere inside the entry
121663addd46Skettenis      file.  Suspect that tests for inside the entry file/func were
121763addd46Skettenis      added to work around that (now fixed) case.  */
121863addd46Skettenis   /* NOTE: cagney/2003-07-15: danielj (if I'm reading it right)
121963addd46Skettenis      suggested having the inside_entry_func test use the
122063addd46Skettenis      inside_main_func() msymbol trick (along with entry_point_address()
122163addd46Skettenis      I guess) to determine the address range of the start function.
122263addd46Skettenis      That should provide a far better stopper than the current
122363addd46Skettenis      heuristics.  */
122463addd46Skettenis   /* NOTE: cagney/2003-07-15: Need to add a "set backtrace
122563addd46Skettenis      beyond-entry-func" command so that this can be selectively
122663addd46Skettenis      disabled.  */
122763addd46Skettenis   if (0
122863addd46Skettenis #if 0
122963addd46Skettenis       && backtrace_beyond_entry_func
123063addd46Skettenis #endif
123163addd46Skettenis       && this_frame->unwind->type != DUMMY_FRAME && this_frame->level >= 0
123263addd46Skettenis       && inside_entry_func (this_frame))
123363addd46Skettenis     {
123463addd46Skettenis       frame_debug_got_null_frame (gdb_stdlog, this_frame, "inside entry func");
123563addd46Skettenis       return NULL;
123663addd46Skettenis     }
123763addd46Skettenis 
1238*87cf8587Skettenis   /* Assume that the only way to get a zero PC is through something
1239*87cf8587Skettenis      like a SIGSEGV or a dummy frame, and hence that NORMAL frames
1240*87cf8587Skettenis      will never unwind a zero PC.  */
1241*87cf8587Skettenis   if (this_frame->level > 0
1242*87cf8587Skettenis       && get_frame_type (this_frame) == NORMAL_FRAME
1243*87cf8587Skettenis       && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME
1244*87cf8587Skettenis       && get_frame_pc (this_frame) == 0)
1245*87cf8587Skettenis     {
1246*87cf8587Skettenis       frame_debug_got_null_frame (gdb_stdlog, this_frame, "zero PC");
1247*87cf8587Skettenis       return NULL;
1248*87cf8587Skettenis     }
1249*87cf8587Skettenis 
125063addd46Skettenis   return get_prev_frame_1 (this_frame);
125163addd46Skettenis }
125263addd46Skettenis 
1253b725ae77Skettenis CORE_ADDR
get_frame_pc(struct frame_info * frame)1254b725ae77Skettenis get_frame_pc (struct frame_info *frame)
1255b725ae77Skettenis {
1256b725ae77Skettenis   gdb_assert (frame->next != NULL);
1257b725ae77Skettenis   return frame_pc_unwind (frame->next);
1258b725ae77Skettenis }
1259b725ae77Skettenis 
1260b725ae77Skettenis /* Return an address of that falls within the frame's code block.  */
1261b725ae77Skettenis 
1262b725ae77Skettenis CORE_ADDR
frame_unwind_address_in_block(struct frame_info * next_frame)1263b725ae77Skettenis frame_unwind_address_in_block (struct frame_info *next_frame)
1264b725ae77Skettenis {
1265b725ae77Skettenis   /* A draft address.  */
1266b725ae77Skettenis   CORE_ADDR pc = frame_pc_unwind (next_frame);
1267b725ae77Skettenis 
1268b725ae77Skettenis   /* If THIS frame is not inner most (i.e., NEXT isn't the sentinel),
1269b725ae77Skettenis      and NEXT is `normal' (i.e., not a sigtramp, dummy, ....) THIS
1270b725ae77Skettenis      frame's PC ends up pointing at the instruction fallowing the
1271b725ae77Skettenis      "call".  Adjust that PC value so that it falls on the call
1272b725ae77Skettenis      instruction (which, hopefully, falls within THIS frame's code
1273b725ae77Skettenis      block.  So far it's proved to be a very good approximation.  See
127463addd46Skettenis      get_frame_type() for why ->type can't be used.  */
1275b725ae77Skettenis   if (next_frame->level >= 0
1276b725ae77Skettenis       && get_frame_type (next_frame) == NORMAL_FRAME)
1277b725ae77Skettenis     --pc;
1278b725ae77Skettenis   return pc;
1279b725ae77Skettenis }
1280b725ae77Skettenis 
1281b725ae77Skettenis CORE_ADDR
get_frame_address_in_block(struct frame_info * this_frame)1282b725ae77Skettenis get_frame_address_in_block (struct frame_info *this_frame)
1283b725ae77Skettenis {
1284b725ae77Skettenis   return frame_unwind_address_in_block (this_frame->next);
1285b725ae77Skettenis }
1286b725ae77Skettenis 
1287b725ae77Skettenis static int
pc_notcurrent(struct frame_info * frame)1288b725ae77Skettenis pc_notcurrent (struct frame_info *frame)
1289b725ae77Skettenis {
1290b725ae77Skettenis   /* If FRAME is not the innermost frame, that normally means that
1291b725ae77Skettenis      FRAME->pc points at the return instruction (which is *after* the
1292b725ae77Skettenis      call instruction), and we want to get the line containing the
1293b725ae77Skettenis      call (because the call is where the user thinks the program is).
1294b725ae77Skettenis      However, if the next frame is either a SIGTRAMP_FRAME or a
1295b725ae77Skettenis      DUMMY_FRAME, then the next frame will contain a saved interrupt
1296b725ae77Skettenis      PC and such a PC indicates the current (rather than next)
1297b725ae77Skettenis      instruction/line, consequently, for such cases, want to get the
1298b725ae77Skettenis      line containing fi->pc.  */
1299b725ae77Skettenis   struct frame_info *next = get_next_frame (frame);
1300b725ae77Skettenis   int notcurrent = (next != NULL && get_frame_type (next) == NORMAL_FRAME);
1301b725ae77Skettenis   return notcurrent;
1302b725ae77Skettenis }
1303b725ae77Skettenis 
1304b725ae77Skettenis void
find_frame_sal(struct frame_info * frame,struct symtab_and_line * sal)1305b725ae77Skettenis find_frame_sal (struct frame_info *frame, struct symtab_and_line *sal)
1306b725ae77Skettenis {
1307b725ae77Skettenis   (*sal) = find_pc_line (get_frame_pc (frame), pc_notcurrent (frame));
1308b725ae77Skettenis }
1309b725ae77Skettenis 
1310b725ae77Skettenis /* Per "frame.h", return the ``address'' of the frame.  Code should
1311b725ae77Skettenis    really be using get_frame_id().  */
1312b725ae77Skettenis CORE_ADDR
get_frame_base(struct frame_info * fi)1313b725ae77Skettenis get_frame_base (struct frame_info *fi)
1314b725ae77Skettenis {
1315b725ae77Skettenis   return get_frame_id (fi).stack_addr;
1316b725ae77Skettenis }
1317b725ae77Skettenis 
1318b725ae77Skettenis /* High-level offsets into the frame.  Used by the debug info.  */
1319b725ae77Skettenis 
1320b725ae77Skettenis CORE_ADDR
get_frame_base_address(struct frame_info * fi)1321b725ae77Skettenis get_frame_base_address (struct frame_info *fi)
1322b725ae77Skettenis {
1323b725ae77Skettenis   if (get_frame_type (fi) != NORMAL_FRAME)
1324b725ae77Skettenis     return 0;
1325b725ae77Skettenis   if (fi->base == NULL)
1326b725ae77Skettenis     fi->base = frame_base_find_by_frame (fi->next);
1327b725ae77Skettenis   /* Sneaky: If the low-level unwind and high-level base code share a
1328b725ae77Skettenis      common unwinder, let them share the prologue cache.  */
1329b725ae77Skettenis   if (fi->base->unwind == fi->unwind)
1330b725ae77Skettenis     return fi->base->this_base (fi->next, &fi->prologue_cache);
1331b725ae77Skettenis   return fi->base->this_base (fi->next, &fi->base_cache);
1332b725ae77Skettenis }
1333b725ae77Skettenis 
1334b725ae77Skettenis CORE_ADDR
get_frame_locals_address(struct frame_info * fi)1335b725ae77Skettenis get_frame_locals_address (struct frame_info *fi)
1336b725ae77Skettenis {
1337b725ae77Skettenis   void **cache;
1338b725ae77Skettenis   if (get_frame_type (fi) != NORMAL_FRAME)
1339b725ae77Skettenis     return 0;
1340b725ae77Skettenis   /* If there isn't a frame address method, find it.  */
1341b725ae77Skettenis   if (fi->base == NULL)
1342b725ae77Skettenis     fi->base = frame_base_find_by_frame (fi->next);
1343b725ae77Skettenis   /* Sneaky: If the low-level unwind and high-level base code share a
1344b725ae77Skettenis      common unwinder, let them share the prologue cache.  */
1345b725ae77Skettenis   if (fi->base->unwind == fi->unwind)
1346b725ae77Skettenis     cache = &fi->prologue_cache;
1347b725ae77Skettenis   else
1348b725ae77Skettenis     cache = &fi->base_cache;
1349b725ae77Skettenis   return fi->base->this_locals (fi->next, cache);
1350b725ae77Skettenis }
1351b725ae77Skettenis 
1352b725ae77Skettenis CORE_ADDR
get_frame_args_address(struct frame_info * fi)1353b725ae77Skettenis get_frame_args_address (struct frame_info *fi)
1354b725ae77Skettenis {
1355b725ae77Skettenis   void **cache;
1356b725ae77Skettenis   if (get_frame_type (fi) != NORMAL_FRAME)
1357b725ae77Skettenis     return 0;
1358b725ae77Skettenis   /* If there isn't a frame address method, find it.  */
1359b725ae77Skettenis   if (fi->base == NULL)
1360b725ae77Skettenis     fi->base = frame_base_find_by_frame (fi->next);
1361b725ae77Skettenis   /* Sneaky: If the low-level unwind and high-level base code share a
1362b725ae77Skettenis      common unwinder, let them share the prologue cache.  */
1363b725ae77Skettenis   if (fi->base->unwind == fi->unwind)
1364b725ae77Skettenis     cache = &fi->prologue_cache;
1365b725ae77Skettenis   else
1366b725ae77Skettenis     cache = &fi->base_cache;
1367b725ae77Skettenis   return fi->base->this_args (fi->next, cache);
1368b725ae77Skettenis }
1369b725ae77Skettenis 
1370b725ae77Skettenis /* Level of the selected frame: 0 for innermost, 1 for its caller, ...
1371b725ae77Skettenis    or -1 for a NULL frame.  */
1372b725ae77Skettenis 
1373b725ae77Skettenis int
frame_relative_level(struct frame_info * fi)1374b725ae77Skettenis frame_relative_level (struct frame_info *fi)
1375b725ae77Skettenis {
1376b725ae77Skettenis   if (fi == NULL)
1377b725ae77Skettenis     return -1;
1378b725ae77Skettenis   else
1379b725ae77Skettenis     return fi->level;
1380b725ae77Skettenis }
1381b725ae77Skettenis 
1382b725ae77Skettenis enum frame_type
get_frame_type(struct frame_info * frame)1383b725ae77Skettenis get_frame_type (struct frame_info *frame)
1384b725ae77Skettenis {
138563addd46Skettenis   if (frame->unwind == NULL)
138663addd46Skettenis     /* Initialize the frame's unwinder because that's what
1387b725ae77Skettenis        provides the frame's type.  */
138863addd46Skettenis     frame->unwind = frame_unwind_find_by_frame (frame->next,
138963addd46Skettenis 						&frame->prologue_cache);
139063addd46Skettenis   return frame->unwind->type;
1391b725ae77Skettenis }
1392b725ae77Skettenis 
1393b725ae77Skettenis void
deprecated_update_frame_pc_hack(struct frame_info * frame,CORE_ADDR pc)1394b725ae77Skettenis deprecated_update_frame_pc_hack (struct frame_info *frame, CORE_ADDR pc)
1395b725ae77Skettenis {
1396b725ae77Skettenis   if (frame_debug)
1397b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog,
1398b725ae77Skettenis 			"{ deprecated_update_frame_pc_hack (frame=%d,pc=0x%s) }\n",
1399b725ae77Skettenis 			frame->level, paddr_nz (pc));
1400b725ae77Skettenis   /* NOTE: cagney/2003-03-11: Some architectures (e.g., Arm) are
140163addd46Skettenis      maintaining a locally allocated frame object.  Since such frames
1402b725ae77Skettenis      are not in the frame chain, it isn't possible to assume that the
1403b725ae77Skettenis      frame has a next.  Sigh.  */
1404b725ae77Skettenis   if (frame->next != NULL)
1405b725ae77Skettenis     {
1406b725ae77Skettenis       /* While we're at it, update this frame's cached PC value, found
1407b725ae77Skettenis 	 in the next frame.  Oh for the day when "struct frame_info"
1408b725ae77Skettenis 	 is opaque and this hack on hack can just go away.  */
1409b725ae77Skettenis       frame->next->prev_pc.value = pc;
1410b725ae77Skettenis       frame->next->prev_pc.p = 1;
1411b725ae77Skettenis     }
1412b725ae77Skettenis }
1413b725ae77Skettenis 
1414b725ae77Skettenis void
deprecated_update_frame_base_hack(struct frame_info * frame,CORE_ADDR base)1415b725ae77Skettenis deprecated_update_frame_base_hack (struct frame_info *frame, CORE_ADDR base)
1416b725ae77Skettenis {
1417b725ae77Skettenis   if (frame_debug)
1418b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog,
1419b725ae77Skettenis 			"{ deprecated_update_frame_base_hack (frame=%d,base=0x%s) }\n",
1420b725ae77Skettenis 			frame->level, paddr_nz (base));
1421b725ae77Skettenis   /* See comment in "frame.h".  */
1422b725ae77Skettenis   frame->this_id.value.stack_addr = base;
1423b725ae77Skettenis }
1424b725ae77Skettenis 
1425b725ae77Skettenis /* Memory access methods.  */
1426b725ae77Skettenis 
1427b725ae77Skettenis void
get_frame_memory(struct frame_info * this_frame,CORE_ADDR addr,void * buf,int len)1428b725ae77Skettenis get_frame_memory (struct frame_info *this_frame, CORE_ADDR addr, void *buf,
1429b725ae77Skettenis 		  int len)
1430b725ae77Skettenis {
1431b725ae77Skettenis   read_memory (addr, buf, len);
1432b725ae77Skettenis }
1433b725ae77Skettenis 
1434b725ae77Skettenis LONGEST
get_frame_memory_signed(struct frame_info * this_frame,CORE_ADDR addr,int len)1435b725ae77Skettenis get_frame_memory_signed (struct frame_info *this_frame, CORE_ADDR addr,
1436b725ae77Skettenis 			 int len)
1437b725ae77Skettenis {
1438b725ae77Skettenis   return read_memory_integer (addr, len);
1439b725ae77Skettenis }
1440b725ae77Skettenis 
1441b725ae77Skettenis ULONGEST
get_frame_memory_unsigned(struct frame_info * this_frame,CORE_ADDR addr,int len)1442b725ae77Skettenis get_frame_memory_unsigned (struct frame_info *this_frame, CORE_ADDR addr,
1443b725ae77Skettenis 			   int len)
1444b725ae77Skettenis {
1445b725ae77Skettenis   return read_memory_unsigned_integer (addr, len);
1446b725ae77Skettenis }
1447b725ae77Skettenis 
144863addd46Skettenis int
safe_frame_unwind_memory(struct frame_info * this_frame,CORE_ADDR addr,void * buf,int len)144963addd46Skettenis safe_frame_unwind_memory (struct frame_info *this_frame,
145063addd46Skettenis 			  CORE_ADDR addr, void *buf, int len)
145163addd46Skettenis {
145263addd46Skettenis   /* NOTE: deprecated_read_memory_nobpt returns zero on success!  */
145363addd46Skettenis   return !deprecated_read_memory_nobpt (addr, buf, len);
145463addd46Skettenis }
145563addd46Skettenis 
1456b725ae77Skettenis /* Architecture method.  */
1457b725ae77Skettenis 
1458b725ae77Skettenis struct gdbarch *
get_frame_arch(struct frame_info * this_frame)1459b725ae77Skettenis get_frame_arch (struct frame_info *this_frame)
1460b725ae77Skettenis {
1461b725ae77Skettenis   return current_gdbarch;
1462b725ae77Skettenis }
1463b725ae77Skettenis 
1464b725ae77Skettenis /* Stack pointer methods.  */
1465b725ae77Skettenis 
1466b725ae77Skettenis CORE_ADDR
get_frame_sp(struct frame_info * this_frame)1467b725ae77Skettenis get_frame_sp (struct frame_info *this_frame)
1468b725ae77Skettenis {
1469b725ae77Skettenis   return frame_sp_unwind (this_frame->next);
1470b725ae77Skettenis }
1471b725ae77Skettenis 
1472b725ae77Skettenis CORE_ADDR
frame_sp_unwind(struct frame_info * next_frame)1473b725ae77Skettenis frame_sp_unwind (struct frame_info *next_frame)
1474b725ae77Skettenis {
147563addd46Skettenis   /* Normality - an architecture that provides a way of obtaining any
1476b725ae77Skettenis      frame inner-most address.  */
1477b725ae77Skettenis   if (gdbarch_unwind_sp_p (current_gdbarch))
1478b725ae77Skettenis     return gdbarch_unwind_sp (current_gdbarch, next_frame);
1479b725ae77Skettenis   /* Things are looking grim.  If it's the inner-most frame and there
148063addd46Skettenis      is a TARGET_READ_SP, then that can be used.  */
1481b725ae77Skettenis   if (next_frame->level < 0 && TARGET_READ_SP_P ())
1482b725ae77Skettenis     return TARGET_READ_SP ();
1483b725ae77Skettenis   /* Now things are really are grim.  Hope that the value returned by
1484b725ae77Skettenis      the SP_REGNUM register is meaningful.  */
1485b725ae77Skettenis   if (SP_REGNUM >= 0)
1486b725ae77Skettenis     {
1487b725ae77Skettenis       ULONGEST sp;
1488b725ae77Skettenis       frame_unwind_unsigned_register (next_frame, SP_REGNUM, &sp);
1489b725ae77Skettenis       return sp;
1490b725ae77Skettenis     }
1491b725ae77Skettenis   internal_error (__FILE__, __LINE__, "Missing unwind SP method");
1492b725ae77Skettenis }
1493b725ae77Skettenis 
1494b725ae77Skettenis extern initialize_file_ftype _initialize_frame; /* -Wmissing-prototypes */
1495b725ae77Skettenis 
1496b725ae77Skettenis static struct cmd_list_element *set_backtrace_cmdlist;
1497b725ae77Skettenis static struct cmd_list_element *show_backtrace_cmdlist;
1498b725ae77Skettenis 
1499b725ae77Skettenis static void
set_backtrace_cmd(char * args,int from_tty)1500b725ae77Skettenis set_backtrace_cmd (char *args, int from_tty)
1501b725ae77Skettenis {
1502b725ae77Skettenis   help_list (set_backtrace_cmdlist, "set backtrace ", -1, gdb_stdout);
1503b725ae77Skettenis }
1504b725ae77Skettenis 
1505b725ae77Skettenis static void
show_backtrace_cmd(char * args,int from_tty)1506b725ae77Skettenis show_backtrace_cmd (char *args, int from_tty)
1507b725ae77Skettenis {
1508b725ae77Skettenis   cmd_show_list (show_backtrace_cmdlist, from_tty, "");
1509b725ae77Skettenis }
1510b725ae77Skettenis 
1511b725ae77Skettenis void
_initialize_frame(void)1512b725ae77Skettenis _initialize_frame (void)
1513b725ae77Skettenis {
1514b725ae77Skettenis   obstack_init (&frame_cache_obstack);
1515b725ae77Skettenis 
151663addd46Skettenis   observer_attach_target_changed (frame_observer_target_changed);
151763addd46Skettenis 
1518b725ae77Skettenis   add_prefix_cmd ("backtrace", class_maintenance, set_backtrace_cmd, "\
1519b725ae77Skettenis Set backtrace specific variables.\n\
1520b725ae77Skettenis Configure backtrace variables such as the backtrace limit",
1521b725ae77Skettenis 		  &set_backtrace_cmdlist, "set backtrace ",
1522b725ae77Skettenis 		  0/*allow-unknown*/, &setlist);
1523b725ae77Skettenis   add_prefix_cmd ("backtrace", class_maintenance, show_backtrace_cmd, "\
1524b725ae77Skettenis Show backtrace specific variables\n\
1525b725ae77Skettenis Show backtrace variables such as the backtrace limit",
1526b725ae77Skettenis 		  &show_backtrace_cmdlist, "show backtrace ",
1527b725ae77Skettenis 		  0/*allow-unknown*/, &showlist);
1528b725ae77Skettenis 
1529b725ae77Skettenis   add_setshow_boolean_cmd ("past-main", class_obscure,
1530b725ae77Skettenis 			   &backtrace_past_main, "\
153163addd46Skettenis Set whether backtraces should continue past \"main\".", "\
153263addd46Skettenis Show whether backtraces should continue past \"main\".", "\
1533b725ae77Skettenis Normally the caller of \"main\" is not of interest, so GDB will terminate\n\
1534b725ae77Skettenis the backtrace at \"main\".  Set this variable if you need to see the rest\n\
1535b725ae77Skettenis of the stack trace.", "\
153663addd46Skettenis Whether backtraces should continue past \"main\" is %s.",
1537b725ae77Skettenis 			   NULL, NULL, &set_backtrace_cmdlist,
1538b725ae77Skettenis 			   &show_backtrace_cmdlist);
1539b725ae77Skettenis 
1540b725ae77Skettenis   add_setshow_uinteger_cmd ("limit", class_obscure,
1541b725ae77Skettenis 			    &backtrace_limit, "\
154263addd46Skettenis Set an upper bound on the number of backtrace levels.", "\
154363addd46Skettenis Show the upper bound on the number of backtrace levels.", "\
1544b725ae77Skettenis No more than the specified number of frames can be displayed or examined.\n\
1545b725ae77Skettenis Zero is unlimited.", "\
154663addd46Skettenis An upper bound on the number of backtrace levels is %s.",
1547b725ae77Skettenis 			    NULL, NULL, &set_backtrace_cmdlist,
1548b725ae77Skettenis 			    &show_backtrace_cmdlist);
1549b725ae77Skettenis 
1550b725ae77Skettenis   /* Debug this files internals. */
155163addd46Skettenis   deprecated_add_show_from_set
155263addd46Skettenis     (add_set_cmd ("frame", class_maintenance, var_zinteger,
1553b725ae77Skettenis 		  &frame_debug, "Set frame debugging.\n\
1554b725ae77Skettenis When non-zero, frame specific internal debugging is enabled.", &setdebuglist),
1555b725ae77Skettenis      &showdebuglist);
1556b725ae77Skettenis }
1557