gdb/
[deliverable/binutils-gdb.git] / gdb / m2-valprint.c
CommitLineData
c906108c 1/* Support for printing Modula 2 values for GDB, the GNU debugger.
a8d6eb4a 2
0b302171
JB
3 Copyright (C) 1986, 1988-1989, 1991-1992, 1996, 1998, 2000, 2005-2012
4 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
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
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
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.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
c906108c
SS
22#include "symtab.h"
23#include "gdbtypes.h"
72019c9c
GM
24#include "expression.h"
25#include "value.h"
26#include "valprint.h"
27#include "language.h"
28#include "typeprint.h"
a8d6eb4a 29#include "c-lang.h"
72019c9c
GM
30#include "m2-lang.h"
31#include "target.h"
32
79a45b7d
TT
33static int print_unpacked_pointer (struct type *type,
34 CORE_ADDR address, CORE_ADDR addr,
35 const struct value_print_options *options,
36 struct ui_file *stream);
844781a1
GM
37static void
38m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
39 int embedded_offset, CORE_ADDR address,
79a45b7d 40 struct ui_file *stream, int recurse,
0e03807e 41 const struct value *val,
79a45b7d
TT
42 const struct value_print_options *options,
43 int len);
72019c9c
GM
44
45
844781a1
GM
46/* get_long_set_bounds - assigns the bounds of the long set to low and
47 high. */
72019c9c
GM
48
49int
50get_long_set_bounds (struct type *type, LONGEST *low, LONGEST *high)
51{
52 int len, i;
53
54 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
55 {
56 len = TYPE_NFIELDS (type);
57 i = TYPE_N_BASECLASSES (type);
58 if (len == 0)
59 return 0;
60 *low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
61 *high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type,
62 len-1)));
63 return 1;
64 }
65 error (_("expecting long_set"));
66 return 0;
67}
68
69static void
70m2_print_long_set (struct type *type, const gdb_byte *valaddr,
71 int embedded_offset, CORE_ADDR address,
79a45b7d 72 struct ui_file *stream)
72019c9c
GM
73{
74 int empty_set = 1;
75 int element_seen = 0;
76 LONGEST previous_low = 0;
77 LONGEST previous_high= 0;
78 LONGEST i, low_bound, high_bound;
79 LONGEST field_low, field_high;
80 struct type *range;
81 int len, field;
82 struct type *target;
83 int bitval;
84
85 CHECK_TYPEDEF (type);
86
87 fprintf_filtered (stream, "{");
88 len = TYPE_NFIELDS (type);
89 if (get_long_set_bounds (type, &low_bound, &high_bound))
90 {
91 field = TYPE_N_BASECLASSES (type);
92 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, field));
93 }
94 else
95 {
96 fprintf_filtered (stream, " %s }", _("<unknown bounds of set>"));
97 return;
98 }
99
100 target = TYPE_TARGET_TYPE (range);
72019c9c
GM
101
102 if (get_discrete_bounds (range, &field_low, &field_high) >= 0)
103 {
104 for (i = low_bound; i <= high_bound; i++)
105 {
106 bitval = value_bit_index (TYPE_FIELD_TYPE (type, field),
107 (TYPE_FIELD_BITPOS (type, field) / 8) +
108 valaddr + embedded_offset, i);
109 if (bitval < 0)
110 error (_("bit test is out of range"));
111 else if (bitval > 0)
112 {
113 previous_high = i;
114 if (! element_seen)
115 {
116 if (! empty_set)
117 fprintf_filtered (stream, ", ");
118 print_type_scalar (target, i, stream);
119 empty_set = 0;
120 element_seen = 1;
121 previous_low = i;
122 }
123 }
124 else
125 {
126 /* bit is not set */
127 if (element_seen)
128 {
129 if (previous_low+1 < previous_high)
130 fprintf_filtered (stream, "..");
131 if (previous_low+1 < previous_high)
132 print_type_scalar (target, previous_high, stream);
133 element_seen = 0;
134 }
135 }
136 if (i == field_high)
137 {
138 field++;
139 if (field == len)
140 break;
141 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, field));
142 if (get_discrete_bounds (range, &field_low, &field_high) < 0)
143 break;
144 target = TYPE_TARGET_TYPE (range);
72019c9c
GM
145 }
146 }
147 if (element_seen)
148 {
149 if (previous_low+1 < previous_high)
150 {
151 fprintf_filtered (stream, "..");
152 print_type_scalar (target, previous_high, stream);
153 }
154 element_seen = 0;
155 }
156 fprintf_filtered (stream, "}");
157 }
158}
159
844781a1
GM
160static void
161m2_print_unbounded_array (struct type *type, const gdb_byte *valaddr,
162 int embedded_offset, CORE_ADDR address,
79a45b7d
TT
163 struct ui_file *stream, int recurse,
164 const struct value_print_options *options)
844781a1
GM
165{
166 struct type *content_type;
167 CORE_ADDR addr;
168 LONGEST len;
169 struct value *val;
170
171 CHECK_TYPEDEF (type);
172 content_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0));
173
174 addr = unpack_pointer (TYPE_FIELD_TYPE (type, 0),
175 (TYPE_FIELD_BITPOS (type, 0) / 8) +
176 valaddr + embedded_offset);
177
178 val = value_at_lazy (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
179 addr);
180 len = unpack_field_as_long (type, valaddr + embedded_offset, 1);
181
182 fprintf_filtered (stream, "{");
66d61a4c
PA
183 m2_print_array_contents (value_type (val),
184 value_contents_for_printing (val),
844781a1 185 value_embedded_offset (val), addr, stream,
66d61a4c 186 recurse, val, options, len);
844781a1
GM
187 fprintf_filtered (stream, ", HIGH = %d}", (int) len);
188}
189
79a45b7d 190static int
72019c9c
GM
191print_unpacked_pointer (struct type *type,
192 CORE_ADDR address, CORE_ADDR addr,
79a45b7d
TT
193 const struct value_print_options *options,
194 struct ui_file *stream)
72019c9c 195{
50810684 196 struct gdbarch *gdbarch = get_type_arch (type);
72019c9c 197 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
b012acdd 198 int want_space = 0;
72019c9c
GM
199
200 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
201 {
202 /* Try to print what function it points to. */
edf0c1b7 203 print_function_pointer_address (options, gdbarch, addr, stream);
72019c9c
GM
204 /* Return value is irrelevant except for string pointers. */
205 return 0;
206 }
207
79a45b7d 208 if (options->addressprint && options->format != 's')
b012acdd
TT
209 {
210 fputs_filtered (paddress (gdbarch, address), stream);
211 want_space = 1;
212 }
72019c9c
GM
213
214 /* For a pointer to char or unsigned char, also print the string
215 pointed to, unless pointer is null. */
216
217 if (TYPE_LENGTH (elttype) == 1
218 && TYPE_CODE (elttype) == TYPE_CODE_INT
79a45b7d 219 && (options->format == 0 || options->format == 's')
72019c9c 220 && addr != 0)
b012acdd
TT
221 {
222 if (want_space)
223 fputs_filtered (" ", stream);
224 return val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
225 stream, options);
226 }
72019c9c
GM
227
228 return 0;
229}
230
231static void
844781a1
GM
232print_variable_at_address (struct type *type,
233 const gdb_byte *valaddr,
79a45b7d
TT
234 struct ui_file *stream,
235 int recurse,
236 const struct value_print_options *options)
72019c9c 237{
5af949e3 238 struct gdbarch *gdbarch = get_type_arch (type);
72019c9c
GM
239 CORE_ADDR addr = unpack_pointer (type, valaddr);
240 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
241
242 fprintf_filtered (stream, "[");
5af949e3 243 fputs_filtered (paddress (gdbarch, addr), stream);
72019c9c
GM
244 fprintf_filtered (stream, "] : ");
245
246 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
247 {
248 struct value *deref_val =
d8631d21 249 value_at (TYPE_TARGET_TYPE (type), unpack_pointer (type, valaddr));
b8d56208 250
79a45b7d 251 common_val_print (deref_val, stream, recurse, options, current_language);
72019c9c
GM
252 }
253 else
254 fputs_filtered ("???", stream);
255}
256
844781a1
GM
257
258/* m2_print_array_contents - prints out the contents of an
259 array up to a max_print values.
260 It prints arrays of char as a string
261 and all other data types as comma
262 separated values. */
263
264static void
265m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
266 int embedded_offset, CORE_ADDR address,
79a45b7d 267 struct ui_file *stream, int recurse,
0e03807e 268 const struct value *val,
79a45b7d
TT
269 const struct value_print_options *options,
270 int len)
844781a1
GM
271{
272 int eltlen;
273 CHECK_TYPEDEF (type);
274
275 if (TYPE_LENGTH (type) > 0)
276 {
277 eltlen = TYPE_LENGTH (type);
79a45b7d 278 if (options->prettyprint_arrays)
844781a1
GM
279 print_spaces_filtered (2 + 2 * recurse, stream);
280 /* For an array of chars, print with string syntax. */
281 if (eltlen == 1 &&
282 ((TYPE_CODE (type) == TYPE_CODE_INT)
283 || ((current_language->la_language == language_m2)
284 && (TYPE_CODE (type) == TYPE_CODE_CHAR)))
79a45b7d 285 && (options->format == 0 || options->format == 's'))
09ca9e2e 286 val_print_string (type, NULL, address, len+1, stream, options);
844781a1
GM
287 else
288 {
289 fprintf_filtered (stream, "{");
490f124f 290 val_print_array_elements (type, valaddr, embedded_offset,
0e03807e
TT
291 address, stream, recurse, val,
292 options, 0);
844781a1
GM
293 fprintf_filtered (stream, "}");
294 }
295 }
296}
297
e88acd96
TT
298/* Decorations for Modula 2. */
299
300static const struct generic_val_print_decorations m2_decorations =
301{
302 "",
303 " + ",
304 " * I",
305 "TRUE",
306 "FALSE",
307 "void"
308};
844781a1 309
32b72a42 310/* See val_print for a description of the various parameters of this
d3eab38a 311 function; they are identical. */
c906108c 312
d3eab38a 313void
fc1a4b47 314m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
79a45b7d 315 CORE_ADDR address, struct ui_file *stream, int recurse,
0e03807e 316 const struct value *original_value,
79a45b7d 317 const struct value_print_options *options)
c906108c 318{
5af949e3 319 struct gdbarch *gdbarch = get_type_arch (type);
025bb325 320 unsigned int i = 0; /* Number of characters printed. */
72019c9c
GM
321 unsigned len;
322 struct type *elttype;
323 unsigned eltlen;
72019c9c
GM
324 CORE_ADDR addr;
325
326 CHECK_TYPEDEF (type);
327 switch (TYPE_CODE (type))
328 {
329 case TYPE_CODE_ARRAY:
330 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
331 {
332 elttype = check_typedef (TYPE_TARGET_TYPE (type));
333 eltlen = TYPE_LENGTH (elttype);
334 len = TYPE_LENGTH (type) / eltlen;
79a45b7d 335 if (options->prettyprint_arrays)
72019c9c
GM
336 print_spaces_filtered (2 + 2 * recurse, stream);
337 /* For an array of chars, print with string syntax. */
338 if (eltlen == 1 &&
339 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
340 || ((current_language->la_language == language_m2)
341 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
79a45b7d 342 && (options->format == 0 || options->format == 's'))
72019c9c
GM
343 {
344 /* If requested, look for the first null char and only print
345 elements up to it. */
79a45b7d 346 if (options->stop_print_at_null)
72019c9c
GM
347 {
348 unsigned int temp_len;
349
025bb325 350 /* Look for a NULL char. */
72019c9c
GM
351 for (temp_len = 0;
352 (valaddr + embedded_offset)[temp_len]
79a45b7d 353 && temp_len < len && temp_len < options->print_max;
72019c9c
GM
354 temp_len++);
355 len = temp_len;
356 }
357
6c7a06a3 358 LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
be759fcf
PM
359 valaddr + embedded_offset, len, NULL,
360 0, options);
72019c9c
GM
361 i = len;
362 }
363 else
364 {
365 fprintf_filtered (stream, "{");
490f124f 366 val_print_array_elements (type, valaddr, embedded_offset,
025bb325
MS
367 address, stream,
368 recurse, original_value,
0e03807e 369 options, 0);
72019c9c
GM
370 fprintf_filtered (stream, "}");
371 }
372 break;
373 }
374 /* Array of unspecified length: treat like pointer to first elt. */
79a45b7d 375 print_unpacked_pointer (type, address, address, options, stream);
72019c9c
GM
376 break;
377
378 case TYPE_CODE_PTR:
379 if (TYPE_CONST (type))
380 print_variable_at_address (type, valaddr + embedded_offset,
79a45b7d
TT
381 stream, recurse, options);
382 else if (options->format && options->format != 's')
ab2188aa
PA
383 val_print_scalar_formatted (type, valaddr, embedded_offset,
384 original_value, options, 0, stream);
72019c9c
GM
385 else
386 {
387 addr = unpack_pointer (type, valaddr + embedded_offset);
79a45b7d 388 print_unpacked_pointer (type, addr, address, options, stream);
72019c9c
GM
389 }
390 break;
391
72019c9c 392 case TYPE_CODE_UNION:
79a45b7d 393 if (recurse && !options->unionprint)
72019c9c
GM
394 {
395 fprintf_filtered (stream, "{...}");
396 break;
397 }
398 /* Fall through. */
399 case TYPE_CODE_STRUCT:
400 if (m2_is_long_set (type))
401 m2_print_long_set (type, valaddr, embedded_offset, address,
79a45b7d 402 stream);
844781a1
GM
403 else if (m2_is_unbounded_array (type))
404 m2_print_unbounded_array (type, valaddr, embedded_offset,
79a45b7d 405 address, stream, recurse, options);
72019c9c
GM
406 else
407 cp_print_value_fields (type, type, valaddr, embedded_offset,
0e03807e
TT
408 address, stream, recurse, original_value,
409 options, NULL, 0);
72019c9c
GM
410 break;
411
72019c9c
GM
412 case TYPE_CODE_BITSTRING:
413 case TYPE_CODE_SET:
414 elttype = TYPE_INDEX_TYPE (type);
415 CHECK_TYPEDEF (elttype);
416 if (TYPE_STUB (elttype))
417 {
418 fprintf_filtered (stream, _("<incomplete type>"));
419 gdb_flush (stream);
420 break;
421 }
422 else
423 {
424 struct type *range = elttype;
425 LONGEST low_bound, high_bound;
426 int i;
427 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
428 int need_comma = 0;
429
430 if (is_bitstring)
431 fputs_filtered ("B'", stream);
432 else
433 fputs_filtered ("{", stream);
434
435 i = get_discrete_bounds (range, &low_bound, &high_bound);
436 maybe_bad_bstring:
437 if (i < 0)
438 {
439 fputs_filtered (_("<error value>"), stream);
440 goto done;
441 }
442
443 for (i = low_bound; i <= high_bound; i++)
444 {
445 int element = value_bit_index (type, valaddr + embedded_offset,
446 i);
b8d56208 447
72019c9c
GM
448 if (element < 0)
449 {
450 i = element;
451 goto maybe_bad_bstring;
452 }
453 if (is_bitstring)
454 fprintf_filtered (stream, "%d", element);
455 else if (element)
456 {
457 if (need_comma)
458 fputs_filtered (", ", stream);
459 print_type_scalar (range, i, stream);
460 need_comma = 1;
461
462 if (i + 1 <= high_bound
463 && value_bit_index (type, valaddr + embedded_offset,
464 ++i))
465 {
466 int j = i;
b8d56208 467
72019c9c
GM
468 fputs_filtered ("..", stream);
469 while (i + 1 <= high_bound
470 && value_bit_index (type,
471 valaddr + embedded_offset,
472 ++i))
473 j = i;
474 print_type_scalar (range, j, stream);
475 }
476 }
477 }
478 done:
479 if (is_bitstring)
480 fputs_filtered ("'", stream);
481 else
482 fputs_filtered ("}", stream);
483 }
484 break;
485
e88acd96
TT
486 case TYPE_CODE_RANGE:
487 if (TYPE_LENGTH (type) == TYPE_LENGTH (TYPE_TARGET_TYPE (type)))
488 {
489 m2_val_print (TYPE_TARGET_TYPE (type), valaddr, embedded_offset,
490 address, stream, recurse, original_value, options);
491 break;
492 }
493 /* FIXME: create_range_type does not set the unsigned bit in a
494 range type (I think it probably should copy it from the target
495 type), so we won't print values which are too large to
496 fit in a signed integer correctly. */
497 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
498 print with the target type, though, because the size of our type
499 and the target type might differ). */
500 /* FALLTHROUGH */
72019c9c 501
e88acd96
TT
502 case TYPE_CODE_REF:
503 case TYPE_CODE_ENUM:
504 case TYPE_CODE_FUNC:
505 case TYPE_CODE_INT:
506 case TYPE_CODE_FLT:
507 case TYPE_CODE_METHOD:
508 case TYPE_CODE_VOID:
72019c9c 509 case TYPE_CODE_ERROR:
72019c9c 510 case TYPE_CODE_UNDEF:
e88acd96
TT
511 case TYPE_CODE_BOOL:
512 case TYPE_CODE_CHAR:
72019c9c 513 default:
e88acd96
TT
514 generic_val_print (type, valaddr, embedded_offset, address,
515 stream, recurse, original_value, options,
516 &m2_decorations);
517 break;
72019c9c
GM
518 }
519 gdb_flush (stream);
c906108c 520}
This page took 1.11405 seconds and 4 git commands to generate.