Import gdb-7.0
[dragonfly.git] / contrib / gdb-7 / gdb / regformats / regdat.sh
1 #!/bin/sh -u
2
3 # Register protocol definitions for GDB, the GNU debugger.
4 # Copyright 2001, 2002, 2007, 2008, 2009 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 move_if_change ()
22 {
23     file=$1
24     if test -r ${file} && cmp -s "${file}" new-"${file}"
25     then
26         echo "${file} unchanged." 1>&2
27     else
28         mv new-"${file}" "${file}"
29         echo "${file} updated." 1>&2
30     fi
31 }
32
33 # Format of the input files
34 read="type entry"
35
36 do_read ()
37 {
38     type=""
39     entry=""
40     while read line
41     do
42         if test "${line}" = ""
43         then
44             continue
45         elif test "${line}" = "#" -a "${comment}" = ""
46         then
47             continue
48         elif expr "${line}" : "#" > /dev/null
49         then
50             comment="${comment}
51 ${line}"
52         else
53
54             # The semantics of IFS varies between different SH's.  Some
55             # treat ``::' as three fields while some treat it as just too.
56             # Work around this by eliminating ``::'' ....
57             line="`echo "${line}" | sed -e 's/::/: :/g' -e 's/::/: :/g'`"
58
59             OFS="${IFS}" ; IFS="[:]"
60             eval read ${read} <<EOF
61 ${line}
62 EOF
63             IFS="${OFS}"
64
65             # .... and then going back through each field and strip out those
66             # that ended up with just that space character.
67             for r in ${read}
68             do
69                 if eval test \"\${${r}}\" = \"\ \"
70                 then
71                     eval ${r}=""
72                 fi
73             done
74
75             break
76         fi
77     done
78     if [ -n "${type}" ]
79     then
80         true
81     else
82         false
83     fi
84 }
85
86 if test ! -r $1; then
87   echo "$0: Could not open $1." 1>&2
88   exit 1
89 fi
90
91 copyright ()
92 {
93 cat <<EOF
94 /* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
95
96 /* A register protocol for GDB, the GNU debugger.
97    Copyright 2001, 2002 Free Software Foundation, Inc.
98
99    This file is part of GDB.
100
101    This program is free software; you can redistribute it and/or modify
102    it under the terms of the GNU General Public License as published by
103    the Free Software Foundation; either version 2 of the License, or
104    (at your option) any later version.
105
106    This program is distributed in the hope that it will be useful,
107    but WITHOUT ANY WARRANTY; without even the implied warranty of
108    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
109    GNU General Public License for more details.
110
111    You should have received a copy of the GNU General Public License
112    along with this program; if not, write to the Free Software
113    Foundation, Inc., 59 Temple Place - Suite 330,
114    Boston, MA 02111-1307, USA.  */
115
116 /* This file was created with the aid of \`\`regdat.sh'' and \`\`$1''.  */
117
118 EOF
119 }
120
121
122 exec > new-$2
123 copyright $1
124 echo '#include "regdef.h"'
125 echo '#include "regcache.h"'
126 echo
127 offset=0
128 i=0
129 name=x
130 xmltarget=x
131 xmlarch=x
132 xmlosabi=x
133 expedite=x
134 exec < $1
135 while do_read
136 do
137   if test "${type}" = "name"; then
138     name="${entry}"
139     echo "struct reg regs_${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 "${name}" = x; then
154     echo "$0: $1 does not specify \`\`name''." 1>&2
155     exit 1
156   else
157     echo "  { \"${entry}\", ${offset}, ${type} },"
158     offset=`expr ${offset} + ${type}`
159     i=`expr $i + 1`
160   fi
161 done
162
163 echo "};"
164 echo
165 echo "const char *expedite_regs_${name}[] = { \"`echo ${expedite} | sed 's/,/", "/g'`\", 0 };"
166 if test "${xmltarget}" = x; then
167   if test "${xmlarch}" = x && test "${xmlosabi}" = x; then
168     echo "const char *xmltarget_${name} = 0;"
169   else
170     echo "const char *xmltarget_${name} = \"@<target>\\"
171     if test "${xmlarch}" != x; then
172       echo "<architecture>${xmlarch}</architecture>\\"
173     fi
174     if test "${xmlosabi}" != x; then
175       echo "<osabi>${xmlosabi}</osabi>\\"
176     fi
177     echo "</target>\";"
178   fi
179 else
180   echo "const char *xmltarget_${name} = \"${xmltarget}\";"
181 fi
182 echo
183
184 cat <<EOF
185 void
186 init_registers_${name} ()
187 {
188     set_register_cache (regs_${name},
189                         sizeof (regs_${name}) / sizeof (regs_${name}[0]));
190     gdbserver_expedite_regs = expedite_regs_${name};
191     gdbserver_xmltarget = xmltarget_${name};
192 }
193 EOF
194
195 # close things off
196 exec 1>&2
197 move_if_change $2