new for ptx
[deliverable/binutils-gdb.git] / gdb / ch-typeprint.c
1 /* Support for printing Chill types for GDB, the GNU debugger.
2 Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "defs.h"
21 #include "obstack.h"
22 #include "bfd.h" /* Binary File Description */
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "expression.h"
26 #include "value.h"
27 #include "gdbcore.h"
28 #include "target.h"
29 #include "command.h"
30 #include "gdbcmd.h"
31 #include "language.h"
32 #include "demangle.h"
33 #include "ch-lang.h"
34 #include "typeprint.h"
35
36 #include <string.h>
37 #include <errno.h>
38
39 static void
40 chill_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int));
41
42 void
43 chill_print_type (type, varstring, stream, show, level)
44 struct type *type;
45 char *varstring;
46 GDB_FILE *stream;
47 int show;
48 int level;
49 {
50 if (varstring != NULL && *varstring != '\0')
51 {
52 fputs_filtered (varstring, stream);
53 fputs_filtered (" ", stream);
54 }
55 chill_type_print_base (type, stream, show, level);
56 }
57
58 /* Print the name of the type (or the ultimate pointer target,
59 function value or array element).
60
61 SHOW nonzero means don't print this type as just its name;
62 show its real definition even if it has a name.
63 SHOW zero means print just typename or tag if there is one
64 SHOW negative means abbreviate structure elements.
65 SHOW is decremented for printing of structure elements.
66
67 LEVEL is the depth to indent by.
68 We increase it for some recursive calls. */
69
70 static void
71 chill_type_print_base (type, stream, show, level)
72 struct type *type;
73 GDB_FILE *stream;
74 int show;
75 int level;
76 {
77 char *name;
78 register int len;
79 register int i;
80 struct type *index_type;
81 struct type *range_type;
82 LONGEST low_bound;
83 LONGEST high_bound;
84
85 QUIT;
86
87 wrap_here (" ");
88 if (type == NULL)
89 {
90 fputs_filtered ("<type unknown>", stream);
91 return;
92 }
93
94 /* When SHOW is zero or less, and there is a valid type name, then always
95 just print the type name directly from the type. */
96
97 if ((show <= 0) && (TYPE_NAME (type) != NULL))
98 {
99 fputs_filtered (TYPE_NAME (type), stream);
100 return;
101 }
102
103 check_stub_type (type);
104
105 switch (TYPE_CODE (type))
106 {
107 case TYPE_CODE_PTR:
108 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
109 {
110 fprintf_filtered (stream, "PTR");
111 break;
112 }
113 fprintf_filtered (stream, "REF ");
114 chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
115 break;
116
117 case TYPE_CODE_BOOL:
118 /* FIXME: we should probably just print the TYPE_NAME, in case
119 anyone ever fixes the compiler to give us the real names
120 in the presence of the chill equivalent of typedef (assuming
121 there is one). */
122 fprintf_filtered (stream, "BOOL");
123 break;
124
125 case TYPE_CODE_ARRAY:
126 range_type = TYPE_FIELD_TYPE (type, 0);
127 index_type = TYPE_TARGET_TYPE (range_type);
128 low_bound = TYPE_FIELD_BITPOS (range_type, 0);
129 high_bound = TYPE_FIELD_BITPOS (range_type, 1);
130 fputs_filtered ("ARRAY (", stream);
131 print_type_scalar (index_type, low_bound, stream);
132 fputs_filtered (":", stream);
133 print_type_scalar (index_type, high_bound, stream);
134 fputs_filtered (") ", stream);
135 chill_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
136 break;
137
138 case TYPE_CODE_BITSTRING:
139 fprintf_filtered (stream, "BOOLS (%d)",
140 TYPE_FIELD_BITPOS (TYPE_FIELD_TYPE(type,0), 1) + 1);
141 break;
142
143 case TYPE_CODE_SET:
144 fputs_filtered ("POWERSET ", stream);
145 chill_print_type (TYPE_FIELD_TYPE (type, 0), "", stream,
146 show - 1, level);
147 break;
148
149 case TYPE_CODE_STRING:
150 range_type = TYPE_FIELD_TYPE (type, 0);
151 index_type = TYPE_TARGET_TYPE (range_type);
152 high_bound = TYPE_FIELD_BITPOS (range_type, 1);
153 fputs_filtered ("CHARS (", stream);
154 print_type_scalar (index_type, high_bound + 1, stream);
155 fputs_filtered (")", stream);
156 break;
157
158 case TYPE_CODE_MEMBER:
159 fprintf_filtered (stream, "MEMBER ");
160 chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
161 break;
162 case TYPE_CODE_REF:
163 fprintf_filtered (stream, "/*LOC*/ ");
164 chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
165 break;
166 case TYPE_CODE_FUNC:
167 fprintf_filtered (stream, "PROC (?)");
168 chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
169 break;
170
171 case TYPE_CODE_STRUCT:
172 if (chill_is_varying_struct (type))
173 {
174 chill_type_print_base (TYPE_FIELD_TYPE (type, 1),
175 stream, show, level);
176 fputs_filtered (" VARYING", stream);
177 }
178 else
179 {
180 fprintf_filtered (stream, "STRUCT ");
181
182 fprintf_filtered (stream, "(\n");
183 if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
184 {
185 if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
186 {
187 fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
188 }
189 else
190 {
191 fprintfi_filtered (level + 4, stream, "<no data fields>\n");
192 }
193 }
194 else
195 {
196 len = TYPE_NFIELDS (type);
197 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
198 {
199 struct type *field_type = TYPE_FIELD_TYPE (type, i);
200 QUIT;
201 print_spaces_filtered (level + 4, stream);
202 if (TYPE_CODE (field_type) == TYPE_CODE_UNION)
203 { int j; /* variant number */
204 fputs_filtered ("CASE OF\n", stream);
205 for (j = 0; j < TYPE_NFIELDS (field_type); j++)
206 { int k; /* variant field index */
207 struct type *variant_type
208 = TYPE_FIELD_TYPE (field_type, j);
209 int var_len = TYPE_NFIELDS (variant_type);
210 print_spaces_filtered (level + 4, stream);
211 if (strcmp (TYPE_FIELD_NAME (field_type, j),
212 "else") == 0)
213 fputs_filtered ("ELSE\n", stream);
214 else
215 fputs_filtered (":\n", stream);
216 if (TYPE_CODE (variant_type) != TYPE_CODE_STRUCT)
217 error ("variant record confusion");
218 for (k = 0; k < var_len; k++)
219 {
220 print_spaces_filtered (level + 8, stream);
221 chill_print_type (TYPE_FIELD_TYPE (variant_type, k),
222 TYPE_FIELD_NAME (variant_type, k),
223 stream, show - 1, level + 8);
224 if (k < (var_len - 1))
225 fputs_filtered (",", stream);
226 fputs_filtered ("\n", stream);
227 }
228 }
229 fputs_filtered ("ESAC\n", stream);
230 }
231 else
232 chill_print_type (field_type,
233 TYPE_FIELD_NAME (type, i),
234 stream, show - 1, level + 4);
235 if (i < (len - 1))
236 {
237 fputs_filtered (",", stream);
238 }
239 fputs_filtered ("\n", stream);
240 }
241 }
242 fprintfi_filtered (level, stream, ")");
243 }
244 break;
245
246 case TYPE_CODE_RANGE:
247 if (TYPE_DUMMY_RANGE (type))
248 chill_type_print_base (TYPE_TARGET_TYPE (type),
249 stream, show, level);
250 else if (TYPE_TARGET_TYPE (type))
251 {
252 chill_type_print_base (TYPE_TARGET_TYPE (type),
253 stream, show, level);
254 fputs_filtered (" (", stream);
255 print_type_scalar (TYPE_TARGET_TYPE (type),
256 TYPE_FIELD_BITPOS (type, 0), stream);
257 fputs_filtered (":", stream);
258 print_type_scalar (TYPE_TARGET_TYPE (type),
259 TYPE_FIELD_BITPOS (type, 1), stream);
260 fputs_filtered (")", stream);
261 }
262 else
263 fprintf_filtered (stream, "RANGE? (%s : %d)",
264 TYPE_FIELD_BITPOS (type, 0),
265 TYPE_FIELD_BITPOS (type, 1));
266 break;
267
268 case TYPE_CODE_ENUM:
269 {
270 register int lastval = 0;
271 fprintf_filtered (stream, "SET (");
272 len = TYPE_NFIELDS (type);
273 for (i = 0; i < len; i++)
274 {
275 QUIT;
276 if (i) fprintf_filtered (stream, ", ");
277 wrap_here (" ");
278 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
279 if (lastval != TYPE_FIELD_BITPOS (type, i))
280 {
281 fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
282 lastval = TYPE_FIELD_BITPOS (type, i);
283 }
284 lastval++;
285 }
286 fprintf_filtered (stream, ")");
287 }
288 break;
289
290 case TYPE_CODE_VOID:
291 case TYPE_CODE_UNDEF:
292 case TYPE_CODE_ERROR:
293 case TYPE_CODE_UNION:
294 case TYPE_CODE_METHOD:
295 error ("missing language support in chill_type_print_base");
296 break;
297
298 default:
299
300 /* Handle types not explicitly handled by the other cases,
301 such as fundamental types. For these, just print whatever
302 the type name is, as recorded in the type itself. If there
303 is no type name, then complain. */
304
305 if (TYPE_NAME (type) != NULL)
306 {
307 fputs_filtered (TYPE_NAME (type), stream);
308 }
309 else
310 {
311 error ("Unrecognized type code (%d) in symbol table.",
312 TYPE_CODE (type));
313 }
314 break;
315 }
316 }
This page took 0.035083 seconds and 4 git commands to generate.