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