]> Git Repo - binutils.git/blob - gdb/stack.c
Minor vintage gcc lints.
[binutils.git] / gdb / stack.c
1 /* Print and select stack frames for GDB, the GNU debugger.
2    Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 GDB is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 GDB is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GDB; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 #include <stdio.h>
21
22 #include "defs.h"
23 #include "param.h"
24 #include "symtab.h"
25 #include "frame.h"
26 #include "gdbcmd.h"
27 #include "value.h"
28 #include "gdbcore.h"
29 #include "target.h"
30 #include "breakpoint.h"
31
32 extern int addressprint;        /* Print addresses, or stay symbolic only? */
33 extern int info_verbose;        /* Verbosity of symbol reading msgs */
34 extern char *reg_names[];       /* Names of registers */
35
36 /* Thie "selected" stack frame is used by default for local and arg access.
37    May be zero, for no selected frame.  */
38
39 FRAME selected_frame;
40
41 /* Level of the selected frame:
42    0 for innermost, 1 for its caller, ...
43    or -1 for frame specified by address with no defined level.  */
44
45 int selected_frame_level;
46
47 /* Nonzero means print the full filename and linenumber
48    when a frame is printed, and do so in a format programs can parse.  */
49
50 int frame_file_full_name = 0;
51
52 void print_frame_info ();
53 \f
54 /* Print a stack frame briefly.  FRAME should be the frame id
55    and LEVEL should be its level in the stack (or -1 for level not defined).
56    This prints the level, the function executing, the arguments,
57    and the file name and line number.
58    If the pc is not at the beginning of the source line,
59    the actual pc is printed at the beginning.
60
61    If SOURCE is 1, print the source line as well.
62    If SOURCE is -1, print ONLY the source line.  */
63
64 static void
65 print_stack_frame (frame, level, source)
66      FRAME frame;
67      int level;
68      int source;
69 {
70   struct frame_info *fi;
71
72   fi = get_frame_info (frame);
73
74   print_frame_info (fi, level, source, 1);
75 }
76
77 void
78 print_frame_info (fi, level, source, args)
79      struct frame_info *fi;
80      register int level;
81      int source;
82      int args;
83 {
84   struct symtab_and_line sal;
85   struct symbol *func;
86   register char *funname = 0;
87   int numargs;
88
89 #if 0   /* Symbol reading is fast enough now */
90   struct partial_symtab *pst;
91
92   /* Don't give very much information if we haven't readin the
93      symbol table yet.  */
94   pst = find_pc_psymtab (fi->pc);
95   if (pst && !pst->readin)
96     {
97       /* Abbreviated information.  */
98       char *fname;
99
100       if (!find_pc_partial_function (fi->pc, &fname, 0))
101         fname = "??";
102         
103       printf_filtered ("#%-2d ", level);
104       if (addressprint)
105         printf_filtered ("0x%x in ", fi->pc);
106
107       fputs_demangled (fname, stdout, -1);
108       fputs_filtered (" (...)\n", stdout);
109       
110       return;
111     }
112 #endif
113
114   sal = find_pc_line (fi->pc, fi->next_frame);
115   func = find_pc_function (fi->pc);
116   if (func)
117     {
118       /* In certain pathological cases, the symtabs give the wrong
119          function (when we are in the first function in a file which
120          is compiled without debugging symbols, the previous function
121          is compiled with debugging symbols, and the "foo.o" symbol
122          that is supposed to tell us where the file with debugging symbols
123          ends has been truncated by ar because it is longer than 15
124          characters).
125
126          So look in the misc_function_vector as well, and if it comes
127          up with a larger address for the function use that instead.
128          I don't think this can ever cause any problems;
129          there shouldn't be any
130          misc_function_vector symbols in the middle of a function.  */
131       int misc_index = find_pc_misc_function (fi->pc);
132       if (misc_index >= 0
133           && (misc_function_vector[misc_index].address
134               > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
135         {
136           /* In this case we have no way of knowing the source file
137              and line number, so don't print them.  */
138           sal.symtab = 0;
139           /* We also don't know anything about the function besides
140              its address and name.  */
141           func = 0;
142           funname = misc_function_vector[misc_index].name;
143         }
144       else
145         funname = SYMBOL_NAME (func);
146     }
147   else
148     {
149       register int misc_index = find_pc_misc_function (fi->pc);
150       if (misc_index >= 0)
151         funname = misc_function_vector[misc_index].name;
152     }
153
154   if (source >= 0 || !sal.symtab)
155     {
156       if (level >= 0)
157         printf_filtered ("#%-2d ", level);
158       if (addressprint)
159         if (fi->pc != sal.pc || !sal.symtab)
160           printf_filtered ("0x%x in ", fi->pc);
161       fputs_demangled (funname ? funname : "??", stdout, -1);
162       wrap_here ("   ");
163       fputs_filtered (" (", stdout);
164       if (args)
165         {
166           FRAME_NUM_ARGS (numargs, fi);
167           print_frame_args (func, fi, numargs, stdout);
168         }
169       printf_filtered (")");
170       if (sal.symtab && sal.symtab->filename)
171         {
172           wrap_here ("   ");
173           printf_filtered (" at %s:%d", sal.symtab->filename, sal.line);
174         }
175       printf_filtered ("\n");
176     }
177
178   if ((source != 0) && sal.symtab)
179     {
180       int done = 0;
181       int mid_statement = source < 0 && fi->pc != sal.pc;
182       if (frame_file_full_name)
183         done = identify_source_line (sal.symtab, sal.line, mid_statement);
184       if (!done)
185         {
186           if (addressprint && mid_statement)
187             printf_filtered ("0x%x\t", fi->pc);
188           print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
189         }
190       current_source_line = max (sal.line - lines_to_list () / 2, 1);
191     }
192   if (source != 0)
193     set_default_breakpoint (1, fi->pc, sal.symtab, sal.line);
194
195   fflush (stdout);
196 }
197
198 /* Call here to print info on selected frame, after a trap.  */
199
200 void
201 print_sel_frame (just_source)
202      int just_source;
203 {
204   print_stack_frame (selected_frame, -1, just_source ? -1 : 1);
205 }
206
207 /* Print info on the selected frame, including level number
208    but not source.  */
209
210 void
211 print_selected_frame ()
212 {
213   print_stack_frame (selected_frame, selected_frame_level, 0);
214 }
215
216 void flush_cached_frames ();
217
218 #ifdef FRAME_SPECIFICATION_DYADIC
219 extern FRAME setup_arbitrary_frame ();
220 #endif
221
222 /*
223  * Read a frame specification in whatever the appropriate format is.
224  * Call error() if the specification is in any way invalid (i.e.
225  * this function never returns NULL).
226  */
227 static FRAME
228 parse_frame_specification (frame_exp)
229      char *frame_exp;
230 {
231   int numargs = 0;
232   int arg1, arg2;
233   
234   if (frame_exp)
235     {
236       char *addr_string, *p;
237       struct cleanup *tmp_cleanup;
238
239       while (*frame_exp == ' ') frame_exp++;
240       for (p = frame_exp; *p && *p != ' '; p++)
241         ;
242
243       if (*frame_exp)
244         {
245           numargs = 1;
246           addr_string = savestring(frame_exp, p - frame_exp);
247
248           {
249             tmp_cleanup = make_cleanup (free, addr_string);
250             arg1 = parse_and_eval_address (addr_string);
251             do_cleanups (tmp_cleanup);
252           }
253
254           while (*p == ' ') p++;
255           
256           if (*p)
257             {
258               numargs = 2;
259               arg2 = parse_and_eval_address (p);
260             }
261         }
262     }
263
264   switch (numargs)
265     {
266     case 0:
267       if (selected_frame == NULL)
268         error ("No selected frame.");
269       return selected_frame;
270       /* NOTREACHED */
271     case 1:
272       {
273         int level = arg1;
274         FRAME fid = find_relative_frame (get_current_frame (), &level);
275         FRAME tfid;
276
277         if (level == 0)
278           /* find_relative_frame was successful */
279           return fid;
280
281         /* If (s)he specifies the frame with an address, he deserves what
282            (s)he gets.  Still, give the highest one that matches.  */
283
284         for (fid = get_current_frame ();
285              fid && FRAME_FP (fid) != arg1;
286              fid = get_prev_frame (fid))
287           ;
288
289         if (fid)
290           while ((tfid = get_prev_frame (fid)) &&
291                  (FRAME_FP (tfid) == arg1))
292             fid = tfid;
293           
294 #ifdef FRAME_SPECIFICATION_DYADIC
295         if (!fid)
296           error ("Incorrect number of args in frame specification");
297
298         return fid;
299 #else
300         return create_new_frame (arg1, 0);
301 #endif
302       }
303       /* NOTREACHED */
304     case 2:
305       /* Must be addresses */
306 #ifndef FRAME_SPECIFICATION_DYADIC
307       error ("Incorrect number of args in frame specification");
308 #else
309       return setup_arbitrary_frame (arg1, arg2);
310 #endif
311       /* NOTREACHED */
312     }
313   fatal ("Internal: Error in parsing in parse_frame_specification");
314   /* NOTREACHED */
315 }
316
317 /* FRAME_ARGS_ADDRESS_CORRECT is just like FRAME_ARGS_ADDRESS except
318    that if it is unsure about the answer, it returns 0
319    instead of guessing (this happens on the VAX and i960, for example).
320
321    On most machines, we never have to guess about the args address,
322    so FRAME_ARGS_ADDRESS{,_CORRECT} are the same.  */
323 #if !defined (FRAME_ARGS_ADDRESS_CORRECT)
324 #define FRAME_ARGS_ADDRESS_CORRECT FRAME_ARGS_ADDRESS
325 #endif
326
327 /* Print verbosely the selected frame or the frame at address ADDR.
328    This means absolutely all information in the frame is printed.  */
329
330 static void
331 frame_info (addr_exp)
332      char *addr_exp;
333 {
334   FRAME frame;
335   struct frame_info *fi;
336   struct frame_saved_regs fsr;
337   struct symtab_and_line sal;
338   struct symbol *func;
339   FRAME calling_frame;
340   int i, count;
341   char *funname = 0;
342
343   if (!target_has_stack)
344     error ("No inferior or core file.");
345
346   frame = parse_frame_specification (addr_exp);
347   if (!frame)
348     error ("Invalid frame specified.");
349
350   fi = get_frame_info (frame);
351   sal = find_pc_line (fi->pc, fi->next_frame);
352   func = get_frame_function (frame);
353   if (func)
354     funname = SYMBOL_NAME (func);
355   else
356     {
357       register int misc_index = find_pc_misc_function (fi->pc);
358       if (misc_index >= 0)
359         funname = misc_function_vector[misc_index].name;
360     }
361   calling_frame = get_prev_frame (frame);
362
363   if (!addr_exp && selected_frame_level >= 0)
364     printf_filtered ("Stack level %d, frame at 0x%x:\n %s = 0x%x",
365             selected_frame_level, FRAME_FP(frame),
366             reg_names[PC_REGNUM], fi->pc);
367   else
368     printf_filtered ("Stack frame at 0x%x:\n %s = 0x%x",
369             FRAME_FP(frame), reg_names[PC_REGNUM], fi->pc);
370
371   wrap_here ("   ");
372   if (funname)
373     printf_filtered (" in %s", funname);
374   wrap_here ("   ");
375   if (sal.symtab)
376     printf_filtered (" (%s:%d)", sal.symtab->filename, sal.line);
377   puts_filtered ("; ");
378   wrap_here ("    ");
379   printf_filtered ("saved %s 0x%x\n", reg_names[PC_REGNUM],
380                                       FRAME_SAVED_PC (frame));
381   if (calling_frame)
382     printf_filtered (" called by frame at 0x%x", FRAME_FP (calling_frame));
383   if (fi->next_frame && calling_frame)
384     puts_filtered (",");
385   wrap_here ("   ");
386   if (fi->next_frame)
387     printf_filtered (" caller of frame at 0x%x", fi->next_frame);
388   if (fi->next_frame || calling_frame)
389     puts_filtered ("\n");
390
391   {
392     /* Address of the argument list for this frame, or 0.  */
393     CORE_ADDR arg_list = FRAME_ARGS_ADDRESS_CORRECT (fi);
394     /* Number of args for this frame, or -1 if unknown.  */
395     int numargs;
396
397     if (arg_list == 0)
398         printf_filtered (" Arglist at unknown address.\n");
399     else
400       {
401         printf_filtered (" Arglist at 0x%x,", arg_list);
402
403         FRAME_NUM_ARGS (numargs, fi);
404         if (numargs < 0)
405           puts_filtered (" args: ");
406         else if (numargs == 0)
407           puts_filtered (" no args.");
408         else if (numargs == 1)
409           puts_filtered (" 1 arg: ");
410         else
411           printf_filtered (" %d args: ", numargs);
412         print_frame_args (func, fi, numargs, stdout);
413         puts_filtered ("\n");
414       }
415   }
416
417 #if defined (FRAME_FIND_SAVED_REGS)  
418   get_frame_saved_regs (fi, &fsr);
419   /* The sp is special; what's returned isn't the save address, but
420      actually the value of the previous frame's sp.  */
421   printf_filtered (" Previous frame's sp is 0x%x\n", fsr.regs[SP_REGNUM]);
422   count = 0;
423   for (i = 0; i < NUM_REGS; i++)
424     if (fsr.regs[i] && i != SP_REGNUM)
425       {
426         if (count == 0)
427           puts_filtered (" Saved registers:\n ");
428         else
429           puts_filtered (",");
430         wrap_here (" ");
431         printf_filtered (" %s at 0x%x", reg_names[i], fsr.regs[i]);
432         count++;
433       }
434   if (count)
435     puts_filtered ("\n");
436 #endif /* Have FRAME_FIND_SAVED_REGS.  */
437 }
438
439 #if 0
440 /* Set a limit on the number of frames printed by default in a
441    backtrace.  */
442
443 static int backtrace_limit;
444
445 static void
446 set_backtrace_limit_command (count_exp, from_tty)
447      char *count_exp;
448      int from_tty;
449 {
450   int count = parse_and_eval_address (count_exp);
451
452   if (count < 0)
453     error ("Negative argument not meaningful as backtrace limit.");
454
455   backtrace_limit = count;
456 }
457
458 static void
459 backtrace_limit_info (arg, from_tty)
460      char *arg;
461      int from_tty;
462 {
463   if (arg)
464     error ("\"Info backtrace-limit\" takes no arguments.");
465
466   printf ("Backtrace limit: %d.\n", backtrace_limit);
467 }
468 #endif
469
470 /* Print briefly all stack frames or just the innermost COUNT frames.  */
471
472 static void
473 backtrace_command (count_exp, from_tty)
474      char *count_exp;
475      int from_tty;
476 {
477   struct frame_info *fi;
478   register int count;
479   register FRAME frame;
480   register int i;
481   register FRAME trailing;
482   register int trailing_level;
483
484   if (!target_has_stack)
485     error ("No stack.");
486
487   /* The following code must do two things.  First, it must
488      set the variable TRAILING to the frame from which we should start
489      printing.  Second, it must set the variable count to the number
490      of frames which we should print, or -1 if all of them.  */
491   trailing = get_current_frame ();
492   trailing_level = 0;
493   if (count_exp)
494     {
495       count = parse_and_eval_address (count_exp);
496       if (count < 0)
497         {
498           FRAME current;
499
500           count = -count;
501
502           current = trailing;
503           while (current && count--)
504             {
505               QUIT;
506               current = get_prev_frame (current);
507             }
508           
509           /* Will stop when CURRENT reaches the top of the stack.  TRAILING
510              will be COUNT below it.  */
511           while (current)
512             {
513               QUIT;
514               trailing = get_prev_frame (trailing);
515               current = get_prev_frame (current);
516               trailing_level++;
517             }
518           
519           count = -1;
520         }
521     }
522   else
523     count = -1;
524
525   if (info_verbose)
526     {
527       struct partial_symtab *ps;
528       
529       /* Read in symbols for all of the frames.  Need to do this in
530          a separate pass so that "Reading in symbols for xxx" messages
531          don't screw up the appearance of the backtrace.  Also
532          if people have strong opinions against reading symbols for
533          backtrace this may have to be an option.  */
534       i = count;
535       for (frame = trailing;
536            frame != NULL && i--;
537            frame = get_prev_frame (frame))
538         {
539           QUIT;
540           fi = get_frame_info (frame);
541           ps = find_pc_psymtab (fi->pc);
542           if (ps)
543             (void) PSYMTAB_TO_SYMTAB (ps);      /* Force syms to come in */
544         }
545     }
546
547   for (i = 0, frame = trailing;
548        frame && count--;
549        i++, frame = get_prev_frame (frame))
550     {
551       QUIT;
552       fi = get_frame_info (frame);
553       print_frame_info (fi, trailing_level + i, 0, 1);
554     }
555
556   /* If we've stopped before the end, mention that.  */
557   if (frame && from_tty)
558     printf_filtered ("(More stack frames follow...)\n");
559 }
560 \f
561 /* Print the local variables of a block B active in FRAME.
562    Return 1 if any variables were printed; 0 otherwise.  */
563
564 static int
565 print_block_frame_locals (b, frame, stream)
566      struct block *b;
567      register FRAME frame;
568      register FILE *stream;
569 {
570   int nsyms;
571   register int i;
572   register struct symbol *sym;
573   register int values_printed = 0;
574
575   nsyms = BLOCK_NSYMS (b);
576
577   for (i = 0; i < nsyms; i++)
578     {
579       sym = BLOCK_SYM (b, i);
580       if (SYMBOL_CLASS (sym) == LOC_LOCAL
581           || SYMBOL_CLASS (sym) == LOC_REGISTER
582           || SYMBOL_CLASS (sym) == LOC_STATIC)
583         {
584           values_printed = 1;
585           fprint_symbol (stream, SYMBOL_NAME (sym));
586           fputs_filtered (" = ", stream);
587           print_variable_value (sym, frame, stream);
588           fprintf_filtered (stream, "\n");
589           fflush (stream);
590         }
591     }
592   return values_printed;
593 }
594
595 /* Same, but print labels.
596    FIXME, this does not even reference FRAME... --gnu  */
597
598 static int
599 print_block_frame_labels (b, frame, have_default, stream)
600      struct block *b;
601      register FRAME frame;
602      int *have_default;
603      register FILE *stream;
604 {
605   int nsyms;
606   register int i;
607   register struct symbol *sym;
608   register int values_printed = 0;
609
610   nsyms = BLOCK_NSYMS (b);
611
612   for (i = 0; i < nsyms; i++)
613     {
614       sym = BLOCK_SYM (b, i);
615       if (! strcmp (SYMBOL_NAME (sym), "default"))
616         {
617           if (*have_default)
618             continue;
619           *have_default = 1;
620         }
621       if (SYMBOL_CLASS (sym) == LOC_LABEL)
622         {
623           struct symtab_and_line sal;
624           sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
625           values_printed = 1;
626           fputs_demangled (SYMBOL_NAME (sym), stream, 1);
627           if (addressprint)
628             fprintf_filtered (stream, " 0x%x", SYMBOL_VALUE_ADDRESS (sym));
629           fprintf_filtered (stream, " in file %s, line %d\n",
630                             sal.symtab->filename, sal.line);
631           fflush (stream);
632         }
633     }
634   return values_printed;
635 }
636
637 /* Print on STREAM all the local variables in frame FRAME,
638    including all the blocks active in that frame
639    at its current pc.
640
641    Returns 1 if the job was done,
642    or 0 if nothing was printed because we have no info
643    on the function running in FRAME.  */
644
645 static int
646 print_frame_local_vars (frame, stream)
647      register FRAME frame;
648      register FILE *stream;
649 {
650   register struct block *block = get_frame_block (frame);
651   register int values_printed = 0;
652
653   if (block == 0)
654     {
655       fprintf_filtered (stream, "No symbol table info available.\n");
656       fflush (stream);
657       return 0;
658     }
659   
660   while (block != 0)
661     {
662       if (print_block_frame_locals (block, frame, stream))
663         values_printed = 1;
664       /* After handling the function's top-level block, stop.
665          Don't continue to its superblock, the block of
666          per-file symbols.  */
667       if (BLOCK_FUNCTION (block))
668         break;
669       block = BLOCK_SUPERBLOCK (block);
670     }
671
672   if (!values_printed)
673     {
674       fprintf_filtered (stream, "No locals.\n");
675       fflush (stream);
676     }
677   
678   return 1;
679 }
680
681 /* Same, but print labels.  */
682
683 static int
684 print_frame_label_vars (frame, this_level_only, stream)
685      register FRAME frame;
686      int this_level_only;
687      register FILE *stream;
688 {
689   extern struct blockvector *blockvector_for_pc ();
690   register struct blockvector *bl;
691   register struct block *block = get_frame_block (frame);
692   register int values_printed = 0;
693   int index, have_default = 0;
694   char *blocks_printed;
695   struct frame_info *fi = get_frame_info (frame);
696   CORE_ADDR pc = fi->pc;
697
698   if (block == 0)
699     {
700       fprintf_filtered (stream, "No symbol table info available.\n");
701       fflush (stream);
702       return 0;
703     }
704
705   bl = blockvector_for_pc (BLOCK_END (block) - 4, &index);
706   blocks_printed = (char *) alloca (BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
707   bzero (blocks_printed, BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
708
709   while (block != 0)
710     {
711       CORE_ADDR end = BLOCK_END (block) - 4;
712       int last_index;
713
714       if (bl != blockvector_for_pc (end, &index))
715         error ("blockvector blotch");
716       if (BLOCKVECTOR_BLOCK (bl, index) != block)
717         error ("blockvector botch");
718       last_index = BLOCKVECTOR_NBLOCKS (bl);
719       index += 1;
720
721       /* Don't print out blocks that have gone by.  */
722       while (index < last_index
723              && BLOCK_END (BLOCKVECTOR_BLOCK (bl, index)) < pc)
724         index++;
725
726       while (index < last_index
727              && BLOCK_END (BLOCKVECTOR_BLOCK (bl, index)) < end)
728         {
729           if (blocks_printed[index] == 0)
730             {
731               if (print_block_frame_labels (BLOCKVECTOR_BLOCK (bl, index), frame, &have_default, stream))
732                 values_printed = 1;
733               blocks_printed[index] = 1;
734             }
735           index++;
736         }
737       if (have_default)
738         return 1;
739       if (values_printed && this_level_only)
740         return 1;
741
742       /* After handling the function's top-level block, stop.
743          Don't continue to its superblock, the block of
744          per-file symbols.  */
745       if (BLOCK_FUNCTION (block))
746         break;
747       block = BLOCK_SUPERBLOCK (block);
748     }
749
750   if (!values_printed && !this_level_only)
751     {
752       fprintf_filtered (stream, "No catches.\n");
753       fflush (stream);
754     }
755   
756   return values_printed;
757 }
758
759 /* ARGSUSED */
760 static void
761 locals_info (args, from_tty)
762      char *args;
763      int from_tty;
764 {
765   if (!target_has_stack)
766     error ("No stack.");
767
768   print_frame_local_vars (selected_frame, stdout);
769 }
770
771 static void
772 catch_info ()
773 {
774   if (!target_has_stack)
775     error ("No stack.");
776
777   print_frame_label_vars (selected_frame, 0, stdout);
778 }
779
780 static int
781 print_frame_arg_vars (frame, stream)
782      register FRAME frame;
783      register FILE *stream;
784 {
785   struct symbol *func = get_frame_function (frame);
786   register struct block *b;
787   int nsyms;
788   register int i;
789   register struct symbol *sym, *sym2;
790   register int values_printed = 0;
791
792   if (func == 0)
793     {
794       fprintf_filtered (stream, "No symbol table info available.\n");
795       fflush (stream);
796       return 0;
797     }
798
799   b = SYMBOL_BLOCK_VALUE (func);
800   nsyms = BLOCK_NSYMS (b);
801
802   for (i = 0; i < nsyms; i++)
803     {
804       sym = BLOCK_SYM (b, i);
805       if (SYMBOL_CLASS (sym) == LOC_ARG
806           || SYMBOL_CLASS (sym) == LOC_LOCAL_ARG
807           || SYMBOL_CLASS (sym) == LOC_REF_ARG
808           || SYMBOL_CLASS (sym) == LOC_REGPARM)
809         {
810           values_printed = 1;
811           fprint_symbol (stream, SYMBOL_NAME (sym));
812           fputs_filtered (" = ", stream);
813           /* We have to look up the symbol because arguments often have
814              two entries (one a parameter, one a register) and the one
815              we want is the register, which lookup_symbol will find for
816              us.  */
817           sym2 = lookup_symbol (SYMBOL_NAME (sym),
818                         b, VAR_NAMESPACE, (int *)NULL, (struct symtab **)NULL);
819           print_variable_value (sym2, frame, stream);
820           fprintf_filtered (stream, "\n");
821           fflush (stream);
822         }
823     }
824
825   if (!values_printed)
826     {
827       fprintf_filtered (stream, "No arguments.\n");
828       fflush (stream);
829     }
830
831   return 1;
832 }
833
834 static void
835 args_info ()
836 {
837   if (!target_has_stack)
838     error ("No stack.");
839   print_frame_arg_vars (selected_frame, stdout);
840 }
841 \f
842 /* Select frame FRAME, and note that its stack level is LEVEL.
843    LEVEL may be -1 if an actual level number is not known.  */
844
845 void
846 select_frame (frame, level)
847      FRAME frame;
848      int level;
849 {
850   selected_frame = frame;
851   selected_frame_level = level;
852   /* Ensure that symbols for this frame are readin.  */
853   if (frame)
854     find_pc_symtab (get_frame_info (frame)->pc);
855 }
856
857 /* Store the selected frame and its level into *FRAMEP and *LEVELP.
858    If there is no selected frame, *FRAMEP is set to NULL.  */
859
860 void
861 record_selected_frame (frameaddrp, levelp)
862      FRAME_ADDR *frameaddrp;
863      int *levelp;
864 {
865   *frameaddrp = selected_frame ? FRAME_FP (selected_frame) : NULL;
866   *levelp = selected_frame_level;
867 }
868
869 /* Return the symbol-block in which the selected frame is executing.
870    Can return zero under various legitimate circumstances.  */
871
872 struct block *
873 get_selected_block ()
874 {
875   if (!target_has_stack)
876     return 0;
877
878   if (!selected_frame)
879     return get_current_block ();
880   return get_frame_block (selected_frame);
881 }
882
883 /* Find a frame a certain number of levels away from FRAME.
884    LEVEL_OFFSET_PTR points to an int containing the number of levels.
885    Positive means go to earlier frames (up); negative, the reverse.
886    The int that contains the number of levels is counted toward
887    zero as the frames for those levels are found.
888    If the top or bottom frame is reached, that frame is returned,
889    but the final value of *LEVEL_OFFSET_PTR is nonzero and indicates
890    how much farther the original request asked to go.  */
891
892 FRAME
893 find_relative_frame (frame, level_offset_ptr)
894      register FRAME frame;
895      register int* level_offset_ptr;
896 {
897   register FRAME prev;
898   register FRAME frame1, frame2;
899
900   /* Going up is simple: just do get_prev_frame enough times
901      or until initial frame is reached.  */
902   while (*level_offset_ptr > 0)
903     {
904       prev = get_prev_frame (frame);
905       if (prev == 0)
906         break;
907       (*level_offset_ptr)--;
908       frame = prev;
909     }
910   /* Going down could be done by iterating get_frame_info to
911      find the next frame, but that would be quadratic
912      since get_frame_info must scan all the way from the current frame.
913      The following algorithm is linear.  */
914   if (*level_offset_ptr < 0)
915     {
916       /* First put frame1 at innermost frame
917          and frame2 N levels up from there.  */
918       frame1 = get_current_frame ();
919       frame2 = frame1;
920       while (*level_offset_ptr < 0 && frame2 != frame)
921         {
922           frame2 = get_prev_frame (frame2);
923           (*level_offset_ptr) ++;
924         }
925       /* Then slide frame1 and frame2 up in synchrony
926          and when frame2 reaches our starting point
927          frame1 must be N levels down from there.  */
928       while (frame2 != frame)
929         {
930           frame1 = get_prev_frame (frame1);
931           frame2 = get_prev_frame (frame2);
932         }
933       return frame1;
934     }
935   return frame;
936 }
937
938 /* The "frame" command.  With no arg, print selected frame briefly.
939    With arg LEVEL_EXP, select the frame at level LEVEL if it is a
940    valid level.  Otherwise, treat level_exp as an address expression
941    and print it.  See parse_frame_specification for more info on proper
942    frame expressions. */
943
944 static void
945 frame_command (level_exp, from_tty)
946      char *level_exp;
947      int from_tty;
948 {
949   register FRAME frame, frame1;
950   unsigned int level = 0;
951
952   if (!target_has_stack)
953     error ("No stack.");
954
955   frame = parse_frame_specification (level_exp);
956
957   for (frame1 = get_prev_frame (0);
958        frame1 && frame1 != frame;
959        frame1 = get_prev_frame (frame1))
960     level++;
961
962   if (!frame1)
963     level = 0;
964
965   select_frame (frame, level);
966
967   if (!from_tty)
968     return;
969
970   print_stack_frame (selected_frame, selected_frame_level, 1);
971 }
972
973 /* Select the frame up one or COUNT stack levels
974    from the previously selected frame, and print it briefly.  */
975
976 /* ARGSUSED */
977 static void
978 up_silently_command (count_exp, from_tty)
979      char *count_exp;
980      int from_tty;
981 {
982   register FRAME frame;
983   int count = 1, count1;
984   if (count_exp)
985     count = parse_and_eval_address (count_exp);
986   count1 = count;
987   
988   if (!target_has_stack)
989     error ("No stack.");
990
991   frame = find_relative_frame (selected_frame, &count1);
992   if (count1 != 0 && count_exp == 0)
993     error ("Initial frame selected; you cannot go up.");
994   select_frame (frame, selected_frame_level + count - count1);
995 }
996
997 static void
998 up_command (count_exp, from_tty)
999      char *count_exp;
1000      int from_tty;
1001 {
1002   up_silently_command (count_exp, from_tty);
1003   print_stack_frame (selected_frame, selected_frame_level, 1);
1004 }
1005
1006 /* Select the frame down one or COUNT stack levels
1007    from the previously selected frame, and print it briefly.  */
1008
1009 /* ARGSUSED */
1010 static void
1011 down_silently_command (count_exp, from_tty)
1012      char *count_exp;
1013      int from_tty;
1014 {
1015   register FRAME frame;
1016   int count = -1, count1;
1017   if (count_exp)
1018     count = - parse_and_eval_address (count_exp);
1019   count1 = count;
1020   
1021   frame = find_relative_frame (selected_frame, &count1);
1022   if (count1 != 0 && count_exp == 0)
1023     error ("Bottom (i.e., innermost) frame selected; you cannot go down.");
1024   select_frame (frame, selected_frame_level + count - count1);
1025 }
1026
1027
1028 static void
1029 down_command (count_exp, from_tty)
1030      char *count_exp;
1031      int from_tty;
1032 {
1033   down_silently_command (count_exp, from_tty);
1034   print_stack_frame (selected_frame, selected_frame_level, 1);
1035 }
1036 \f
1037 static void
1038 return_command (retval_exp, from_tty)
1039      char *retval_exp;
1040      int from_tty;
1041 {
1042   struct symbol *thisfun;
1043   FRAME_ADDR selected_frame_addr;
1044   CORE_ADDR selected_frame_pc;
1045   FRAME frame;
1046
1047   if (selected_frame == NULL)
1048     error ("No selected frame.");
1049   thisfun = get_frame_function (selected_frame);
1050   selected_frame_addr = FRAME_FP (selected_frame);
1051   selected_frame_pc = (get_frame_info (selected_frame))->pc;
1052
1053   /* If interactive, require confirmation.  */
1054
1055   if (from_tty)
1056     {
1057       if (thisfun != 0)
1058         {
1059           if (!query ("Make %s return now? ", SYMBOL_NAME (thisfun)))
1060             error ("Not confirmed.");
1061         }
1062       else
1063         if (!query ("Make selected stack frame return now? "))
1064           error ("Not confirmed.");
1065     }
1066
1067   /* Do the real work.  Pop until the specified frame is current.  We
1068      use this method because the selected_frame is not valid after
1069      a POP_FRAME.  The pc comparison makes this work even if the
1070      selected frame shares its fp with another frame.  */
1071
1072   while ( selected_frame_addr != FRAME_FP (frame = get_current_frame())
1073        || selected_frame_pc   != (get_frame_info (frame))->pc  )
1074     POP_FRAME;
1075
1076   /* Then pop that frame.  */
1077
1078   POP_FRAME;
1079
1080   /* Compute the return value (if any) and store in the place
1081      for return values.  */
1082
1083   if (retval_exp)
1084     set_return_value (parse_and_eval (retval_exp));
1085
1086   /* If interactive, print the frame that is now current.  */
1087
1088   if (from_tty)
1089     frame_command ("0", 1);
1090 }
1091 \f
1092 void
1093 _initialize_stack ()
1094 {
1095 #if 0  
1096   backtrace_limit = 30;
1097 #endif
1098
1099   add_com ("return", class_stack, return_command,
1100            "Make selected stack frame return to its caller.\n\
1101 Control remains in the debugger, but when you continue\n\
1102 execution will resume in the frame above the one now selected.\n\
1103 If an argument is given, it is an expression for the value to return.");
1104
1105   add_com ("up", class_stack, up_command,
1106            "Select and print stack frame that called this one.\n\
1107 An argument says how many frames up to go.");
1108   add_com ("up-silently", class_support, up_silently_command,
1109            "Same as the `up' command, but does not print anything.\n\
1110 This is useful in command scripts.");
1111
1112   add_com ("down", class_stack, down_command,
1113            "Select and print stack frame called by this one.\n\
1114 An argument says how many frames down to go.");
1115   add_com_alias ("do", "down", class_stack, 1);
1116   add_com ("down-silently", class_support, down_silently_command,
1117            "Same as the `down' command, but does not print anything.\n\
1118 This is useful in command scripts.");
1119
1120   add_com ("frame", class_stack, frame_command,
1121            "Select and print a stack frame.\n\
1122 With no argument, print the selected stack frame.  (See also \"info frame\").\n\
1123 An argument specifies the frame to select.\n\
1124 It can be a stack frame number or the address of the frame.\n\
1125 With argument, nothing is printed if input is coming from\n\
1126 a command file or a user-defined command.");
1127
1128   add_com_alias ("f", "frame", class_stack, 1);
1129
1130   add_com ("backtrace", class_stack, backtrace_command,
1131            "Print backtrace of all stack frames, or innermost COUNT frames.\n\
1132 With a negative argument, print outermost -COUNT frames.");
1133   add_com_alias ("bt", "backtrace", class_stack, 0);
1134   add_com_alias ("where", "backtrace", class_alias, 0);
1135   add_info ("stack", backtrace_command,
1136             "Backtrace of the stack, or innermost COUNT frames.");
1137   add_info_alias ("s", "stack", 1);
1138   add_info ("frame", frame_info,
1139             "All about selected stack frame, or frame at ADDR.");
1140   add_info_alias ("f", "frame", 1);
1141   add_info ("locals", locals_info,
1142             "Local variables of current stack frame.");
1143   add_info ("args", args_info,
1144             "Argument variables of current stack frame.");
1145   add_info ("catch", catch_info,
1146             "Exceptions that can be caught in the current stack frame.");
1147
1148 #if 0
1149   add_cmd ("backtrace-limit", class_stack, set_backtrace_limit_command, 
1150            "Specify maximum number of frames for \"backtrace\" to print by default.",
1151            &setlist);
1152   add_info ("backtrace-limit", backtrace_limit_info,
1153             "The maximum number of frames for \"backtrace\" to print by default.");
1154 #endif
1155 }
1156
This page took 0.08903 seconds and 4 git commands to generate.