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