* lib/mi-support.exp (mi_gdb_load): Fix typo.
[deliverable/binutils-gdb.git] / gdb / gdb-events.sh
CommitLineData
104c1213
JM
1#!/bin/sh
2
3# User Interface Events.
11dced61
AC
4#
5# Copyright 1999, 2000, 2001, 2002, 2004, 2005 Free Software
6# Foundation, Inc.
104c1213
JM
7#
8# Contributed by Cygnus Solutions.
9#
10# This file is part of GDB.
11#
12# This program is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program; if not, write to the Free Software
30867156
MS
24# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
25# USA.
104c1213 26
104c1213
JM
27IFS=:
28
29read="class returntype function formal actual attrib"
30
31function_list ()
32{
33 # category:
34 # # -> disable
35 # * -> compatibility - pointer variable that is initialized
36 # by set_gdb_events().
37 # ? -> Predicate and function proper.
38 # f -> always call (must have a void returntype)
39 # return-type
40 # name
41 # formal argument list
42 # actual argument list
43 # attributes
44 # description
45 cat <<EOF |
46f:void:breakpoint_create:int b:b
47f:void:breakpoint_delete:int b:b
48f:void:breakpoint_modify:int b:b
ba9fe036
KS
49f:void:tracepoint_create:int number:number
50f:void:tracepoint_delete:int number:number
51f:void:tracepoint_modify:int number:number
67c2c32c 52f:void:architecture_changed:void
104c1213
JM
53EOF
54 grep -v '^#'
55}
56
57copyright ()
58{
59 cat <<EOF
60/* User Interface Events.
349c5d5f 61
11dced61
AC
62 Copyright 1999, 2001, 2002, 2004, 2005 Free Software Foundation,
63 Inc.
104c1213
JM
64
65 Contributed by Cygnus Solutions.
66
afbfc876 67 This file is part of GDB.
104c1213 68
afbfc876
AC
69 This program is free software; you can redistribute it and/or modify
70 it under the terms of the GNU General Public License as published by
71 the Free Software Foundation; either version 2 of the License, or
72 (at your option) any later version.
104c1213 73
afbfc876
AC
74 This program is distributed in the hope that it will be useful,
75 but WITHOUT ANY WARRANTY; without even the implied warranty of
76 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
77 GNU General Public License for more details.
104c1213 78
afbfc876
AC
79 You should have received a copy of the GNU General Public License
80 along with this program; if not, write to the Free Software
81 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
104c1213
JM
82
83/* Work in progress */
84
85/* This file was created with the aid of \`\`gdb-events.sh''.
86
87 The bourn shell script \`\`gdb-events.sh'' creates the files
88 \`\`new-gdb-events.c'' and \`\`new-gdb-events.h and then compares
89 them against the existing \`\`gdb-events.[hc]''. Any differences
90 found being reported.
91
92 If editing this file, please also run gdb-events.sh and merge any
93 changes into that script. Conversely, when making sweeping changes
94 to this file, modifying gdb-events.sh and using its output may
30867156 95 prove easier. */
104c1213
JM
96
97EOF
98}
99
100#
101# The .h file
102#
103
104exec > new-gdb-events.h
105copyright
106cat <<EOF
107
108#ifndef GDB_EVENTS_H
109#define GDB_EVENTS_H
104c1213
JM
110EOF
111
112# pointer declarations
113echo ""
114echo ""
115cat <<EOF
116/* COMPAT: pointer variables for old, unconverted events.
117 A call to set_gdb_events() will automatically update these. */
118EOF
119echo ""
120function_list | while eval read $read
121do
122 case "${class}" in
123 "*" )
124 echo "extern ${returntype} (*${function}_event) (${formal})${attrib};"
125 ;;
126 esac
127done
128
129# function typedef's
130echo ""
131echo ""
132cat <<EOF
30867156
MS
133/* Type definition of all hook functions. Recommended pratice is to
134 first declare each hook function using the below ftype and then
135 define it. */
104c1213
JM
136EOF
137echo ""
138function_list | while eval read $read
139do
140 echo "typedef ${returntype} (gdb_events_${function}_ftype) (${formal});"
141done
142
143# gdb_events object
144echo ""
145echo ""
146cat <<EOF
147/* gdb-events: object. */
148EOF
149echo ""
150echo "struct gdb_events"
151echo " {"
152function_list | while eval read $read
153do
154 echo " gdb_events_${function}_ftype *${function}${attrib};"
155done
156echo " };"
157
158# function declarations
159echo ""
160echo ""
161cat <<EOF
162/* Interface into events functions.
c4093a6a 163 Where a *_p() predicate is present, it must be called before
30867156 164 calling the hook proper. */
104c1213
JM
165EOF
166function_list | while eval read $read
167do
168 case "${class}" in
169 "*" ) continue ;;
170 "?" )
171 echo "extern int ${function}_p (void);"
172 echo "extern ${returntype} ${function}_event (${formal})${attrib};"
173 ;;
174 "f" )
175 echo "extern ${returntype} ${function}_event (${formal})${attrib};"
176 ;;
177 esac
178done
179
104c1213
JM
180# our set function
181cat <<EOF
182
30867156 183/* Install custom gdb-events hooks. */
2726dafc 184extern struct gdb_events *deprecated_set_gdb_event_hooks (struct gdb_events *vector);
104c1213 185
30867156 186/* Deliver any pending events. */
104c1213
JM
187extern void gdb_events_deliver (struct gdb_events *vector);
188
30867156 189/* Clear event handlers. */
63d022e0 190extern void clear_gdb_event_hooks (void);
104c1213
JM
191EOF
192
193# close it off
194echo ""
195echo "#endif"
196exec 1>&2
197#../move-if-change new-gdb-events.h gdb-events.h
9e791099 198if test -r gdb-events.h
104c1213 199then
9e791099
KS
200 diff -c gdb-events.h new-gdb-events.h
201 if [ $? = 1 ]
202 then
203 echo "gdb-events.h changed? cp new-gdb-events.h gdb-events.h" 1>&2
204 fi
205else
104c1213 206 echo "File missing? mv new-gdb-events.h gdb-events.h" 1>&2
104c1213
JM
207fi
208
209
210
211#
212# C file
213#
214
215exec > new-gdb-events.c
216copyright
217cat <<EOF
218
219#include "defs.h"
220#include "gdb-events.h"
221#include "gdbcmd.h"
222
104c1213
JM
223static struct gdb_events null_event_hooks;
224static struct gdb_events queue_event_hooks;
225static struct gdb_events *current_event_hooks = &null_event_hooks;
104c1213
JM
226
227int gdb_events_debug;
920d2a44
AC
228static void
229show_gdb_events_debug (struct ui_file *file, int from_tty,
230 struct cmd_list_element *c, const char *value)
231{
232 fprintf_filtered (file, _("Event debugging is %s.\\n"), value);
233}
234
104c1213
JM
235EOF
236
104c1213 237# function bodies
104c1213
JM
238function_list | while eval read $read
239do
240 case "${class}" in
241 "*" ) continue ;;
242 "?" )
9e791099
KS
243cat <<EOF
244
245int
246${function}_event_p (${formal})
247{
248 return current_event_hooks->${function};
249}
250
251${returntype}
252${function}_event (${formal})
253{
254 return current_events->${function} (${actual});
255}
256EOF
104c1213
JM
257 ;;
258 "f" )
9e791099
KS
259cat <<EOF
260
261void
262${function}_event (${formal})
263{
264 if (gdb_events_debug)
8c6ee715 265 fprintf_unfiltered (gdb_stdlog, "${function}_event\n");
9e791099
KS
266 if (!current_event_hooks->${function})
267 return;
268 current_event_hooks->${function} (${actual});
269}
270EOF
104c1213
JM
271 ;;
272 esac
273done
104c1213
JM
274
275# Set hooks function
276echo ""
277cat <<EOF
ed9a39eb 278struct gdb_events *
2726dafc 279deprecated_set_gdb_event_hooks (struct gdb_events *vector)
104c1213 280{
ed9a39eb 281 struct gdb_events *old_events = current_event_hooks;
104c1213
JM
282 if (vector == NULL)
283 current_event_hooks = &queue_event_hooks;
284 else
285 current_event_hooks = vector;
ed9a39eb 286 return old_events;
104c1213
JM
287EOF
288function_list | while eval read $read
289do
290 case "${class}" in
291 "*" )
292 echo " ${function}_event = hooks->${function};"
293 ;;
294 esac
295done
296cat <<EOF
297}
104c1213
JM
298EOF
299
63d022e0
KS
300# Clear hooks function
301echo ""
302cat <<EOF
63d022e0
KS
303void
304clear_gdb_event_hooks (void)
305{
2726dafc 306 deprecated_set_gdb_event_hooks (&null_event_hooks);
63d022e0 307}
63d022e0
KS
308EOF
309
104c1213
JM
310# event type
311echo ""
312cat <<EOF
313enum gdb_event
afbfc876 314{
104c1213
JM
315EOF
316function_list | while eval read $read
317do
318 case "${class}" in
319 "f" )
afbfc876 320 echo " ${function},"
104c1213
JM
321 ;;
322 esac
323done
324cat <<EOF
afbfc876
AC
325 nr_gdb_events
326};
104c1213
JM
327EOF
328
329# event data
330echo ""
331function_list | while eval read $read
332do
333 case "${class}" in
334 "f" )
fd969be2
KS
335 if test ${actual}
336 then
337 echo "struct ${function}"
338 echo " {"
339 echo " `echo ${formal} | tr '[,]' '[;]'`;"
340 echo " };"
341 echo ""
342 fi
104c1213
JM
343 ;;
344 esac
345done
346
347# event queue
348cat <<EOF
349struct event
350 {
351 enum gdb_event type;
352 struct event *next;
353 union
354 {
355EOF
356function_list | while eval read $read
357do
358 case "${class}" in
359 "f" )
fd969be2
KS
360 if test ${actual}
361 then
362 echo " struct ${function} ${function};"
363 fi
104c1213
JM
364 ;;
365 esac
366done
367cat <<EOF
368 }
369 data;
370 };
371struct event *pending_events;
372struct event *delivering_events;
373EOF
374
375# append
376echo ""
377cat <<EOF
378static void
379append (struct event *new_event)
380{
381 struct event **event = &pending_events;
382 while ((*event) != NULL)
383 event = &((*event)->next);
384 (*event) = new_event;
385 (*event)->next = NULL;
386}
387EOF
388
389# schedule a given event
390function_list | while eval read $read
391do
392 case "${class}" in
393 "f" )
394 echo ""
395 echo "static void"
396 echo "queue_${function} (${formal})"
397 echo "{"
398 echo " struct event *event = XMALLOC (struct event);"
399 echo " event->type = ${function};"
9e791099 400 for arg in `echo ${actual} | tr '[,]' '[:]' | tr -d '[ ]'`; do
104c1213
JM
401 echo " event->data.${function}.${arg} = ${arg};"
402 done
403 echo " append (event);"
404 echo "}"
405 ;;
406 esac
407done
408
409# deliver
410echo ""
411cat <<EOF
412void
413gdb_events_deliver (struct gdb_events *vector)
414{
415 /* Just zap any events left around from last time. */
416 while (delivering_events != NULL)
417 {
418 struct event *event = delivering_events;
419 delivering_events = event->next;
e28f816a 420 xfree (event);
104c1213
JM
421 }
422 /* Process any pending events. Because one of the deliveries could
423 bail out we move everything off of the pending queue onto an
424 in-progress queue where it can, later, be cleaned up if
425 necessary. */
426 delivering_events = pending_events;
427 pending_events = NULL;
428 while (delivering_events != NULL)
429 {
430 struct event *event = delivering_events;
431 switch (event->type)
432 {
433EOF
434function_list | while eval read $read
435do
436 case "${class}" in
437 "f" )
438 echo " case ${function}:"
fd969be2
KS
439 if test ${actual}
440 then
441 echo " vector->${function}"
442 sep=" ("
443 ass=""
444 for arg in `echo ${actual} | tr '[,]' '[:]' | tr -d '[ ]'`; do
445 ass="${ass}${sep}event->data.${function}.${arg}"
446 sep=",
447 "
448 done
449 echo "${ass});"
450 else
451 echo " vector->${function} ();"
452 fi
104c1213
JM
453 echo " break;"
454 ;;
455 esac
456done
457cat <<EOF
458 }
459 delivering_events = event->next;
e28f816a 460 xfree (event);
104c1213
JM
461 }
462}
463EOF
464
465# Finally the initialization
466echo ""
467cat <<EOF
468void _initialize_gdb_events (void);
469void
470_initialize_gdb_events (void)
471{
afbfc876 472 struct cmd_list_element *c;
104c1213
JM
473EOF
474function_list | while eval read $read
475do
476 case "${class}" in
477 "f" )
478 echo " queue_event_hooks.${function} = queue_${function};"
479 ;;
480 esac
481done
482cat <<EOF
afbfc876 483
85c07804
AC
484 add_setshow_zinteger_cmd ("event", class_maintenance,
485 &gdb_events_debug, _("\\
486Set event debugging."), _("\\
487Show event debugging."), _("\\
488When non-zero, event/notify debugging is enabled."),
489 NULL,
920d2a44 490 show_gdb_events_debug,
85c07804 491 &setdebuglist, &showdebuglist);
104c1213
JM
492}
493EOF
494
495# close things off
496exec 1>&2
497#../move-if-change new-gdb-events.c gdb-events.c
afbfc876
AC
498# Replace any leading spaces with tabs
499sed < new-gdb-events.c > tmp-gdb-events.c \
500 -e 's/\( \)* /\1 /g'
501mv tmp-gdb-events.c new-gdb-events.c
502# Move if changed?
9e791099 503if test -r gdb-events.c
104c1213 504then
9e791099
KS
505 diff -c gdb-events.c new-gdb-events.c
506 if [ $? = 1 ]
507 then
508 echo "gdb-events.c changed? cp new-gdb-events.c gdb-events.c" 1>&2
509 fi
510else
104c1213 511 echo "File missing? mv new-gdb-events.c gdb-events.c" 1>&2
104c1213 512fi
This page took 0.429195 seconds and 4 git commands to generate.