xref: /openbsd/gnu/usr.bin/binutils/gdb/gdb-events.c (revision 11efff7f)
1b725ae77Skettenis /* User Interface Events.
2b725ae77Skettenis 
3*11efff7fSkettenis    Copyright 1999, 2001, 2002, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis 
5b725ae77Skettenis    Contributed by Cygnus Solutions.
6b725ae77Skettenis 
7b725ae77Skettenis    This file is part of GDB.
8b725ae77Skettenis 
9b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis    it under the terms of the GNU General Public License as published by
11b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis    (at your option) any later version.
13b725ae77Skettenis 
14b725ae77Skettenis    This program is distributed in the hope that it will be useful,
15b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17b725ae77Skettenis    GNU General Public License for more details.
18b725ae77Skettenis 
19b725ae77Skettenis    You should have received a copy of the GNU General Public License
20b725ae77Skettenis    along with this program; if not, write to the Free Software
21b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23b725ae77Skettenis /* Work in progress */
24b725ae77Skettenis 
25b725ae77Skettenis /* This file was created with the aid of ``gdb-events.sh''.
26b725ae77Skettenis 
27b725ae77Skettenis    The bourn shell script ``gdb-events.sh'' creates the files
28b725ae77Skettenis    ``new-gdb-events.c'' and ``new-gdb-events.h and then compares
29b725ae77Skettenis    them against the existing ``gdb-events.[hc]''.  Any differences
30b725ae77Skettenis    found being reported.
31b725ae77Skettenis 
32b725ae77Skettenis    If editing this file, please also run gdb-events.sh and merge any
33b725ae77Skettenis    changes into that script. Conversely, when making sweeping changes
34b725ae77Skettenis    to this file, modifying gdb-events.sh and using its output may
35b725ae77Skettenis    prove easier. */
36b725ae77Skettenis 
37b725ae77Skettenis 
38b725ae77Skettenis #include "defs.h"
39b725ae77Skettenis #include "gdb-events.h"
40b725ae77Skettenis #include "gdbcmd.h"
41b725ae77Skettenis 
42b725ae77Skettenis static struct gdb_events null_event_hooks;
43b725ae77Skettenis static struct gdb_events queue_event_hooks;
44b725ae77Skettenis static struct gdb_events *current_event_hooks = &null_event_hooks;
45b725ae77Skettenis 
46b725ae77Skettenis int gdb_events_debug;
47b725ae77Skettenis 
48b725ae77Skettenis void
breakpoint_create_event(int b)49b725ae77Skettenis breakpoint_create_event (int b)
50b725ae77Skettenis {
51b725ae77Skettenis   if (gdb_events_debug)
52b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "breakpoint_create_event\n");
53b725ae77Skettenis   if (!current_event_hooks->breakpoint_create)
54b725ae77Skettenis     return;
55b725ae77Skettenis   current_event_hooks->breakpoint_create (b);
56b725ae77Skettenis }
57b725ae77Skettenis 
58b725ae77Skettenis void
breakpoint_delete_event(int b)59b725ae77Skettenis breakpoint_delete_event (int b)
60b725ae77Skettenis {
61b725ae77Skettenis   if (gdb_events_debug)
62b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "breakpoint_delete_event\n");
63b725ae77Skettenis   if (!current_event_hooks->breakpoint_delete)
64b725ae77Skettenis     return;
65b725ae77Skettenis   current_event_hooks->breakpoint_delete (b);
66b725ae77Skettenis }
67b725ae77Skettenis 
68b725ae77Skettenis void
breakpoint_modify_event(int b)69b725ae77Skettenis breakpoint_modify_event (int b)
70b725ae77Skettenis {
71b725ae77Skettenis   if (gdb_events_debug)
72b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "breakpoint_modify_event\n");
73b725ae77Skettenis   if (!current_event_hooks->breakpoint_modify)
74b725ae77Skettenis     return;
75b725ae77Skettenis   current_event_hooks->breakpoint_modify (b);
76b725ae77Skettenis }
77b725ae77Skettenis 
78b725ae77Skettenis void
tracepoint_create_event(int number)79b725ae77Skettenis tracepoint_create_event (int number)
80b725ae77Skettenis {
81b725ae77Skettenis   if (gdb_events_debug)
82b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "tracepoint_create_event\n");
83b725ae77Skettenis   if (!current_event_hooks->tracepoint_create)
84b725ae77Skettenis     return;
85b725ae77Skettenis   current_event_hooks->tracepoint_create (number);
86b725ae77Skettenis }
87b725ae77Skettenis 
88b725ae77Skettenis void
tracepoint_delete_event(int number)89b725ae77Skettenis tracepoint_delete_event (int number)
90b725ae77Skettenis {
91b725ae77Skettenis   if (gdb_events_debug)
92b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "tracepoint_delete_event\n");
93b725ae77Skettenis   if (!current_event_hooks->tracepoint_delete)
94b725ae77Skettenis     return;
95b725ae77Skettenis   current_event_hooks->tracepoint_delete (number);
96b725ae77Skettenis }
97b725ae77Skettenis 
98b725ae77Skettenis void
tracepoint_modify_event(int number)99b725ae77Skettenis tracepoint_modify_event (int number)
100b725ae77Skettenis {
101b725ae77Skettenis   if (gdb_events_debug)
102b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "tracepoint_modify_event\n");
103b725ae77Skettenis   if (!current_event_hooks->tracepoint_modify)
104b725ae77Skettenis     return;
105b725ae77Skettenis   current_event_hooks->tracepoint_modify (number);
106b725ae77Skettenis }
107b725ae77Skettenis 
108b725ae77Skettenis void
architecture_changed_event(void)109b725ae77Skettenis architecture_changed_event (void)
110b725ae77Skettenis {
111b725ae77Skettenis   if (gdb_events_debug)
112b725ae77Skettenis     fprintf_unfiltered (gdb_stdlog, "architecture_changed_event\n");
113b725ae77Skettenis   if (!current_event_hooks->architecture_changed)
114b725ae77Skettenis     return;
115b725ae77Skettenis   current_event_hooks->architecture_changed ();
116b725ae77Skettenis }
117b725ae77Skettenis 
118b725ae77Skettenis struct gdb_events *
deprecated_set_gdb_event_hooks(struct gdb_events * vector)119*11efff7fSkettenis deprecated_set_gdb_event_hooks (struct gdb_events *vector)
120b725ae77Skettenis {
121b725ae77Skettenis   struct gdb_events *old_events = current_event_hooks;
122b725ae77Skettenis   if (vector == NULL)
123b725ae77Skettenis     current_event_hooks = &queue_event_hooks;
124b725ae77Skettenis   else
125b725ae77Skettenis     current_event_hooks = vector;
126b725ae77Skettenis   return old_events;
127b725ae77Skettenis }
128b725ae77Skettenis 
129b725ae77Skettenis void
clear_gdb_event_hooks(void)130b725ae77Skettenis clear_gdb_event_hooks (void)
131b725ae77Skettenis {
132*11efff7fSkettenis   deprecated_set_gdb_event_hooks (&null_event_hooks);
133b725ae77Skettenis }
134b725ae77Skettenis 
135b725ae77Skettenis enum gdb_event
136b725ae77Skettenis {
137b725ae77Skettenis   breakpoint_create,
138b725ae77Skettenis   breakpoint_delete,
139b725ae77Skettenis   breakpoint_modify,
140b725ae77Skettenis   tracepoint_create,
141b725ae77Skettenis   tracepoint_delete,
142b725ae77Skettenis   tracepoint_modify,
143b725ae77Skettenis   architecture_changed,
144b725ae77Skettenis   nr_gdb_events
145b725ae77Skettenis };
146b725ae77Skettenis 
147b725ae77Skettenis struct breakpoint_create
148b725ae77Skettenis   {
149b725ae77Skettenis     int b;
150b725ae77Skettenis   };
151b725ae77Skettenis 
152b725ae77Skettenis struct breakpoint_delete
153b725ae77Skettenis   {
154b725ae77Skettenis     int b;
155b725ae77Skettenis   };
156b725ae77Skettenis 
157b725ae77Skettenis struct breakpoint_modify
158b725ae77Skettenis   {
159b725ae77Skettenis     int b;
160b725ae77Skettenis   };
161b725ae77Skettenis 
162b725ae77Skettenis struct tracepoint_create
163b725ae77Skettenis   {
164b725ae77Skettenis     int number;
165b725ae77Skettenis   };
166b725ae77Skettenis 
167b725ae77Skettenis struct tracepoint_delete
168b725ae77Skettenis   {
169b725ae77Skettenis     int number;
170b725ae77Skettenis   };
171b725ae77Skettenis 
172b725ae77Skettenis struct tracepoint_modify
173b725ae77Skettenis   {
174b725ae77Skettenis     int number;
175b725ae77Skettenis   };
176b725ae77Skettenis 
177b725ae77Skettenis struct event
178b725ae77Skettenis   {
179b725ae77Skettenis     enum gdb_event type;
180b725ae77Skettenis     struct event *next;
181b725ae77Skettenis     union
182b725ae77Skettenis       {
183b725ae77Skettenis 	struct breakpoint_create breakpoint_create;
184b725ae77Skettenis 	struct breakpoint_delete breakpoint_delete;
185b725ae77Skettenis 	struct breakpoint_modify breakpoint_modify;
186b725ae77Skettenis 	struct tracepoint_create tracepoint_create;
187b725ae77Skettenis 	struct tracepoint_delete tracepoint_delete;
188b725ae77Skettenis 	struct tracepoint_modify tracepoint_modify;
189b725ae77Skettenis       }
190b725ae77Skettenis     data;
191b725ae77Skettenis   };
192b725ae77Skettenis struct event *pending_events;
193b725ae77Skettenis struct event *delivering_events;
194b725ae77Skettenis 
195b725ae77Skettenis static void
append(struct event * new_event)196b725ae77Skettenis append (struct event *new_event)
197b725ae77Skettenis {
198b725ae77Skettenis   struct event **event = &pending_events;
199b725ae77Skettenis   while ((*event) != NULL)
200b725ae77Skettenis     event = &((*event)->next);
201b725ae77Skettenis   (*event) = new_event;
202b725ae77Skettenis   (*event)->next = NULL;
203b725ae77Skettenis }
204b725ae77Skettenis 
205b725ae77Skettenis static void
queue_breakpoint_create(int b)206b725ae77Skettenis queue_breakpoint_create (int b)
207b725ae77Skettenis {
208b725ae77Skettenis   struct event *event = XMALLOC (struct event);
209b725ae77Skettenis   event->type = breakpoint_create;
210b725ae77Skettenis   event->data.breakpoint_create.b = b;
211b725ae77Skettenis   append (event);
212b725ae77Skettenis }
213b725ae77Skettenis 
214b725ae77Skettenis static void
queue_breakpoint_delete(int b)215b725ae77Skettenis queue_breakpoint_delete (int b)
216b725ae77Skettenis {
217b725ae77Skettenis   struct event *event = XMALLOC (struct event);
218b725ae77Skettenis   event->type = breakpoint_delete;
219b725ae77Skettenis   event->data.breakpoint_delete.b = b;
220b725ae77Skettenis   append (event);
221b725ae77Skettenis }
222b725ae77Skettenis 
223b725ae77Skettenis static void
queue_breakpoint_modify(int b)224b725ae77Skettenis queue_breakpoint_modify (int b)
225b725ae77Skettenis {
226b725ae77Skettenis   struct event *event = XMALLOC (struct event);
227b725ae77Skettenis   event->type = breakpoint_modify;
228b725ae77Skettenis   event->data.breakpoint_modify.b = b;
229b725ae77Skettenis   append (event);
230b725ae77Skettenis }
231b725ae77Skettenis 
232b725ae77Skettenis static void
queue_tracepoint_create(int number)233b725ae77Skettenis queue_tracepoint_create (int number)
234b725ae77Skettenis {
235b725ae77Skettenis   struct event *event = XMALLOC (struct event);
236b725ae77Skettenis   event->type = tracepoint_create;
237b725ae77Skettenis   event->data.tracepoint_create.number = number;
238b725ae77Skettenis   append (event);
239b725ae77Skettenis }
240b725ae77Skettenis 
241b725ae77Skettenis static void
queue_tracepoint_delete(int number)242b725ae77Skettenis queue_tracepoint_delete (int number)
243b725ae77Skettenis {
244b725ae77Skettenis   struct event *event = XMALLOC (struct event);
245b725ae77Skettenis   event->type = tracepoint_delete;
246b725ae77Skettenis   event->data.tracepoint_delete.number = number;
247b725ae77Skettenis   append (event);
248b725ae77Skettenis }
249b725ae77Skettenis 
250b725ae77Skettenis static void
queue_tracepoint_modify(int number)251b725ae77Skettenis queue_tracepoint_modify (int number)
252b725ae77Skettenis {
253b725ae77Skettenis   struct event *event = XMALLOC (struct event);
254b725ae77Skettenis   event->type = tracepoint_modify;
255b725ae77Skettenis   event->data.tracepoint_modify.number = number;
256b725ae77Skettenis   append (event);
257b725ae77Skettenis }
258b725ae77Skettenis 
259b725ae77Skettenis static void
queue_architecture_changed(void)260b725ae77Skettenis queue_architecture_changed (void)
261b725ae77Skettenis {
262b725ae77Skettenis   struct event *event = XMALLOC (struct event);
263b725ae77Skettenis   event->type = architecture_changed;
264b725ae77Skettenis   append (event);
265b725ae77Skettenis }
266b725ae77Skettenis 
267b725ae77Skettenis void
gdb_events_deliver(struct gdb_events * vector)268b725ae77Skettenis gdb_events_deliver (struct gdb_events *vector)
269b725ae77Skettenis {
270b725ae77Skettenis   /* Just zap any events left around from last time. */
271b725ae77Skettenis   while (delivering_events != NULL)
272b725ae77Skettenis     {
273b725ae77Skettenis       struct event *event = delivering_events;
274b725ae77Skettenis       delivering_events = event->next;
275b725ae77Skettenis       xfree (event);
276b725ae77Skettenis     }
277b725ae77Skettenis   /* Process any pending events.  Because one of the deliveries could
278b725ae77Skettenis      bail out we move everything off of the pending queue onto an
279b725ae77Skettenis      in-progress queue where it can, later, be cleaned up if
280b725ae77Skettenis      necessary. */
281b725ae77Skettenis   delivering_events = pending_events;
282b725ae77Skettenis   pending_events = NULL;
283b725ae77Skettenis   while (delivering_events != NULL)
284b725ae77Skettenis     {
285b725ae77Skettenis       struct event *event = delivering_events;
286b725ae77Skettenis       switch (event->type)
287b725ae77Skettenis 	{
288b725ae77Skettenis 	case breakpoint_create:
289b725ae77Skettenis 	  vector->breakpoint_create
290b725ae77Skettenis 	    (event->data.breakpoint_create.b);
291b725ae77Skettenis 	  break;
292b725ae77Skettenis 	case breakpoint_delete:
293b725ae77Skettenis 	  vector->breakpoint_delete
294b725ae77Skettenis 	    (event->data.breakpoint_delete.b);
295b725ae77Skettenis 	  break;
296b725ae77Skettenis 	case breakpoint_modify:
297b725ae77Skettenis 	  vector->breakpoint_modify
298b725ae77Skettenis 	    (event->data.breakpoint_modify.b);
299b725ae77Skettenis 	  break;
300b725ae77Skettenis 	case tracepoint_create:
301b725ae77Skettenis 	  vector->tracepoint_create
302b725ae77Skettenis 	    (event->data.tracepoint_create.number);
303b725ae77Skettenis 	  break;
304b725ae77Skettenis 	case tracepoint_delete:
305b725ae77Skettenis 	  vector->tracepoint_delete
306b725ae77Skettenis 	    (event->data.tracepoint_delete.number);
307b725ae77Skettenis 	  break;
308b725ae77Skettenis 	case tracepoint_modify:
309b725ae77Skettenis 	  vector->tracepoint_modify
310b725ae77Skettenis 	    (event->data.tracepoint_modify.number);
311b725ae77Skettenis 	  break;
312b725ae77Skettenis 	case architecture_changed:
313b725ae77Skettenis 	  vector->architecture_changed ();
314b725ae77Skettenis 	  break;
315b725ae77Skettenis 	}
316b725ae77Skettenis       delivering_events = event->next;
317b725ae77Skettenis       xfree (event);
318b725ae77Skettenis     }
319b725ae77Skettenis }
320b725ae77Skettenis 
321b725ae77Skettenis void _initialize_gdb_events (void);
322b725ae77Skettenis void
_initialize_gdb_events(void)323b725ae77Skettenis _initialize_gdb_events (void)
324b725ae77Skettenis {
325b725ae77Skettenis   struct cmd_list_element *c;
326b725ae77Skettenis   queue_event_hooks.breakpoint_create = queue_breakpoint_create;
327b725ae77Skettenis   queue_event_hooks.breakpoint_delete = queue_breakpoint_delete;
328b725ae77Skettenis   queue_event_hooks.breakpoint_modify = queue_breakpoint_modify;
329b725ae77Skettenis   queue_event_hooks.tracepoint_create = queue_tracepoint_create;
330b725ae77Skettenis   queue_event_hooks.tracepoint_delete = queue_tracepoint_delete;
331b725ae77Skettenis   queue_event_hooks.tracepoint_modify = queue_tracepoint_modify;
332b725ae77Skettenis   queue_event_hooks.architecture_changed = queue_architecture_changed;
333b725ae77Skettenis 
334b725ae77Skettenis   c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
335b725ae77Skettenis 		   (char *) (&gdb_events_debug), "Set event debugging.\n\
336b725ae77Skettenis When non-zero, event/notify debugging is enabled.", &setlist);
337b725ae77Skettenis   deprecate_cmd (c, "set debug event");
338*11efff7fSkettenis   deprecate_cmd (deprecated_add_show_from_set (c, &showlist),
339*11efff7fSkettenis 		 "show debug event");
340b725ae77Skettenis 
341*11efff7fSkettenis   deprecated_add_show_from_set
342*11efff7fSkettenis     (add_set_cmd ("event",
343b725ae77Skettenis 		  class_maintenance,
344b725ae77Skettenis 		  var_zinteger,
345b725ae77Skettenis 		  (char *) (&gdb_events_debug),
346b725ae77Skettenis 		  "Set event debugging.\n\
347b725ae77Skettenis When non-zero, event/notify debugging is enabled.", &setdebuglist),
348b725ae77Skettenis      &showdebuglist);
349b725ae77Skettenis }
350