gdb-2.5.1
[platform/upstream/binutils.git] / gdb / breakpoint.c
1 /* Everything about breakpoints, for GDB.
2    Copyright (C) 1986, 1987 Free Software Foundation, Inc.
3
4 GDB is distributed in the hope that it will be useful, but WITHOUT ANY
5 WARRANTY.  No author or distributor accepts responsibility to anyone
6 for the consequences of using it or for whether it serves any
7 particular purpose or works at all, unless he says so in writing.
8 Refer to the GDB General Public License for full details.
9
10 Everyone is granted permission to copy, modify and redistribute GDB,
11 but only under the conditions described in the GDB General Public
12 License.  A copy of this license is supposed to have been given to you
13 along with GDB so you can know your rights and responsibilities.  It
14 should be in a file named COPYING.  Among other things, the copyright
15 notice and this notice must be preserved on all copies.
16
17 In other words, go ahead and share GDB, but don't try to stop
18 anyone else from sharing it farther.  Help stamp out software hoarding!
19 */
20
21 #include "defs.h"
22 #include "initialize.h"
23 #include "param.h"
24 #include "symtab.h"
25 #include "frame.h"
26
27 #include <stdio.h>
28
29 /* This is the sequence of bytes we insert for a breakpoint.  */
30
31 static char break_insn[] = BREAKPOINT;
32
33 /* States of enablement of breakpoint.
34    `temporary' means disable when hit.
35    `once' means delete when hit.  */
36
37 enum enable { disabled, enabled, temporary, delete};
38
39 struct breakpoint
40 {
41   struct breakpoint *next;
42   /* Number assigned to distinguish breakpoints.  */
43   int number;
44   /* Address to break at.  */
45   CORE_ADDR address;
46   /* Line number of this address.  Redundant.  */
47   int line_number;
48   /* Symtab of file of this address.  Redundant.  */
49   struct symtab *symtab;
50   /* Zero means disabled; remember the info but don't break here.  */
51   enum enable enable;
52   /* Number of stops at this breakpoint that should
53      be continued automatically before really stopping.  */
54   int ignore_count;
55   /* "Real" contents of byte where breakpoint has been inserted.
56      Valid only when breakpoints are in the program.  */
57   char shadow_contents[sizeof break_insn];
58   /* Nonzero if this breakpoint is now inserted.  */
59   char inserted;
60   /* Nonzero if this is not the first breakpoint in the list
61      for the given address.  */
62   char duplicate;
63   /* Chain of command lines to execute when this breakpoint is hit.  */
64   struct command_line *commands;
65   /* Stack depth (frame).  If nonzero, break only if fp equals this.  */
66   FRAME frame;
67   /* Conditional.  Break only if this expression's value is nonzero.  */
68   struct expression *cond;
69 };
70
71 #define ALL_BREAKPOINTS(b)  for (b = breakpoint_chain; b; b = b->next)
72
73 /* Chain of all breakpoints defined.  */
74
75 struct breakpoint *breakpoint_chain;
76
77 /* Number of last breakpoint made.  */
78
79 static int breakpoint_count;
80
81 /* Default address, symtab and line to put a breakpoint at
82    for "break" command with no arg.
83    if default_breakpoint_valid is zero, the other three are
84    not valid, and "break" with no arg is an error.
85
86    This set by print_stack_frame, which calls set_default_breakpoint.  */
87
88 int default_breakpoint_valid;
89 CORE_ADDR default_breakpoint_address;
90 struct symtab *default_breakpoint_symtab;
91 int default_breakpoint_line;
92
93 /* Remaining commands (not yet executed)
94    of last breakpoint hit.  */
95
96 struct command_line *breakpoint_commands;
97
98 START_FILE
99
100 extern char *read_line ();
101
102 static void delete_breakpoint ();
103 void clear_momentary_breakpoints ();
104 void breakpoint_auto_delete ();
105 \f
106 /* condition N EXP -- set break condition of breakpoint N to EXP.  */
107
108 static void
109 condition_command (arg, from_tty)
110      char *arg;
111      int from_tty;
112 {
113   register struct breakpoint *b;
114   register char *p;
115   register int bnum;
116   register struct expression *expr;
117
118   if (arg == 0)
119     error_no_arg ("breakpoint number");
120
121   p = arg;
122   while (*p >= '0' && *p <= '9') p++;
123   bnum = atoi (arg);
124
125   ALL_BREAKPOINTS (b)
126     if (b->number == bnum)
127       {
128         if (b->cond)
129           free (b->cond);
130         if (*p == 0)
131           {
132             b->cond = 0;
133             if (from_tty)
134               printf ("Breakpoint %d now unconditional.\n", bnum);
135           }
136         else
137           {
138             if (*p != ' ' && *p != '\t')
139               error ("Arguments must be an integer (breakpoint number) and an expression.");
140
141             /* Find start of expression */
142             while (*p == ' ' || *p == '\t') p++;
143
144             arg = p;
145             b->cond = (struct expression *) parse_c_1 (&arg, block_for_pc (b->address), 0);
146             if (*arg)
147               error ("Junk at end of expression");
148           }
149         return;
150       }
151
152   error ("No breakpoint number %d.", bnum);
153 }
154
155 static void
156 commands_command (arg)
157      char *arg;
158 {
159   register struct breakpoint *b;
160   register char *p, *p1;
161   register int bnum;
162   struct command_line *l;
163
164   if (arg == 0)
165     error_no_arg ("breakpoint number");
166
167   /* If we allowed this, we would have problems with when to
168      free the storage, if we change the commands currently
169      being read from.  */
170
171   if (breakpoint_commands)
172     error ("Can't use the \"commands\" command among a breakpoint's commands.");
173
174   p = arg;
175   if (! (*p >= '0' && *p <= '9'))
176     error ("Argument must be integer (a breakpoint number).");
177
178   while (*p >= '0' && *p <= '9') p++;
179   if (*p)
180     error ("Unexpected extra arguments following breakpoint number.");
181
182   bnum = atoi (arg);
183
184   ALL_BREAKPOINTS (b)
185     if (b->number == bnum)
186       {
187         if (input_from_terminal_p ())
188           printf ("Type commands for when breakpoint %d is hit, one per line.\n\
189 End with a line saying just \"end\".\n", bnum);
190         l = read_command_lines ();
191         free_command_lines (&b->commands);
192         b->commands = l;
193         return;
194       }
195   error ("No breakpoint number %d.", bnum);
196 }
197
198 /* Called from command loop to execute the commands
199    associated with the breakpoint we just stopped at.  */
200
201 void
202 do_breakpoint_commands ()
203 {
204   while (breakpoint_commands)
205     {
206       char *line = breakpoint_commands->line;
207       breakpoint_commands = breakpoint_commands->next;
208       execute_command (line, 0);
209       /* If command was "cont", breakpoint_commands is now 0,
210          of if we stopped at yet another breakpoint which has commands,
211          it is now the commands for the new breakpoint.  */
212     }
213   clear_momentary_breakpoints ();
214 }
215
216 /* Used when the program is proceeded, to eliminate any remaining
217    commands attached to the previous breakpoint we stopped at.  */
218
219 void
220 clear_breakpoint_commands ()
221 {
222   breakpoint_commands = 0;
223   breakpoint_auto_delete (0);
224 }
225
226 /* Functions to get and set the current list of pending
227    breakpoint commands.  These are used by run_stack_dummy
228    to preserve the commands around a function call.  */
229
230 struct command_line *
231 get_breakpoint_commands ()
232 {
233   return breakpoint_commands;
234 }
235
236 void
237 set_breakpoint_commands (cmds)
238      struct command_line *cmds;
239 {
240   breakpoint_commands = cmds;
241 }
242 \f
243 /* insert_breakpoints is used when starting or continuing the program.
244    remove_breakpoints is used when the program stops.
245    Both return zero if successful,
246    or an `errno' value if could not write the inferior.  */
247
248 int
249 insert_breakpoints ()
250 {
251   register struct breakpoint *b;
252   int val;
253
254 /*   printf ("Inserting breakpoints.\n"); */
255   ALL_BREAKPOINTS (b)
256     if (b->enable != disabled && ! b->inserted && ! b->duplicate)
257       {
258         read_memory (b->address, b->shadow_contents, sizeof break_insn);
259         val = write_memory (b->address, break_insn, sizeof break_insn);
260         if (val)
261           return val;
262 /*      printf ("Inserted breakpoint at 0x%x, shadow 0x%x, 0x%x.\n",
263                 b->address, b->shadow_contents[0], b->shadow_contents[1]); */
264         b->inserted = 1;
265       }
266   return 0;
267 }
268
269 int
270 remove_breakpoints ()
271 {
272   register struct breakpoint *b;
273   int val;
274
275 /*   printf ("Removing breakpoints.\n"); */
276   ALL_BREAKPOINTS (b)
277     if (b->inserted)
278       {
279         val = write_memory (b->address, b->shadow_contents, sizeof break_insn);
280         if (val)
281           return val;
282         b->inserted = 0;
283 /*      printf ("Removed breakpoint at 0x%x, shadow 0x%x, 0x%x.\n",
284                 b->address, b->shadow_contents[0], b->shadow_contents[1]); */
285       }
286
287   return 0;
288 }
289
290 /* Clear the "inserted" flag in all breakpoints.
291    This is done when the inferior is loaded.  */
292
293 int
294 mark_breakpoints_out ()
295 {
296   register struct breakpoint *b;
297
298   ALL_BREAKPOINTS (b)
299     b->inserted = 0;
300 }
301
302 /* breakpoint_here_p (PC) returns 1 if an enabled breakpoint exists at PC.
303    When continuing from a location with a breakpoint,
304    we actually single step once before calling insert_breakpoints.  */
305
306 int
307 breakpoint_here_p (pc)
308      CORE_ADDR pc;
309 {
310   register struct breakpoint *b;
311
312   ALL_BREAKPOINTS (b)
313     if (b->enable != disabled && b->address == pc)
314       return 1;
315
316   return 0;
317 }
318
319 /* Return 0 if PC is not the address just after a breakpoint,
320    or -1 if breakpoint says do not stop now,
321    or -2 if breakpoint says it has deleted itself and don't stop,
322    or -3 if hit a breakpoint number -3 (delete when program stops),
323    or else the number of the breakpoint,
324    with 0x1000000 added for a silent breakpoint.  */
325
326 int
327 breakpoint_stop_status (pc, frame)
328      CORE_ADDR pc;
329      FRAME frame;
330 {
331   register struct breakpoint *b;
332   register int cont = 0;
333
334   /* Get the address where the breakpoint would have been.  */
335   pc -= DECR_PC_AFTER_BREAK;
336
337   ALL_BREAKPOINTS (b)
338     if (b->enable != disabled && b->address == pc)
339       {
340         if (b->frame && b->frame != frame)
341           cont = -1;
342         else
343           {
344             int value_zero;
345             if (b->cond)
346               {
347                 value_zero = value_zerop (evaluate_expression (b->cond));
348                 free_all_values ();
349               }
350             if (b->cond && value_zero)
351               {
352                 cont = -1;
353               }
354             else if (b->ignore_count > 0)
355               {
356                 b->ignore_count--;
357                 cont = -1;
358               }
359             else
360               {
361                 if (b->enable == temporary)
362                   b->enable = disabled;
363                 breakpoint_commands = b->commands;
364                 if (breakpoint_commands
365                     && !strcmp ("silent", breakpoint_commands->line))
366                   {
367                     breakpoint_commands = breakpoint_commands->next;
368                     return 0x1000000 + b->number;
369                   }
370                 return b->number;
371               }
372           }
373       }
374
375   return cont;
376 }
377 \f
378 static void
379 breakpoint_1 (bnum)
380      int bnum;
381 {
382   register struct breakpoint *b;
383   register struct command_line *l;
384   register struct symbol *sym;
385   CORE_ADDR last_addr = -1;
386
387   ALL_BREAKPOINTS (b)
388     if (bnum == -1 || bnum == b->number)
389       {
390         printf ("#%-3d %c  0x%08x ", b->number,
391                 "nyod"[(int) b->enable],
392                 b->address);
393         last_addr = b->address;
394         if (b->symtab)
395           {
396             sym = find_pc_function (b->address);
397             if (sym)
398               printf (" in %s (%s line %d)", SYMBOL_NAME (sym),
399                       b->symtab->filename, b->line_number);
400             else
401               printf ("%s line %d", b->symtab->filename, b->line_number);
402           }
403         printf ("\n");
404
405         if (b->ignore_count)
406           printf ("\tignore next %d hits\n", b->ignore_count);
407         if (b->frame)
408           printf ("\tstop only in stack frame at 0x%x\n", b->frame);
409         if (b->cond)
410           {
411             printf ("\tbreak only if ");
412             print_expression (b->cond, stdout);
413             printf ("\n");
414           }
415         if (l = b->commands)
416           while (l)
417             {
418               printf ("\t%s\n", l->line);
419               l = l->next;
420             }
421       }
422
423   if (last_addr != -1)
424     set_next_address (last_addr);
425 }
426
427 static void
428 breakpoints_info (bnum_exp)
429      char *bnum_exp;
430 {
431   int bnum = -1;
432
433   if (bnum_exp)
434     bnum = parse_and_eval_address (bnum_exp);
435   else if (breakpoint_chain == 0)
436     printf ("No breakpoints.\n");
437   else
438     printf ("Breakpoints:\n\
439 Num Enb   Address    Where\n");
440
441   breakpoint_1 (bnum);
442 }
443
444 /* Print a message describing any breakpoints set at PC.  */
445
446 static void
447 describe_other_breakpoints (pc)
448      register CORE_ADDR pc;
449 {
450   register int others = 0;
451   register struct breakpoint *b;
452
453   ALL_BREAKPOINTS (b)
454     if (b->address == pc)
455       others++;
456   if (others > 0)
457     {
458       printf ("Note: breakpoint%s ", (others > 1) ? "s" : "");
459       ALL_BREAKPOINTS (b)
460         if (b->address == pc)
461           {
462             others--;
463             printf ("%d%s%s ",
464                     b->number,
465                     (b->enable == disabled) ? " (disabled)" : "",
466                     (others > 1) ? "," : ((others == 1) ? " and" : ""));
467           }
468       printf (" also set at pc 0x%x\n", pc);
469     }
470 }
471 \f
472 /* Set the default place to put a breakpoint
473    for the `break' command with no arguments.  */
474
475 void
476 set_default_breakpoint (valid, addr, symtab, line)
477      int valid;
478      CORE_ADDR addr;
479      struct symtab *symtab;
480      int line;
481 {
482   default_breakpoint_valid = valid;
483   default_breakpoint_address = addr;
484   default_breakpoint_symtab = symtab;
485   default_breakpoint_line = line;
486 }
487
488 /* Rescan breakpoints at address ADDRESS,
489    marking the first one as "first" and any others as "duplicates".
490    This is so that the bpt instruction is only inserted once.  */
491
492 static void
493 check_duplicates (address)
494      CORE_ADDR address;
495 {
496   register struct breakpoint *b;
497   register int count = 0;
498
499   ALL_BREAKPOINTS (b)
500     if (b->enable != disabled && b->address == address)
501       {
502         count++;
503         b->duplicate = count > 1;
504       }
505 }
506
507 /* Low level routine to set a breakpoint.
508    Takes as args the three things that every breakpoint must have.
509    Returns the breakpoint object so caller can set other things.
510    Does not set the breakpoint number!
511    Does not print anything.  */
512
513 static struct breakpoint *
514 set_raw_breakpoint (sal)
515      struct symtab_and_line sal;
516 {
517   register struct breakpoint *b, *b1;
518
519   b = (struct breakpoint *) xmalloc (sizeof (struct breakpoint));
520   bzero (b, sizeof *b);
521   b->address = sal.pc;
522   b->symtab = sal.symtab;
523   b->line_number = sal.line;
524   b->enable = enabled;
525   b->next = 0;
526
527   /* Add this breakpoint to the end of the chain
528      so that a list of breakpoints will come out in order
529      of increasing numbers.  */
530
531   b1 = breakpoint_chain;
532   if (b1 == 0)
533     breakpoint_chain = b;
534   else
535     {
536       while (b1->next)
537         b1 = b1->next;
538       b1->next = b;
539     }
540
541   check_duplicates (sal.pc);
542
543   return b;
544 }
545
546 /* Set a breakpoint that will evaporate an end of command
547    at address specified by SAL.
548    Restrict it to frame FRAME if FRAME is nonzero.  */
549
550 void
551 set_momentary_breakpoint (sal, frame)
552      struct symtab_and_line sal;
553      FRAME frame;
554 {
555   register struct breakpoint *b;
556   b = set_raw_breakpoint (sal);
557   b->number = -3;
558   b->enable = delete;
559   b->frame = frame;
560 }
561
562 void
563 clear_momentary_breakpoints ()
564 {
565   register struct breakpoint *b;
566   ALL_BREAKPOINTS (b)
567     if (b->number == -3)
568       {
569         delete_breakpoint (b);
570         break;
571       }
572 }
573 \f
574 /* Set a breakpoint from a symtab and line.
575    If TEMPFLAG is nonzero, it is a temporary breakpoint.
576    Print the same confirmation messages that the breakpoint command prints.  */
577
578 void
579 set_breakpoint (s, line, tempflag)
580      struct symtab *s;
581      int line;
582      int tempflag;
583 {
584   register struct breakpoint *b;
585   struct symtab_and_line sal;
586   
587   sal.symtab = s;
588   sal.line = line;
589   sal.pc = find_line_pc (sal.symtab, sal.line);
590   if (sal.pc == 0)
591     error ("No line %d in file \"%s\".\n", sal.line, sal.symtab->filename);
592   else
593     {
594       describe_other_breakpoints (sal.pc);
595
596       b = set_raw_breakpoint (sal);
597       b->number = ++breakpoint_count;
598       b->cond = 0;
599       if (tempflag)
600         b->enable = temporary;
601
602       printf ("Breakpoint %d at 0x%x", b->number, b->address);
603       if (b->symtab)
604         printf (": file %s, line %d.", b->symtab->filename, b->line_number);
605       printf ("\n");
606     }
607 }
608 \f
609 /* Set a breakpoint according to ARG (function, linenum or *address)
610    and make it temporary if TEMPFLAG is nonzero.
611
612    LINE_NUM is for C++.  */
613
614 static void
615 break_command_1 (arg, tempflag, from_tty, line_num)
616      char *arg;
617      int tempflag, from_tty, line_num;
618 {
619   struct symtabs_and_lines sals;
620   struct symtab_and_line sal;
621   register struct expression *cond = 0;
622   register struct breakpoint *b;
623   char *save_arg;
624   int i;
625
626   sals.sals = NULL;
627   sals.nelts = 0;
628
629   sal.line = sal.pc = sal.end = 0;
630   sal.symtab = 0;
631
632   if (arg)
633     {
634       CORE_ADDR pc;
635       sals = decode_line_1 (&arg, 1, 0, 0);
636
637       if (! sals.nelts) return;
638       save_arg = arg;
639       for (i = 0; i < sals.nelts; i++)
640         {
641           sal = sals.sals[i];
642           if (sal.pc == 0 && sal.symtab != 0)
643             {
644               pc = find_line_pc (sal.symtab, sal.line);
645               if (pc == 0)
646                 error ("No line %d in file \"%s\".",
647                        sal.line, sal.symtab->filename);
648             }
649           else pc = sal.pc;
650
651           while (*arg)
652             {
653               if (arg[0] == 'i' && arg[1] == 'f'
654                   && (arg[2] == ' ' || arg[2] == '\t'))
655                 cond = (struct expression *) parse_c_1 ((arg += 2, &arg),
656                                                         block_for_pc (pc), 0);
657               else
658                 error ("Junk at end of arguments.");
659             }
660           arg = save_arg;
661           sals.sals[i].pc = pc;
662         }
663     }
664   else if (default_breakpoint_valid)
665     {
666       sals.sals = (struct symtab_and_line *) malloc (sizeof (struct symtab_and_line));
667       sal.pc = default_breakpoint_address;
668       sal.line = default_breakpoint_line;
669       sal.symtab = default_breakpoint_symtab;
670       sals.sals[0] = sal;
671       sals.nelts = 1;
672     }
673   else
674     error ("No default breakpoint address now.");
675
676   for (i = 0; i < sals.nelts; i++)
677     {
678       sal = sals.sals[i];
679       sal.line += line_num;  /** C++  **/
680       if (line_num != 0)
681         {                       /* get the pc for a particular line  */
682           sal.pc = find_line_pc (sal.symtab, sal.line);
683         }
684
685       if (from_tty)
686         describe_other_breakpoints (sal.pc);
687
688       b = set_raw_breakpoint (sal);
689       b->number = ++breakpoint_count;
690       b->cond = cond;
691       if (tempflag)
692         b->enable = temporary;
693
694       printf ("Breakpoint %d at 0x%x", b->number, b->address);
695       if (b->symtab)
696         printf (": file %s, line %d.", b->symtab->filename, b->line_number);
697       printf ("\n");
698     }
699   free (sals.sals);
700 }
701
702 static void
703 break_command (arg, from_tty)
704      char *arg;
705      int from_tty;
706 {
707   break_command_1 (arg, 0, from_tty, 0);
708 }
709
710 static void
711 tbreak_command (arg, from_tty)
712      char *arg;
713      int from_tty;
714 {
715   break_command_1 (arg, 1, from_tty, 0);
716 }
717 \f
718 static void
719 clear_command (arg, from_tty)
720      char *arg;
721      int from_tty;
722 {
723   register struct breakpoint *b, *b1;
724   struct symtabs_and_lines sals;
725   struct symtab_and_line sal;
726   register struct breakpoint *found;
727   int i;
728
729   if (arg)
730     {
731       sals = decode_line_spec (arg, 1);
732     }
733   else
734     {
735       sals.sals = (struct symtab_and_line *) malloc (sizeof (struct symtab_and_line));
736       sal.line = default_breakpoint_line;
737       sal.symtab = default_breakpoint_symtab;
738       sal.pc = 0;
739       if (sal.symtab == 0)
740         error ("No source file specified.");
741
742       sals.sals[0] = sal;
743       sals.nelts = 1;
744     }
745
746   for (i = 0; i < sals.nelts; i++)
747     {
748       /* If exact pc given, clear bpts at that pc.
749          But if sal.pc is zero, clear all bpts on specified line.  */
750       sal = sals.sals[i];
751       found = (struct breakpoint *) 0;
752       while (breakpoint_chain
753              && (sal.pc ? breakpoint_chain->address == sal.pc
754                  : (breakpoint_chain->symtab == sal.symtab
755                     && breakpoint_chain->line_number == sal.line)))
756         {
757           b1 = breakpoint_chain;
758           breakpoint_chain = b1->next;
759           b1->next = found;
760           found = b1;
761         }
762
763       ALL_BREAKPOINTS (b)
764         while (b->next
765                && (sal.pc ? b->next->address == sal.pc
766                    : (b->next->symtab == sal.symtab
767                       && b->next->line_number == sal.line)))
768           {
769             b1 = b->next;
770             b->next = b1->next;
771             b1->next = found;
772             found = b1;
773           }
774
775       if (found == 0)
776         error ("No breakpoint at %s.", arg);
777
778       if (found->next) from_tty = 1; /* Always report if deleted more than one */
779       if (from_tty) printf ("Deleted breakpoint%s ", found->next ? "s" : "");
780       while (found)
781         {
782           if (from_tty) printf ("%d ", found->number);
783           b1 = found->next;
784           delete_breakpoint (found);
785           found = b1;
786         }
787       if (from_tty) putchar ('\n');
788     }
789   free (sals.sals);
790 }
791
792 /* Delete breakpoint number BNUM if it is a `delete' breakpoint.
793    This is called after breakpoint BNUM has been hit.
794    Also delete any breakpoint numbered -3 unless there are breakpoint
795    commands to be executed.  */
796
797 void
798 breakpoint_auto_delete (bnum)
799      int bnum;
800 {
801   register struct breakpoint *b;
802   if (bnum != 0)
803     ALL_BREAKPOINTS (b)
804       if (b->number == bnum)
805         {
806           if (b->enable == delete)
807             delete_breakpoint (b);
808           break;
809         }
810   if (breakpoint_commands == 0)
811     clear_momentary_breakpoints ();
812 }
813
814 static void
815 delete_breakpoint (bpt)
816      struct breakpoint *bpt;
817 {
818   register struct breakpoint *b;
819
820   if (bpt->inserted)
821     write_memory (bpt->address, bpt->shadow_contents, sizeof break_insn);
822
823   if (breakpoint_chain == bpt)
824     breakpoint_chain = bpt->next;
825
826   ALL_BREAKPOINTS (b)
827     if (b->next == bpt)
828       {
829         b->next = bpt->next;
830         break;
831       }
832
833   check_duplicates (bpt->address);
834
835   free_command_lines (&bpt->commands);
836   if (bpt->cond)
837     free (bpt->cond);
838   free (bpt);
839 }
840
841 void map_breakpoint_numbers ();
842
843 static void
844 delete_command (arg, from_tty)
845      char *arg;
846      int from_tty;
847 {
848   register struct breakpoint *b, *b1;
849
850   if (arg == 0)
851     {
852       if (!from_tty || query ("Delete all breakpoints? "))
853         {
854           /* No arg; clear all breakpoints.  */
855           while (breakpoint_chain)
856             delete_breakpoint (breakpoint_chain);
857         }
858     }
859   else
860     map_breakpoint_numbers (arg, delete_breakpoint);
861 }
862
863 /* Delete all breakpoints.
864    Done when new symtabs are loaded, since the break condition expressions
865    may become invalid, and the breakpoints are probably wrong anyway.  */
866
867 void
868 clear_breakpoints ()
869 {
870   delete_command (0, 0);
871 }
872 \f
873 /* Set ignore-count of breakpoint number BPTNUM to COUNT.
874    If from_tty is nonzero, it prints a message to that effect,
875    which ends with a period (no newline).  */
876
877 void
878 set_ignore_count (bptnum, count, from_tty)
879      int bptnum, count, from_tty;
880 {
881   register struct breakpoint *b;
882
883   if (count < 0)
884     count = 0;
885
886   ALL_BREAKPOINTS (b)
887     if (b->number == bptnum)
888       {
889         b->ignore_count = count;
890         if (!from_tty)
891           return;
892         else if (count == 0)
893           printf ("Will stop next time breakpoint %d is reached.", bptnum);
894         else if (count == 1)
895           printf ("Will ignore next crossing of breakpoint %d.", bptnum);
896         else
897           printf ("Will ignore next %d crossings of breakpoint %d.",
898                   count, bptnum);
899         return;
900       }
901
902   error ("No breakpoint number %d.", bptnum);
903 }
904
905 /* Command to set ignore-count of breakpoint N to COUNT.  */
906
907 static void
908 ignore_command (args, from_tty)
909      char *args;
910      int from_tty;
911 {
912   register char *p;
913   register int num;
914
915   if (p == 0)
916     error_no_arg ("a breakpoint number");
917   
918   p = args;
919   while (*p >= '0' && *p <= '9') p++;
920   if (*p && *p != ' ' && *p != '\t')
921     error ("First argument must be a breakpoint number.");
922
923   num = atoi (args);
924
925   if (*p == 0)
926     error ("Second argument (specified ignore-count) is missing.");
927
928   set_ignore_count (num, parse_and_eval_address (p), from_tty);
929   printf ("\n");
930 }
931 \f
932 /* Call FUNCTION on each of the breakpoints
933    whose numbers are given in ARGS.  */
934
935 static void
936 map_breakpoint_numbers (args, function)
937      char *args;
938      void (*function) ();
939 {
940   register char *p = args;
941   register char *p1;
942   register int num;
943   register struct breakpoint *b;
944
945   if (p == 0)
946     error_no_arg ("one or more breakpoint numbers");
947
948   while (*p)
949     {
950       p1 = p;
951       while (*p1 >= '0' && *p1 <= '9') p1++;
952       if (*p1 && *p1 != ' ' && *p1 != '\t')
953         error ("Arguments must be breakpoint numbers.");
954
955       num = atoi (p);
956
957       ALL_BREAKPOINTS (b)
958         if (b->number == num)
959           {
960             function (b);
961             goto win;
962           }
963       printf ("No breakpoint number %d.\n", num);
964     win:
965       p = p1;
966       while (*p == ' ' || *p == '\t') p++;
967     }
968 }
969
970 static void
971 enable_breakpoint (bpt)
972      struct breakpoint *bpt;
973 {
974   bpt->enable = enabled;
975
976   check_duplicates (bpt->address);
977 }
978
979 static void
980 enable_command (args)
981      char *args;
982 {
983   map_breakpoint_numbers (args, enable_breakpoint);
984 }
985
986 static void
987 disable_breakpoint (bpt)
988      struct breakpoint *bpt;
989 {
990   bpt->enable = disabled;
991
992   check_duplicates (bpt->address);
993 }
994
995 static void
996 disable_command (args)
997      char *args;
998 {
999   register struct breakpoint *bpt;
1000   if (args == 0)
1001     ALL_BREAKPOINTS (bpt)
1002       disable_breakpoint (bpt);
1003   else
1004     map_breakpoint_numbers (args, disable_breakpoint);
1005 }
1006
1007 static void
1008 enable_once_breakpoint (bpt)
1009      struct breakpoint *bpt;
1010 {
1011   bpt->enable = temporary;
1012
1013   check_duplicates (bpt->address);
1014 }
1015
1016 static void
1017 enable_once_command (args)
1018      char *args;
1019 {
1020   map_breakpoint_numbers (args, enable_once_breakpoint);
1021 }
1022
1023 static void
1024 enable_delete_breakpoint (bpt)
1025      struct breakpoint *bpt;
1026 {
1027   bpt->enable = delete;
1028
1029   check_duplicates (bpt->address);
1030 }
1031
1032 static void
1033 enable_delete_command (args)
1034      char *args;
1035 {
1036   map_breakpoint_numbers (args, enable_delete_breakpoint);
1037 }
1038 \f
1039
1040 /* Chain containing all defined enable commands.  */
1041
1042 struct cmd_list_element *enablelist;
1043
1044 extern struct cmd_list_element *cmdlist;
1045
1046 static
1047 initialize ()
1048 {
1049   breakpoint_chain = 0;
1050   breakpoint_count = 0;
1051   enablelist = 0;
1052
1053   add_com ("ignore", class_breakpoint, ignore_command,
1054            "Set ignore-count of breakpoint number N to COUNT.");
1055
1056   add_com ("commands", class_breakpoint, commands_command,
1057            "Set commands to be executed when a breakpoint is hit.\n\
1058 Give breakpoint number as argument after \"commands\".\n\
1059 The commands themselves follow starting on the next line.\n\
1060 Type a line containing \"end\" to indicate the end of them.\n\
1061 Give \"silent\" as the first line to make the breakpoint silent;\n\
1062 then no output is printed when it is hit, except what the commands print.");
1063
1064   add_com ("condition", class_breakpoint, condition_command,
1065            "Specify breakpoint number N to break only if COND is true.\n\
1066 N is an integer; COND is a C expression to be evaluated whenever\n\
1067 breakpoint N is reached.  Actually break only when COND is nonzero.");
1068
1069   add_com ("tbreak", class_breakpoint, tbreak_command,
1070            "Set a temporary breakpoint.  Args like \"break\" command.\n\
1071 Like \"break\" except the breakpoint is only enabled temporarily,\n\
1072 so it will be disabled when hit.  Equivalent to \"break\" followed\n\
1073 by using \"enable once\" on the breakpoint number.");
1074
1075   add_prefix_cmd ("enable", class_breakpoint, enable_command,
1076                   "Enable some breakpoints.  Give breakpoint numbers as arguments.\n\
1077 With no subcommand, breakpoints are enabled until you command otherwise.\n\
1078 This is used to cancel the effect of the \"disable\" command.\n\
1079 With a subcommand you can enable temporarily.",
1080                   &enablelist, "enable ", 1, &cmdlist);
1081
1082   add_cmd ("delete", 0, enable_delete_command,
1083            "Enable breakpoints and delete when hit.  Give breakpoint numbers.\n\
1084 If a breakpoint is hit while enabled in this fashion, it is deleted.",
1085            &enablelist);
1086
1087   add_cmd ("once", 0, enable_once_command,
1088            "Enable breakpoints for one hit.  Give breakpoint numbers.\n\
1089 If a breakpoint is hit while enabled in this fashion, it becomes disabled.\n\
1090 See the \"tbreak\" command which sets a breakpoint and enables it once.",
1091            &enablelist);
1092
1093   add_com ("disable", class_breakpoint, disable_command,
1094            "Disable some breakpoints.  Give breakpoint numbers as arguments.\n\
1095 With no arguments, disable all breakpoints.\n\
1096 A disabled breakpoint is not forgotten,\n\
1097 but it has no effect until enabled again.");
1098   add_com_alias ("dis", "disable", class_breakpoint, 1);
1099
1100   add_com ("delete", class_breakpoint, delete_command,
1101            "Delete breakpoints, specifying breakpoint numbers; or all breakpoints.\n\
1102 Arguments are breakpoint numbers with spaces in between.\n\
1103 To delete all breakpoints, give no argument.");
1104   add_com_alias ("d", "delete", class_breakpoint, 1);
1105
1106   add_com ("clear", class_breakpoint, clear_command,
1107            "Clear breakpoint at specified line or function.\n\
1108 Argument may be line number, function name, or \"*\" and an address.\n\
1109 If line number is specified, all breakpoints in that line are cleared.\n\
1110 If function is specified, breakpoints at beginning of function are cleared.\n\
1111 If an address is specified, breakpoints at that address are cleared.\n\n\
1112 With no argument, clears all breakpoints in the line that the selected frame\n\
1113 is executing in.\n\
1114 \n\
1115 See also the \"delete\" command which clears breakpoints by number.");
1116
1117   add_com ("break", class_breakpoint, break_command,
1118            "Set breakpoint at specified line or function.\n\
1119 Argument may be line number, function name, or \"*\" and an address.\n\
1120 If line number is specified, break at start of code for that line.\n\
1121 If function is specified, break at start of code for that function.\n\
1122 If an address is specified, break at that exact address.\n\
1123 With no arg, uses current execution address of selected stack frame.\n\
1124 This is useful for breaking on return to a stack frame.\n\
1125 \n\
1126 Multiple breakpoints at one place are permitted, and useful if conditional.\n\
1127 \n\
1128 Do \"help breakpoints\" for info on other commands dealing with breakpoints.");
1129   add_com_alias ("b", "break", class_run, 1);
1130   add_com_alias ("br", "break", class_run, 1);
1131   add_com_alias ("bre", "break", class_run, 1);
1132   add_com_alias ("brea", "break", class_run, 1);
1133
1134   add_info ("breakpoints", breakpoints_info,
1135             "Status of all breakpoints, or breakpoint number NUMBER.\n\
1136 Second column is \"y\" for enabled breakpoint, \"n\" for disabled,\n\
1137 \"o\" for enabled once (disable when hit), \"d\" for enable but delete when hit.\n\
1138 Then come the address and the file/line number.\n\n\
1139 Convenience variable \"$_\" and default examine address for \"x\"\n\
1140 are set to the address of the last breakpoint listed.");
1141 }
1142
1143 END_FILE