This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / gdb / gdb-events.sh
CommitLineData
104c1213
JM
1#!/bin/sh
2
3# User Interface Events.
d9fcf2fb 4# Copyright 1999-2000 Free Software Foundation, Inc.
104c1213
JM
5#
6# Contributed by Cygnus Solutions.
7#
8# This file is part of GDB.
9#
10# This program is free software; you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# along with this program; if not, write to the Free Software
22# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
24#
25# What happens next:
26#
27
28# The gdb-events.h/gdb-events.c files this script generates are commited
29# and published.
30
31# Any UI module that is installing events is changed so that the
32# events are installed using the ``set_gdb_events()'' and
33# ``gdb_event_hooks()'' interfaces. There could prove to be an issue
34# here with respect to annotate. We might need to accomodate a hook
35# stack that allows several ui blocks to install their own events.
36
37# Each of the variable events (as currently generated) is converteded
38# to either a straight function call or a function call with a
39# predicate.
40
41
42IFS=:
43
44read="class returntype function formal actual attrib"
45
46function_list ()
47{
48 # category:
49 # # -> disable
50 # * -> compatibility - pointer variable that is initialized
51 # by set_gdb_events().
52 # ? -> Predicate and function proper.
53 # f -> always call (must have a void returntype)
54 # return-type
55 # name
56 # formal argument list
57 # actual argument list
58 # attributes
59 # description
60 cat <<EOF |
61f:void:breakpoint_create:int b:b
62f:void:breakpoint_delete:int b:b
63f:void:breakpoint_modify:int b:b
64#*:void:annotate_starting_hook:void
65#*:void:annotate_stopped_hook:void
66#*:void:annotate_signalled_hook:void
67#*:void:annotate_signal_hook:void
68#*:void:annotate_exited_hook:void
69##*:void:print_register_hook:int
70##*:CORE_ADDR:find_toc_address_hook:CORE_ADDR
71##*:void:sparc_print_register_hook:int regno:regno
72#*:void:target_resume_hook:void
73#*:void:target_wait_loop_hook:void
74#*:void:init_gdb_hook:char *argv0:argv0
75#*:void:command_loop_hook:void
d9fcf2fb 76#*:void:fputs_unfiltered_hook:const char *linebuff,struct ui_file *stream:linebuff, stream
104c1213
JM
77#*:void:print_frame_info_listing_hook:struct symtab *s, int line, int stopline, int noerror:s, line, stopline, noerror
78#*:int:query_hook:const char *query, va_list args:query, args
79#*:void:warning_hook:const char *string, va_list args:string, args
104c1213
JM
80#*:void:target_output_hook:char *b:b
81#*:void:interactive_hook:void
82#*:void:registers_changed_hook:void
83#*:void:readline_begin_hook:char *format, ...:format
84#*:char *:readline_hook:char *prompt:prompt
85#*:void:readline_end_hook:void
86#*:void:register_changed_hook:int regno:regno
87#*:void:memory_changed_hook:CORE_ADDR addr, int len:addr, len
88#*:void:context_hook:int num:num
89#*:int:target_wait_hook:int pid, struct target_waitstatus *status:pid, status
90#*:void:call_command_hook:struct cmd_list_element *c, char *cmd, int from_tty:c, cmd, from_tty
91#*:NORETURN void:error_hook:void:: ATTR_NORETURN
92#*:void:error_begin_hook:void
93##*:int:target_architecture_hook:const struct bfd_arch_info *
94#*:void:exec_file_display_hook:char *filename:filename
95#*:void:file_changed_hook:char *filename:filename
96##*:void:specify_exec_file_hook:
97#*:int:gdb_load_progress_hook:char *section, unsigned long num:section, num
98#*:void:pre_add_symbol_hook:char *name:name
99#*:void:post_add_symbol_hook:void
100#*:void:selected_frame_level_changed_hook:int level:level
101#*:int:gdb_loop_hook:int signo:signo
102##*:void:solib_create_inferior_hook:void
103##*:void:xcoff_relocate_symtab_hook:unsigned int
104EOF
105 grep -v '^#'
106}
107
108copyright ()
109{
110 cat <<EOF
111/* User Interface Events.
112 Copyright 1999 Free Software Foundation, Inc.
113
114 Contributed by Cygnus Solutions.
115
116This file is part of GDB.
117
118This program is free software; you can redistribute it and/or modify
119it under the terms of the GNU General Public License as published by
120the Free Software Foundation; either version 2 of the License, or
121(at your option) any later version.
122
123This program is distributed in the hope that it will be useful,
124but WITHOUT ANY WARRANTY; without even the implied warranty of
125MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
126GNU General Public License for more details.
127
128You should have received a copy of the GNU General Public License
129along with this program; if not, write to the Free Software
130Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
131
132/* Work in progress */
133
134/* This file was created with the aid of \`\`gdb-events.sh''.
135
136 The bourn shell script \`\`gdb-events.sh'' creates the files
137 \`\`new-gdb-events.c'' and \`\`new-gdb-events.h and then compares
138 them against the existing \`\`gdb-events.[hc]''. Any differences
139 found being reported.
140
141 If editing this file, please also run gdb-events.sh and merge any
142 changes into that script. Conversely, when making sweeping changes
143 to this file, modifying gdb-events.sh and using its output may
144 prove easier. */
145
146EOF
147}
148
149#
150# The .h file
151#
152
153exec > new-gdb-events.h
154copyright
155cat <<EOF
156
157#ifndef GDB_EVENTS_H
158#define GDB_EVENTS_H
159
160#ifndef WITH_GDB_EVENTS
161#define WITH_GDB_EVENTS 1
162#endif
163EOF
164
165# pointer declarations
166echo ""
167echo ""
168cat <<EOF
169/* COMPAT: pointer variables for old, unconverted events.
170 A call to set_gdb_events() will automatically update these. */
171EOF
172echo ""
173function_list | while eval read $read
174do
175 case "${class}" in
176 "*" )
177 echo "extern ${returntype} (*${function}_event) (${formal})${attrib};"
178 ;;
179 esac
180done
181
182# function typedef's
183echo ""
184echo ""
185cat <<EOF
186/* Type definition of all hook functions.
187 Recommended pratice is to first declare each hook function using
188 the below ftype and then define it. */
189EOF
190echo ""
191function_list | while eval read $read
192do
193 echo "typedef ${returntype} (gdb_events_${function}_ftype) (${formal});"
194done
195
196# gdb_events object
197echo ""
198echo ""
199cat <<EOF
200/* gdb-events: object. */
201EOF
202echo ""
203echo "struct gdb_events"
204echo " {"
205function_list | while eval read $read
206do
207 echo " gdb_events_${function}_ftype *${function}${attrib};"
208done
209echo " };"
210
211# function declarations
212echo ""
213echo ""
214cat <<EOF
215/* Interface into events functions.
c4093a6a
JM
216 Where a *_p() predicate is present, it must be called before
217 calling the hook proper. */
104c1213
JM
218EOF
219function_list | while eval read $read
220do
221 case "${class}" in
222 "*" ) continue ;;
223 "?" )
224 echo "extern int ${function}_p (void);"
225 echo "extern ${returntype} ${function}_event (${formal})${attrib};"
226 ;;
227 "f" )
228 echo "extern ${returntype} ${function}_event (${formal})${attrib};"
229 ;;
230 esac
231done
232
233# function macros
234echo ""
235echo ""
236cat <<EOF
237/* When GDB_EVENTS are not being used, completly disable them. */
238EOF
239echo ""
240echo "#if !WITH_GDB_EVENTS"
241function_list | while eval read $read
242do
243 case "${class}" in
244 "*" ) continue ;;
245 "?" )
246 echo "#define ${function}_event_p() 0"
247 echo "#define ${function}_event(${actual}) 0"
248 ;;
249 "f" )
250 echo "#define ${function}_event(${actual}) 0"
251 ;;
252 esac
253done
254echo "#endif"
255
256# our set function
257cat <<EOF
258
259/* Install custom gdb-events hooks. */
ed9a39eb 260extern struct gdb_events *set_gdb_event_hooks (struct gdb_events *vector);
104c1213
JM
261
262/* Deliver any pending events. */
263extern void gdb_events_deliver (struct gdb_events *vector);
264
265#if !WITH_GDB_EVENTS
266#define set_gdb_events(x) 0
267#define set_gdb_event_hooks(x) 0
268#define gdb_events_deliver(x) 0
269#endif
270EOF
271
272# close it off
273echo ""
274echo "#endif"
275exec 1>&2
276#../move-if-change new-gdb-events.h gdb-events.h
277if ! test -r gdb-events.h
278then
279 echo "File missing? mv new-gdb-events.h gdb-events.h" 1>&2
280elif ! diff -c gdb-events.h new-gdb-events.h
281then
282 echo "gdb-events.h changed? cp new-gdb-events.h gdb-events.h" 1>&2
283fi
284
285
286
287#
288# C file
289#
290
291exec > new-gdb-events.c
292copyright
293cat <<EOF
294
295#include "defs.h"
296#include "gdb-events.h"
297#include "gdbcmd.h"
298
299#undef XMALLOC
300#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
301
302#if WITH_GDB_EVENTS
303static struct gdb_events null_event_hooks;
304static struct gdb_events queue_event_hooks;
305static struct gdb_events *current_event_hooks = &null_event_hooks;
306#endif
307
308int gdb_events_debug;
309EOF
310
311# global pointer variables - always have this
312#echo ""
313#function_list | while eval read $read
314#do
315# case "${class}" in
316# "*" )
317# echo "${returntype} (*${function}_event) (${formal})${attrib} = 0;"
318# ;;
319# esac
320#done
321
322# function bodies
323echo ""
324echo "#if WITH_GDB_EVENTS"
325function_list | while eval read $read
326do
327 case "${class}" in
328 "*" ) continue ;;
329 "?" )
330 echo ""
331 echo "int"
332 echo "${function}_event_p (${formal})"
333 echo "{"
334 echo " return current_event_hooks->${function};"
335 echo "}"
336 echo ""
337 echo "${returntype}"
338 echo "${function}_event (${formal})"
339 echo "{"
340 echo " return current_events->${function} (${actual});"
341 echo "}"
342 ;;
343 "f" )
344 echo ""
345 echo "void"
346 echo "${function}_event (${formal})"
347 echo "{"
348 echo " if (gdb_events_debug)"
349 echo " fprintf_unfiltered (gdb_stdlog, \"${function}_event\\n\");"
350 echo " if (!current_event_hooks->${function})"
351 echo " return;"
352 echo " current_event_hooks->${function} (${actual});"
353 echo "}"
354 ;;
355 esac
356done
357echo ""
358echo "#endif"
359
360# Set hooks function
361echo ""
362cat <<EOF
363#if WITH_GDB_EVENTS
ed9a39eb 364struct gdb_events *
104c1213
JM
365set_gdb_event_hooks (struct gdb_events *vector)
366{
ed9a39eb 367 struct gdb_events *old_events = current_event_hooks;
104c1213
JM
368 if (vector == NULL)
369 current_event_hooks = &queue_event_hooks;
370 else
371 current_event_hooks = vector;
ed9a39eb 372 return old_events;
104c1213
JM
373EOF
374function_list | while eval read $read
375do
376 case "${class}" in
377 "*" )
378 echo " ${function}_event = hooks->${function};"
379 ;;
380 esac
381done
382cat <<EOF
383}
384#endif
385EOF
386
387# event type
388echo ""
389cat <<EOF
390enum gdb_event
391 {
392EOF
393function_list | while eval read $read
394do
395 case "${class}" in
396 "f" )
397 echo " ${function},"
398 ;;
399 esac
400done
401cat <<EOF
402 nr_gdb_events
403 };
404EOF
405
406# event data
407echo ""
408function_list | while eval read $read
409do
410 case "${class}" in
411 "f" )
412 echo "struct ${function}"
413 echo " {"
414 echo " `echo ${formal} | tr '[,]' '[;]'`;"
415 echo " };"
416 echo ""
417 ;;
418 esac
419done
420
421# event queue
422cat <<EOF
423struct event
424 {
425 enum gdb_event type;
426 struct event *next;
427 union
428 {
429EOF
430function_list | while eval read $read
431do
432 case "${class}" in
433 "f" )
434 echo " struct ${function} ${function};"
435 ;;
436 esac
437done
438cat <<EOF
439 }
440 data;
441 };
442struct event *pending_events;
443struct event *delivering_events;
444EOF
445
446# append
447echo ""
448cat <<EOF
449static void
450append (struct event *new_event)
451{
452 struct event **event = &pending_events;
453 while ((*event) != NULL)
454 event = &((*event)->next);
455 (*event) = new_event;
456 (*event)->next = NULL;
457}
458EOF
459
460# schedule a given event
461function_list | while eval read $read
462do
463 case "${class}" in
464 "f" )
465 echo ""
466 echo "static void"
467 echo "queue_${function} (${formal})"
468 echo "{"
469 echo " struct event *event = XMALLOC (struct event);"
470 echo " event->type = ${function};"
471 for arg in `echo ${actual} | tr '[,]' '[ ]'`; do
472 echo " event->data.${function}.${arg} = ${arg};"
473 done
474 echo " append (event);"
475 echo "}"
476 ;;
477 esac
478done
479
480# deliver
481echo ""
482cat <<EOF
483void
484gdb_events_deliver (struct gdb_events *vector)
485{
486 /* Just zap any events left around from last time. */
487 while (delivering_events != NULL)
488 {
489 struct event *event = delivering_events;
490 delivering_events = event->next;
491 free (event);
492 }
493 /* Process any pending events. Because one of the deliveries could
494 bail out we move everything off of the pending queue onto an
495 in-progress queue where it can, later, be cleaned up if
496 necessary. */
497 delivering_events = pending_events;
498 pending_events = NULL;
499 while (delivering_events != NULL)
500 {
501 struct event *event = delivering_events;
502 switch (event->type)
503 {
504EOF
505function_list | while eval read $read
506do
507 case "${class}" in
508 "f" )
509 echo " case ${function}:"
510 echo " vector->${function}"
511 sep=" ("
512 ass=""
513 for arg in `echo ${actual} | tr '[,]' '[ ]'`; do
514 ass="${ass}${sep}event->data.${function}.${arg}"
515 sep=",
516 "
517 done
518 echo "${ass});"
519 echo " break;"
520 ;;
521 esac
522done
523cat <<EOF
524 }
525 delivering_events = event->next;
526 free (event);
527 }
528}
529EOF
530
531# Finally the initialization
532echo ""
533cat <<EOF
534void _initialize_gdb_events (void);
535void
536_initialize_gdb_events (void)
537{
538#if WITH_GDB_EVENTS
539EOF
540function_list | while eval read $read
541do
542 case "${class}" in
543 "f" )
544 echo " queue_event_hooks.${function} = queue_${function};"
545 ;;
546 esac
547done
548cat <<EOF
549#endif
550 add_show_from_set (add_set_cmd ("eventdebug",
551 class_maintenance,
552 var_zinteger,
553 (char *)&gdb_events_debug,
554 "Set event debugging.\n\\
555When non-zero, event/notify debugging is enabled.", &setlist),
556 &showlist);
557}
558EOF
559
560# close things off
561exec 1>&2
562#../move-if-change new-gdb-events.c gdb-events.c
563if ! test -r gdb-events.c
564then
565 echo "File missing? mv new-gdb-events.c gdb-events.c" 1>&2
566elif ! diff -c gdb-events.c new-gdb-events.c
567then
568 echo "gdb-events.c changed? cp new-gdb-events.c gdb-events.c" 1>&2
569fi
This page took 0.057099 seconds and 4 git commands to generate.