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