2000-12-17 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
[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
4b3cb714 37# Each of the variable events (as currently generated) is converted
104c1213
JM
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
afbfc876 116 This file is part of GDB.
104c1213 117
afbfc876
AC
118 This program is free software; you can redistribute it and/or modify
119 it under the terms of the GNU General Public License as published by
120 the Free Software Foundation; either version 2 of the License, or
121 (at your option) any later version.
104c1213 122
afbfc876
AC
123 This program is distributed in the hope that it will be useful,
124 but WITHOUT ANY WARRANTY; without even the implied warranty of
125 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
126 GNU General Public License for more details.
104c1213 127
afbfc876
AC
128 You should have received a copy of the GNU General Public License
129 along with this program; if not, write to the Free Software
130 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
104c1213
JM
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
afbfc876 391{
104c1213
JM
392EOF
393function_list | while eval read $read
394do
395 case "${class}" in
396 "f" )
afbfc876 397 echo " ${function},"
104c1213
JM
398 ;;
399 esac
400done
401cat <<EOF
afbfc876
AC
402 nr_gdb_events
403};
104c1213
JM
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{
afbfc876 538 struct cmd_list_element *c;
104c1213
JM
539#if WITH_GDB_EVENTS
540EOF
541function_list | while eval read $read
542do
543 case "${class}" in
544 "f" )
545 echo " queue_event_hooks.${function} = queue_${function};"
546 ;;
547 esac
548done
549cat <<EOF
550#endif
afbfc876
AC
551
552 c = add_set_cmd ("eventdebug", class_maintenance, var_zinteger,
553 (char *) (&gdb_events_debug), "Set event debugging.\n\\
554When non-zero, event/notify debugging is enabled.", &setlist);
555 deprecate_cmd (c, "set debug event");
556 deprecate_cmd (add_show_from_set (c, &showlist), "show debug event");
557
558 add_show_from_set (add_set_cmd ("event",
104c1213
JM
559 class_maintenance,
560 var_zinteger,
afbfc876 561 (char *) (&gdb_events_debug),
104c1213 562 "Set event debugging.\n\\
afbfc876
AC
563When non-zero, event/notify debugging is enabled.", &setdebuglist),
564 &showdebuglist);
104c1213
JM
565}
566EOF
567
568# close things off
569exec 1>&2
570#../move-if-change new-gdb-events.c gdb-events.c
afbfc876
AC
571# Replace any leading spaces with tabs
572sed < new-gdb-events.c > tmp-gdb-events.c \
573 -e 's/\( \)* /\1 /g'
574mv tmp-gdb-events.c new-gdb-events.c
575# Move if changed?
104c1213
JM
576if ! test -r gdb-events.c
577then
578 echo "File missing? mv new-gdb-events.c gdb-events.c" 1>&2
579elif ! diff -c gdb-events.c new-gdb-events.c
580then
581 echo "gdb-events.c changed? cp new-gdb-events.c gdb-events.c" 1>&2
582fi
This page took 0.0864 seconds and 4 git commands to generate.