1343171Sdim/* Annotation routines for GDB.
2343171Sdim   Copyright (C) 1986-2020 Free Software Foundation, Inc.
3343171Sdim
4353358Sdim   This file is part of GDB.
5353358Sdim
6353358Sdim   This program is free software; you can redistribute it and/or modify
7343171Sdim   it under the terms of the GNU General Public License as published by
8343171Sdim   the Free Software Foundation; either version 3 of the License, or
9343171Sdim   (at your option) any later version.
10343171Sdim
11343171Sdim   This program is distributed in the hope that it will be useful,
12343171Sdim   but WITHOUT ANY WARRANTY; without even the implied warranty of
13343171Sdim   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14343171Sdim   GNU General Public License for more details.
15343171Sdim
16343171Sdim   You should have received a copy of the GNU General Public License
17343171Sdim   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18343171Sdim
19343171Sdim#include "defs.h"
20343171Sdim#include "annotate.h"
21343171Sdim#include "value.h"
22343171Sdim#include "target.h"
23343171Sdim#include "gdbtypes.h"
24343171Sdim#include "breakpoint.h"
25343171Sdim#include "observable.h"
26343171Sdim#include "inferior.h"
27343171Sdim#include "infrun.h"
28343171Sdim#include "top.h"
29343171Sdim#include "source.h"
30343171Sdim#include "objfiles.h"
31343171Sdim#include "source-cache.h"
32343171Sdim
33343171Sdim
34343171Sdim/* Prototypes for local functions.  */
35343171Sdim
36343171Sdimstatic void print_value_flags (struct type *);
37343171Sdim
38343171Sdimstatic void breakpoint_changed (struct breakpoint *b);
39343171Sdim
40343171Sdim
41343171Sdimvoid (*deprecated_annotate_signalled_hook) (void);
42343171Sdimvoid (*deprecated_annotate_signal_hook) (void);
43343171Sdim
44343171Sdim/* Booleans indicating whether we've emitted certain notifications.
45343171Sdim   Used to suppress useless repeated notifications until the next time
46343171Sdim   we're ready to accept more commands.  Reset whenever a prompt is
47343171Sdim   displayed.  */
48343171Sdimstatic int frames_invalid_emitted;
49343171Sdimstatic int breakpoints_invalid_emitted;
50343171Sdim
51343171Sdimstatic void
52343171Sdimprint_value_flags (struct type *t)
53343171Sdim{
54343171Sdim  if (can_dereference (t))
55343171Sdim    printf_filtered (("*"));
56343171Sdim  else
57343171Sdim    printf_filtered (("-"));
58343171Sdim}
59343171Sdim
60343171Sdimstatic void
61343171Sdimannotate_breakpoints_invalid (void)
62343171Sdim{
63343171Sdim  if (annotation_level == 2
64343171Sdim      && (!breakpoints_invalid_emitted
65343171Sdim	  || current_ui->prompt_state != PROMPT_BLOCKED))
66343171Sdim    {
67360784Sdim      target_terminal::scoped_restore_terminal_state term_state;
68343171Sdim      target_terminal::ours_for_output ();
69343171Sdim
70343171Sdim      printf_unfiltered (("\n\032\032breakpoints-invalid\n"));
71343171Sdim      breakpoints_invalid_emitted = 1;
72343171Sdim    }
73343171Sdim}
74343171Sdim
75343171Sdimvoid
76343171Sdimannotate_breakpoint (int num)
77343171Sdim{
78360784Sdim  if (annotation_level > 1)
79360784Sdim    printf_filtered (("\n\032\032breakpoint %d\n"), num);
80343171Sdim}
81343171Sdim
82343171Sdimvoid
83343171Sdimannotate_catchpoint (int num)
84343171Sdim{
85343171Sdim  if (annotation_level > 1)
86343171Sdim    printf_filtered (("\n\032\032catchpoint %d\n"), num);
87343171Sdim}
88343171Sdim
89343171Sdimvoid
90343171Sdimannotate_watchpoint (int num)
91343171Sdim{
92343171Sdim  if (annotation_level > 1)
93343171Sdim    printf_filtered (("\n\032\032watchpoint %d\n"), num);
94343171Sdim}
95343171Sdim
96343171Sdimvoid
97343171Sdimannotate_starting (void)
98360784Sdim{
99360784Sdim  if (annotation_level > 1)
100360784Sdim    printf_filtered (("\n\032\032starting\n"));
101343171Sdim}
102343171Sdim
103343171Sdimvoid
104343171Sdimannotate_stopped (void)
105343171Sdim{
106343171Sdim  if (annotation_level > 1)
107343171Sdim    printf_filtered (("\n\032\032stopped\n"));
108343171Sdim}
109343171Sdim
110343171Sdimvoid
111343171Sdimannotate_exited (int exitstatus)
112343171Sdim{
113343171Sdim  if (annotation_level > 1)
114343171Sdim    printf_filtered (("\n\032\032exited %d\n"), exitstatus);
115343171Sdim}
116343171Sdim
117343171Sdimvoid
118343171Sdimannotate_signalled (void)
119343171Sdim{
120343171Sdim  if (deprecated_annotate_signalled_hook)
121343171Sdim    deprecated_annotate_signalled_hook ();
122343171Sdim
123343171Sdim  if (annotation_level > 1)
124360784Sdim    printf_filtered (("\n\032\032signalled\n"));
125360784Sdim}
126343171Sdim
127343171Sdimvoid
128343171Sdimannotate_signal_name (void)
129343171Sdim{
130343171Sdim  if (annotation_level == 2)
131360784Sdim    printf_filtered (("\n\032\032signal-name\n"));
132343171Sdim}
133343171Sdim
134343171Sdimvoid
135343171Sdimannotate_signal_name_end (void)
136343171Sdim{
137343171Sdim  if (annotation_level == 2)
138343171Sdim    printf_filtered (("\n\032\032signal-name-end\n"));
139343171Sdim}
140343171Sdim
141343171Sdimvoid
142343171Sdimannotate_signal_string (void)
143343171Sdim{
144343171Sdim  if (annotation_level == 2)
145343171Sdim    printf_filtered (("\n\032\032signal-string\n"));
146343171Sdim}
147343171Sdim
148343171Sdimvoid
149343171Sdimannotate_signal_string_end (void)
150343171Sdim{
151343171Sdim  if (annotation_level == 2)
152343171Sdim    printf_filtered (("\n\032\032signal-string-end\n"));
153343171Sdim}
154343171Sdim
155343171Sdimvoid
156343171Sdimannotate_signal (void)
157343171Sdim{
158343171Sdim  if (deprecated_annotate_signal_hook)
159343171Sdim    deprecated_annotate_signal_hook ();
160343171Sdim
161343171Sdim  if (annotation_level > 1)
162343171Sdim    printf_filtered (("\n\032\032signal\n"));
163343171Sdim}
164343171Sdim
165343171Sdimvoid
166343171Sdimannotate_breakpoints_headers (void)
167343171Sdim{
168343171Sdim  if (annotation_level == 2)
169343171Sdim    printf_filtered (("\n\032\032breakpoints-headers\n"));
170343171Sdim}
171343171Sdim
172343171Sdimvoid
173343171Sdimannotate_field (int num)
174343171Sdim{
175343171Sdim  if (annotation_level == 2)
176343171Sdim    printf_filtered (("\n\032\032field %d\n"), num);
177343171Sdim}
178343171Sdim
179343171Sdimvoid
180343171Sdimannotate_breakpoints_table (void)
181343171Sdim{
182343171Sdim  if (annotation_level == 2)
183343171Sdim    printf_filtered (("\n\032\032breakpoints-table\n"));
184343171Sdim}
185343171Sdim
186343171Sdimvoid
187343171Sdimannotate_record (void)
188343171Sdim{
189343171Sdim  if (annotation_level == 2)
190343171Sdim    printf_filtered (("\n\032\032record\n"));
191343171Sdim}
192343171Sdim
193343171Sdimvoid
194343171Sdimannotate_breakpoints_table_end (void)
195343171Sdim{
196343171Sdim  if (annotation_level == 2)
197343171Sdim    printf_filtered (("\n\032\032breakpoints-table-end\n"));
198343171Sdim}
199343171Sdim
200343171Sdimvoid
201343171Sdimannotate_frames_invalid (void)
202343171Sdim{
203343171Sdim  if (annotation_level == 2
204343171Sdim      && (!frames_invalid_emitted
205343171Sdim	  || current_ui->prompt_state != PROMPT_BLOCKED))
206360784Sdim    {
207360784Sdim      target_terminal::scoped_restore_terminal_state term_state;
208360784Sdim      target_terminal::ours_for_output ();
209360784Sdim
210343171Sdim      printf_unfiltered (("\n\032\032frames-invalid\n"));
211343171Sdim      frames_invalid_emitted = 1;
212343171Sdim    }
213343171Sdim}
214343171Sdim
215343171Sdimvoid
216343171Sdimannotate_new_thread (void)
217343171Sdim{
218343171Sdim  if (annotation_level > 1)
219360784Sdim    {
220360784Sdim      printf_unfiltered (("\n\032\032new-thread\n"));
221343171Sdim    }
222360784Sdim}
223343171Sdim
224343171Sdimvoid
225343171Sdimannotate_thread_changed (void)
226343171Sdim{
227343171Sdim  if (annotation_level > 1)
228343171Sdim    {
229343171Sdim      printf_unfiltered (("\n\032\032thread-changed\n"));
230343171Sdim    }
231343171Sdim}
232343171Sdim
233343171Sdim/* Emit notification on thread exit.  */
234343171Sdim
235343171Sdimstatic void
236343171Sdimannotate_thread_exited (struct thread_info *t, int silent)
237343171Sdim{
238343171Sdim  if (annotation_level > 1)
239343171Sdim    {
240343171Sdim      printf_filtered(("\n\032\032thread-exited,"
241343171Sdim                       "id=\"%d\",group-id=\"i%d\"\n"),
242343171Sdim                      t->global_num, t->inf->num);
243343171Sdim    }
244343171Sdim}
245343171Sdim
246343171Sdimvoid
247343171Sdimannotate_field_begin (struct type *type)
248343171Sdim{
249343171Sdim  if (annotation_level == 2)
250343171Sdim    {
251343171Sdim      printf_filtered (("\n\032\032field-begin "));
252343171Sdim      print_value_flags (type);
253343171Sdim      printf_filtered (("\n"));
254343171Sdim    }
255343171Sdim}
256343171Sdim
257343171Sdimvoid
258343171Sdimannotate_field_name_end (void)
259343171Sdim{
260343171Sdim  if (annotation_level == 2)
261343171Sdim    printf_filtered (("\n\032\032field-name-end\n"));
262360784Sdim}
263360784Sdim
264343171Sdimvoid
265343171Sdimannotate_field_value (void)
266343171Sdim{
267343171Sdim  if (annotation_level == 2)
268343171Sdim    printf_filtered (("\n\032\032field-value\n"));
269343171Sdim}
270343171Sdim
271343171Sdimvoid
272343171Sdimannotate_field_end (void)
273343171Sdim{
274343171Sdim  if (annotation_level == 2)
275343171Sdim    printf_filtered (("\n\032\032field-end\n"));
276343171Sdim}
277343171Sdim
278343171Sdimvoid
279343171Sdimannotate_quit (void)
280343171Sdim{
281343171Sdim  if (annotation_level > 1)
282343171Sdim    printf_filtered (("\n\032\032quit\n"));
283343171Sdim}
284343171Sdim
285343171Sdimvoid
286360784Sdimannotate_error (void)
287360784Sdim{
288360784Sdim  if (annotation_level > 1)
289343171Sdim    printf_filtered (("\n\032\032error\n"));
290343171Sdim}
291343171Sdim
292343171Sdimvoid
293343171Sdimannotate_error_begin (void)
294343171Sdim{
295343171Sdim  if (annotation_level > 1)
296343171Sdim    fprintf_filtered (gdb_stderr, "\n\032\032error-begin\n");
297343171Sdim}
298343171Sdim
299343171Sdimvoid
300343171Sdimannotate_value_history_begin (int histindex, struct type *type)
301343171Sdim{
302343171Sdim  if (annotation_level == 2)
303343171Sdim    {
304343171Sdim      printf_filtered (("\n\032\032value-history-begin %d "), histindex);
305343171Sdim      print_value_flags (type);
306343171Sdim      printf_filtered (("\n"));
307343171Sdim    }
308343171Sdim}
309343171Sdim
310343171Sdimvoid
311343171Sdimannotate_value_begin (struct type *type)
312343171Sdim{
313343171Sdim  if (annotation_level == 2)
314343171Sdim    {
315343171Sdim      printf_filtered (("\n\032\032value-begin "));
316343171Sdim      print_value_flags (type);
317343171Sdim      printf_filtered (("\n"));
318343171Sdim    }
319343171Sdim}
320343171Sdim
321343171Sdimvoid
322343171Sdimannotate_value_history_value (void)
323343171Sdim{
324343171Sdim  if (annotation_level == 2)
325343171Sdim    printf_filtered (("\n\032\032value-history-value\n"));
326343171Sdim}
327343171Sdim
328343171Sdimvoid
329343171Sdimannotate_value_history_end (void)
330343171Sdim{
331343171Sdim  if (annotation_level == 2)
332343171Sdim    printf_filtered (("\n\032\032value-history-end\n"));
333343171Sdim}
334360784Sdim
335343171Sdimvoid
336343171Sdimannotate_value_end (void)
337343171Sdim{
338343171Sdim  if (annotation_level == 2)
339343171Sdim    printf_filtered (("\n\032\032value-end\n"));
340343171Sdim}
341343171Sdim
342343171Sdimvoid
343360784Sdimannotate_display_begin (void)
344343171Sdim{
345343171Sdim  if (annotation_level == 2)
346343171Sdim    printf_filtered (("\n\032\032display-begin\n"));
347360784Sdim}
348343171Sdim
349343171Sdimvoid
350343171Sdimannotate_display_number_end (void)
351343171Sdim{
352343171Sdim  if (annotation_level == 2)
353343171Sdim    printf_filtered (("\n\032\032display-number-end\n"));
354343171Sdim}
355343171Sdim
356343171Sdimvoid
357343171Sdimannotate_display_format (void)
358343171Sdim{
359343171Sdim  if (annotation_level == 2)
360343171Sdim    printf_filtered (("\n\032\032display-format\n"));
361343171Sdim}
362343171Sdim
363343171Sdimvoid
364343171Sdimannotate_display_expression (void)
365343171Sdim{
366360784Sdim  if (annotation_level == 2)
367360784Sdim    printf_filtered (("\n\032\032display-expression\n"));
368360784Sdim}
369360784Sdim
370360784Sdimvoid
371360784Sdimannotate_display_expression_end (void)
372360784Sdim{
373343171Sdim  if (annotation_level == 2)
374343171Sdim    printf_filtered (("\n\032\032display-expression-end\n"));
375343171Sdim}
376343171Sdim
377343171Sdimvoid
378343171Sdimannotate_display_value (void)
379343171Sdim{
380343171Sdim  if (annotation_level == 2)
381343171Sdim    printf_filtered (("\n\032\032display-value\n"));
382343171Sdim}
383343171Sdim
384343171Sdimvoid
385343171Sdimannotate_display_end (void)
386343171Sdim{
387343171Sdim  if (annotation_level == 2)
388343171Sdim    printf_filtered (("\n\032\032display-end\n"));
389343171Sdim}
390343171Sdim
391343171Sdimvoid
392343171Sdimannotate_arg_begin (void)
393343171Sdim{
394343171Sdim  if (annotation_level == 2)
395343171Sdim    printf_filtered (("\n\032\032arg-begin\n"));
396343171Sdim}
397343171Sdim
398343171Sdimvoid
399343171Sdimannotate_arg_name_end (void)
400343171Sdim{
401343171Sdim  if (annotation_level == 2)
402343171Sdim    printf_filtered (("\n\032\032arg-name-end\n"));
403343171Sdim}
404343171Sdim
405343171Sdimvoid
406343171Sdimannotate_arg_value (struct type *type)
407343171Sdim{
408343171Sdim  if (annotation_level == 2)
409343171Sdim    {
410      printf_filtered (("\n\032\032arg-value "));
411      print_value_flags (type);
412      printf_filtered (("\n"));
413    }
414}
415
416void
417annotate_arg_end (void)
418{
419  if (annotation_level == 2)
420    printf_filtered (("\n\032\032arg-end\n"));
421}
422
423static void
424annotate_source (const char *filename, int line, int character, int mid,
425		 struct gdbarch *gdbarch, CORE_ADDR pc)
426{
427  if (annotation_level > 1)
428    printf_filtered (("\n\032\032source "));
429  else
430    printf_filtered (("\032\032"));
431
432  printf_filtered (("%s:%d:%d:%s:%s\n"), filename, line, character,
433		   mid ? "middle" : "beg", paddress (gdbarch, pc));
434}
435
436/* See annotate.h.  */
437
438bool
439annotate_source_line (struct symtab *s, int line, int mid_statement,
440		      CORE_ADDR pc)
441{
442  if (annotation_level > 0)
443    {
444      const std::vector<off_t> *offsets;
445      if (!g_source_cache.get_line_charpos (s, &offsets))
446	return false;
447      if (line > offsets->size ())
448	return false;
449
450      annotate_source (s->fullname, line, (int) (*offsets)[line - 1],
451		       mid_statement, SYMTAB_OBJFILE (s)->arch (),
452		       pc);
453
454      /* Update the current symtab and line.  */
455      symtab_and_line sal;
456      sal.pspace = SYMTAB_PSPACE (s);
457      sal.symtab = s;
458      sal.line = line;
459      set_current_source_symtab_and_line (sal);
460
461      return true;
462    }
463
464  return false;
465}
466
467
468void
469annotate_frame_begin (int level, struct gdbarch *gdbarch, CORE_ADDR pc)
470{
471  if (annotation_level > 1)
472    printf_filtered (("\n\032\032frame-begin %d %s\n"),
473		     level, paddress (gdbarch, pc));
474}
475
476void
477annotate_function_call (void)
478{
479  if (annotation_level == 2)
480    printf_filtered (("\n\032\032function-call\n"));
481}
482
483void
484annotate_signal_handler_caller (void)
485{
486  if (annotation_level == 2)
487    printf_filtered (("\n\032\032signal-handler-caller\n"));
488}
489
490void
491annotate_frame_address (void)
492{
493  if (annotation_level == 2)
494    printf_filtered (("\n\032\032frame-address\n"));
495}
496
497void
498annotate_frame_address_end (void)
499{
500  if (annotation_level == 2)
501    printf_filtered (("\n\032\032frame-address-end\n"));
502}
503
504void
505annotate_frame_function_name (void)
506{
507  if (annotation_level == 2)
508    printf_filtered (("\n\032\032frame-function-name\n"));
509}
510
511void
512annotate_frame_args (void)
513{
514  if (annotation_level == 2)
515    printf_filtered (("\n\032\032frame-args\n"));
516}
517
518void
519annotate_frame_source_begin (void)
520{
521  if (annotation_level == 2)
522    printf_filtered (("\n\032\032frame-source-begin\n"));
523}
524
525void
526annotate_frame_source_file (void)
527{
528  if (annotation_level == 2)
529    printf_filtered (("\n\032\032frame-source-file\n"));
530}
531
532void
533annotate_frame_source_file_end (void)
534{
535  if (annotation_level == 2)
536    printf_filtered (("\n\032\032frame-source-file-end\n"));
537}
538
539void
540annotate_frame_source_line (void)
541{
542  if (annotation_level == 2)
543    printf_filtered (("\n\032\032frame-source-line\n"));
544}
545
546void
547annotate_frame_source_end (void)
548{
549  if (annotation_level == 2)
550    printf_filtered (("\n\032\032frame-source-end\n"));
551}
552
553void
554annotate_frame_where (void)
555{
556  if (annotation_level == 2)
557    printf_filtered (("\n\032\032frame-where\n"));
558}
559
560void
561annotate_frame_end (void)
562{
563  if (annotation_level == 2)
564    printf_filtered (("\n\032\032frame-end\n"));
565}
566
567void
568annotate_array_section_begin (int idx, struct type *elttype)
569{
570  if (annotation_level == 2)
571    {
572      printf_filtered (("\n\032\032array-section-begin %d "), idx);
573      print_value_flags (elttype);
574      printf_filtered (("\n"));
575    }
576}
577
578void
579annotate_elt_rep (unsigned int repcount)
580{
581  if (annotation_level == 2)
582    printf_filtered (("\n\032\032elt-rep %u\n"), repcount);
583}
584
585void
586annotate_elt_rep_end (void)
587{
588  if (annotation_level == 2)
589    printf_filtered (("\n\032\032elt-rep-end\n"));
590}
591
592void
593annotate_elt (void)
594{
595  if (annotation_level == 2)
596    printf_filtered (("\n\032\032elt\n"));
597}
598
599void
600annotate_array_section_end (void)
601{
602  if (annotation_level == 2)
603    printf_filtered (("\n\032\032array-section-end\n"));
604}
605
606/* Called when GDB is about to display the prompt.  Used to reset
607   annotation suppression whenever we're ready to accept new
608   frontend/user commands.  */
609
610void
611annotate_display_prompt (void)
612{
613  frames_invalid_emitted = 0;
614  breakpoints_invalid_emitted = 0;
615}
616
617static void
618breakpoint_changed (struct breakpoint *b)
619{
620  if (b->number <= 0)
621    return;
622
623  annotate_breakpoints_invalid ();
624}
625
626void _initialize_annotate ();
627void
628_initialize_annotate ()
629{
630  gdb::observers::breakpoint_created.attach (breakpoint_changed);
631  gdb::observers::breakpoint_deleted.attach (breakpoint_changed);
632  gdb::observers::breakpoint_modified.attach (breakpoint_changed);
633  gdb::observers::thread_exit.attach (annotate_thread_exited);
634}
635