1#!/bin/sh -u
2
3# Register protocol definitions for GDB, the GNU debugger.
4# Copyright (C) 2001-2020 Free Software Foundation, Inc.
5#
6# This file is part of GDB.
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21# Format of the input files
22read="type entry"
23
24do_read ()
25{
26    type=""
27    entry=""
28    while read line
29    do
30	if test "${line}" = ""
31	then
32	    continue
33	elif test "${line}" = "#" -a "${comment}" = ""
34	then
35	    continue
36	elif expr "${line}" : "#" > /dev/null
37	then
38	    comment="${comment}
39${line}"
40	else
41
42	    # The semantics of IFS varies between different SH's.  Some
43	    # treat ``::' as three fields while some treat it as just too.
44	    # Work around this by eliminating ``::'' ....
45	    line="`echo "${line}" | sed -e 's/::/: :/g' -e 's/::/: :/g'`"
46
47	    OFS="${IFS}" ; IFS="[:]"
48	    eval read ${read} <<EOF
49${line}
50EOF
51	    IFS="${OFS}"
52
53	    # .... and then going back through each field and strip out those
54	    # that ended up with just that space character.
55	    for r in ${read}
56	    do
57		if eval test \"\${${r}}\" = \"\ \"
58		then
59		    eval ${r}=""
60		fi
61	    done
62
63	    break
64	fi
65    done
66    if [ -n "${type}" ]
67    then
68	true
69    else
70	false
71    fi
72}
73
74if test ! -r $1; then
75  echo "$0: Could not open $1." 1>&2
76  exit 1
77fi
78
79copyright ()
80{
81cat <<EOF
82/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
83
84/* A register protocol for GDB, the GNU debugger.
85   Copyright (C) 2001-2013 Free Software Foundation, Inc.
86
87   This file is part of GDB.
88
89   This program is free software; you can redistribute it and/or modify
90   it under the terms of the GNU General Public License as published by
91   the Free Software Foundation; either version 3 of the License, or
92   (at your option) any later version.
93
94   This program is distributed in the hope that it will be useful,
95   but WITHOUT ANY WARRANTY; without even the implied warranty of
96   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
97   GNU General Public License for more details.
98
99   You should have received a copy of the GNU General Public License
100   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
101
102/* This file was created with the aid of \`\`regdat.sh'' and \`\`$1''.  */
103
104EOF
105}
106
107
108exec > new-$2
109copyright $1
110echo '#include "server.h"'
111echo '#include "regdef.h"'
112echo '#include "tdesc.h"'
113echo
114offset=0
115i=0
116name=x
117xmltarget=x
118xmlarch=x
119xmlosabi=x
120expedite=x
121feature=x
122exec < $1
123while do_read
124do
125  if test "${type}" = "name"; then
126    name="${entry}"
127
128    echo "const struct target_desc *tdesc_${name};"
129    echo ""
130
131    # This is necessary for -Wmissing-declarations.
132    echo "void init_registers_${name} (void);"
133
134    echo "void"
135    echo "init_registers_${name} (void)"
136    echo "{"
137    echo "  static struct target_desc tdesc_${name}_s;"
138    echo "  struct target_desc *result = &tdesc_${name}_s;"
139    echo "  struct tdesc_feature *feature = tdesc_create_feature (result, \"${name}\");"
140    continue
141  elif test "${type}" = "xmltarget"; then
142    xmltarget="${entry}"
143    continue
144  elif test "${type}" = "xmlarch"; then
145    xmlarch="${entry}"
146    continue
147  elif test "${type}" = "osabi"; then
148    xmlosabi="${entry}"
149    continue
150  elif test "${type}" = "expedite"; then
151    expedite="${entry}"
152    continue
153  elif test "${type}" = "feature"; then
154    feature="${entry}"
155    continue
156  elif test "${name}" = x; then
157    echo "$0: $1 does not specify \`\`name''." 1>&2
158    exit 1
159  else
160    echo "  tdesc_create_reg (feature, \"${entry}\","
161    echo "  0, 0, NULL, ${type}, NULL);"
162
163    offset=`expr ${offset} + ${type}`
164    i=`expr $i + 1`
165  fi
166done
167
168echo
169echo "static const char *expedite_regs_${name}[] = { \"`echo ${expedite} | sed 's/,/", "/g'`\", 0 };"
170
171echo "#ifndef IN_PROCESS_AGENT"
172if test "${feature}" != x; then
173  echo "static const char *xmltarget_${name} = 0;"
174elif test "${xmltarget}" = x; then
175  if test "${xmlarch}" = x && test "${xmlosabi}" = x; then
176    echo "static const char *xmltarget_${name} = 0;"
177  else
178    echo "static const char *xmltarget_${name} = \"@<target>\\"
179    if test "${xmlarch}" != x; then
180      echo "<architecture>${xmlarch}</architecture>\\"
181    fi
182    if test "${xmlosabi}" != x; then
183      echo "<osabi>${xmlosabi}</osabi>\\"
184    fi
185    echo "</target>\";"
186  fi
187else
188  echo "static const char *xmltarget_${name} = \"${xmltarget}\";"
189fi
190echo
191
192cat <<EOF
193  result->xmltarget = xmltarget_${name};
194#endif
195
196  init_target_desc (result, expedite_regs_${name});
197
198  tdesc_${name} = result;
199}
200EOF
201
202# close things off
203exec 1>&2
204mv -- "new-$2" "$2"
205