2006-07-29 Vladimir Prus <vladimir@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / m2-valprint.c
CommitLineData
c906108c 1/* Support for printing Modula 2 values for GDB, the GNU debugger.
a8d6eb4a 2
72019c9c
GM
3 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1996, 1998,
4 2000, 2005, 2006
5 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b
JM
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
197e01b6
EZ
21 Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA. */
c906108c
SS
23
24#include "defs.h"
c906108c
SS
25#include "symtab.h"
26#include "gdbtypes.h"
72019c9c
GM
27#include "expression.h"
28#include "value.h"
29#include "valprint.h"
30#include "language.h"
31#include "typeprint.h"
a8d6eb4a 32#include "c-lang.h"
72019c9c
GM
33#include "m2-lang.h"
34#include "target.h"
35
36int print_unpacked_pointer (struct type *type,
37 CORE_ADDR address, CORE_ADDR addr,
38 int format, struct ui_file *stream);
39
40
41/* Print function pointer with inferior address ADDRESS onto stdio
42 stream STREAM. */
43
44static void
45print_function_pointer_address (CORE_ADDR address, struct ui_file *stream)
46{
47 CORE_ADDR func_addr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
48 address,
49 &current_target);
50
51 /* If the function pointer is represented by a description, print the
52 address of the description. */
53 if (addressprint && func_addr != address)
54 {
55 fputs_filtered ("@", stream);
56 fputs_filtered (paddress (address), stream);
57 fputs_filtered (": ", stream);
58 }
59 print_address_demangle (func_addr, stream, demangle);
60}
61
62/*
63 * get_long_set_bounds - assigns the bounds of the long set to low and high.
64 */
65
66int
67get_long_set_bounds (struct type *type, LONGEST *low, LONGEST *high)
68{
69 int len, i;
70
71 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
72 {
73 len = TYPE_NFIELDS (type);
74 i = TYPE_N_BASECLASSES (type);
75 if (len == 0)
76 return 0;
77 *low = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
78 *high = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type,
79 len-1)));
80 return 1;
81 }
82 error (_("expecting long_set"));
83 return 0;
84}
85
86static void
87m2_print_long_set (struct type *type, const gdb_byte *valaddr,
88 int embedded_offset, CORE_ADDR address,
89 struct ui_file *stream, int format,
90 enum val_prettyprint pretty)
91{
92 int empty_set = 1;
93 int element_seen = 0;
94 LONGEST previous_low = 0;
95 LONGEST previous_high= 0;
96 LONGEST i, low_bound, high_bound;
97 LONGEST field_low, field_high;
98 struct type *range;
99 int len, field;
100 struct type *target;
101 int bitval;
102
103 CHECK_TYPEDEF (type);
104
105 fprintf_filtered (stream, "{");
106 len = TYPE_NFIELDS (type);
107 if (get_long_set_bounds (type, &low_bound, &high_bound))
108 {
109 field = TYPE_N_BASECLASSES (type);
110 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, field));
111 }
112 else
113 {
114 fprintf_filtered (stream, " %s }", _("<unknown bounds of set>"));
115 return;
116 }
117
118 target = TYPE_TARGET_TYPE (range);
119 if (target == NULL)
120 target = builtin_type_int;
121
122 if (get_discrete_bounds (range, &field_low, &field_high) >= 0)
123 {
124 for (i = low_bound; i <= high_bound; i++)
125 {
126 bitval = value_bit_index (TYPE_FIELD_TYPE (type, field),
127 (TYPE_FIELD_BITPOS (type, field) / 8) +
128 valaddr + embedded_offset, i);
129 if (bitval < 0)
130 error (_("bit test is out of range"));
131 else if (bitval > 0)
132 {
133 previous_high = i;
134 if (! element_seen)
135 {
136 if (! empty_set)
137 fprintf_filtered (stream, ", ");
138 print_type_scalar (target, i, stream);
139 empty_set = 0;
140 element_seen = 1;
141 previous_low = i;
142 }
143 }
144 else
145 {
146 /* bit is not set */
147 if (element_seen)
148 {
149 if (previous_low+1 < previous_high)
150 fprintf_filtered (stream, "..");
151 if (previous_low+1 < previous_high)
152 print_type_scalar (target, previous_high, stream);
153 element_seen = 0;
154 }
155 }
156 if (i == field_high)
157 {
158 field++;
159 if (field == len)
160 break;
161 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, field));
162 if (get_discrete_bounds (range, &field_low, &field_high) < 0)
163 break;
164 target = TYPE_TARGET_TYPE (range);
165 if (target == NULL)
166 target = builtin_type_int;
167 }
168 }
169 if (element_seen)
170 {
171 if (previous_low+1 < previous_high)
172 {
173 fprintf_filtered (stream, "..");
174 print_type_scalar (target, previous_high, stream);
175 }
176 element_seen = 0;
177 }
178 fprintf_filtered (stream, "}");
179 }
180}
181
182int
183print_unpacked_pointer (struct type *type,
184 CORE_ADDR address, CORE_ADDR addr,
185 int format, struct ui_file *stream)
186{
187 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
188
189 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
190 {
191 /* Try to print what function it points to. */
192 print_function_pointer_address (addr, stream);
193 /* Return value is irrelevant except for string pointers. */
194 return 0;
195 }
196
197 if (addressprint && format != 's')
198 fputs_filtered (paddress (address), stream);
199
200 /* For a pointer to char or unsigned char, also print the string
201 pointed to, unless pointer is null. */
202
203 if (TYPE_LENGTH (elttype) == 1
204 && TYPE_CODE (elttype) == TYPE_CODE_INT
205 && (format == 0 || format == 's')
206 && addr != 0)
207 return val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
208
209 return 0;
210}
211
212static void
213print_variable_at_address (struct type *type, const gdb_byte *valaddr,
214 struct ui_file *stream, int format,
215 int deref_ref, int recurse,
216 enum val_prettyprint pretty)
217{
218 CORE_ADDR addr = unpack_pointer (type, valaddr);
219 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
220
221 fprintf_filtered (stream, "[");
222 fputs_filtered (paddress (addr), stream);
223 fprintf_filtered (stream, "] : ");
224
225 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
226 {
227 struct value *deref_val =
228 value_at
229 (TYPE_TARGET_TYPE (type),
230 unpack_pointer (lookup_pointer_type (builtin_type_void),
231 valaddr));
232 common_val_print (deref_val, stream, format, deref_ref,
233 recurse, pretty);
234 }
235 else
236 fputs_filtered ("???", stream);
237}
238
239/* Print data of type TYPE located at VALADDR (within GDB), which came from
240 the inferior at address ADDRESS, onto stdio stream STREAM according to
241 FORMAT (a letter or 0 for natural format). The data at VALADDR is in
242 target byte order.
243
244 If the data are a string pointer, returns the number of string characters
245 printed.
246
247 If DEREF_REF is nonzero, then dereference references, otherwise just print
248 them like pointers.
249
250 The PRETTY parameter controls prettyprinting. */
c906108c
SS
251
252int
fc1a4b47 253m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
fba45db2
KB
254 CORE_ADDR address, struct ui_file *stream, int format,
255 int deref_ref, int recurse, enum val_prettyprint pretty)
c906108c 256{
72019c9c
GM
257 unsigned int i = 0; /* Number of characters printed */
258 unsigned len;
259 struct type *elttype;
260 unsigned eltlen;
261 int length_pos, length_size, string_pos;
262 int char_size;
263 LONGEST val;
264 CORE_ADDR addr;
265
266 CHECK_TYPEDEF (type);
267 switch (TYPE_CODE (type))
268 {
269 case TYPE_CODE_ARRAY:
270 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
271 {
272 elttype = check_typedef (TYPE_TARGET_TYPE (type));
273 eltlen = TYPE_LENGTH (elttype);
274 len = TYPE_LENGTH (type) / eltlen;
275 if (prettyprint_arrays)
276 print_spaces_filtered (2 + 2 * recurse, stream);
277 /* For an array of chars, print with string syntax. */
278 if (eltlen == 1 &&
279 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
280 || ((current_language->la_language == language_m2)
281 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
282 && (format == 0 || format == 's'))
283 {
284 /* If requested, look for the first null char and only print
285 elements up to it. */
286 if (stop_print_at_null)
287 {
288 unsigned int temp_len;
289
290 /* Look for a NULL char. */
291 for (temp_len = 0;
292 (valaddr + embedded_offset)[temp_len]
293 && temp_len < len && temp_len < print_max;
294 temp_len++);
295 len = temp_len;
296 }
297
298 LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0);
299 i = len;
300 }
301 else
302 {
303 fprintf_filtered (stream, "{");
304 val_print_array_elements (type, valaddr + embedded_offset,
305 address, stream, format, deref_ref,
306 recurse, pretty, 0);
307 fprintf_filtered (stream, "}");
308 }
309 break;
310 }
311 /* Array of unspecified length: treat like pointer to first elt. */
312 print_unpacked_pointer (type, address, address, format, stream);
313 break;
314
315 case TYPE_CODE_PTR:
316 if (TYPE_CONST (type))
317 print_variable_at_address (type, valaddr + embedded_offset,
318 stream, format, deref_ref, recurse,
319 pretty);
320 else if (format && format != 's')
321 print_scalar_formatted (valaddr + embedded_offset, type, format,
322 0, stream);
323 else
324 {
325 addr = unpack_pointer (type, valaddr + embedded_offset);
326 print_unpacked_pointer (type, addr, address, format, stream);
327 }
328 break;
329
330 case TYPE_CODE_MEMBER:
331 error (_("not implemented: member type in m2_val_print"));
332 break;
333
334 case TYPE_CODE_REF:
335 elttype = check_typedef (TYPE_TARGET_TYPE (type));
336 if (addressprint)
337 {
338 CORE_ADDR addr
339 = extract_typed_address (valaddr + embedded_offset, type);
340 fprintf_filtered (stream, "@");
341 fputs_filtered (paddress (addr), stream);
342 if (deref_ref)
343 fputs_filtered (": ", stream);
344 }
345 /* De-reference the reference. */
346 if (deref_ref)
347 {
348 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
349 {
350 struct value *deref_val =
351 value_at
352 (TYPE_TARGET_TYPE (type),
353 unpack_pointer (lookup_pointer_type (builtin_type_void),
354 valaddr + embedded_offset));
355 common_val_print (deref_val, stream, format, deref_ref,
356 recurse, pretty);
357 }
358 else
359 fputs_filtered ("???", stream);
360 }
361 break;
362
363 case TYPE_CODE_UNION:
364 if (recurse && !unionprint)
365 {
366 fprintf_filtered (stream, "{...}");
367 break;
368 }
369 /* Fall through. */
370 case TYPE_CODE_STRUCT:
371 if (m2_is_long_set (type))
372 m2_print_long_set (type, valaddr, embedded_offset, address,
373 stream, format, pretty);
374 else
375 cp_print_value_fields (type, type, valaddr, embedded_offset,
376 address, stream, format,
377 recurse, pretty, NULL, 0);
378 break;
379
380 case TYPE_CODE_ENUM:
381 if (format)
382 {
383 print_scalar_formatted (valaddr + embedded_offset, type,
384 format, 0, stream);
385 break;
386 }
387 len = TYPE_NFIELDS (type);
388 val = unpack_long (type, valaddr + embedded_offset);
389 for (i = 0; i < len; i++)
390 {
391 QUIT;
392 if (val == TYPE_FIELD_BITPOS (type, i))
393 {
394 break;
395 }
396 }
397 if (i < len)
398 {
399 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
400 }
401 else
402 {
403 print_longest (stream, 'd', 0, val);
404 }
405 break;
406
407 case TYPE_CODE_FUNC:
408 if (format)
409 {
410 print_scalar_formatted (valaddr + embedded_offset, type,
411 format, 0, stream);
412 break;
413 }
414 /* FIXME, we should consider, at least for ANSI C language, eliminating
415 the distinction made between FUNCs and POINTERs to FUNCs. */
416 fprintf_filtered (stream, "{");
417 type_print (type, "", stream, -1);
418 fprintf_filtered (stream, "} ");
419 /* Try to print what function it points to, and its address. */
420 print_address_demangle (address, stream, demangle);
421 break;
422
423 case TYPE_CODE_BOOL:
424 format = format ? format : output_format;
425 if (format)
426 print_scalar_formatted (valaddr + embedded_offset, type,
427 format, 0, stream);
428 else
429 {
430 val = unpack_long (type, valaddr + embedded_offset);
431 if (val == 0)
432 fputs_filtered ("FALSE", stream);
433 else if (val == 1)
434 fputs_filtered ("TRUE", stream);
435 else
436 fprintf_filtered (stream, "%ld)", (long int) val);
437 }
438 break;
439
440 case TYPE_CODE_RANGE:
441 if (TYPE_LENGTH (type) == TYPE_LENGTH (TYPE_TARGET_TYPE (type)))
442 {
443 m2_val_print (TYPE_TARGET_TYPE (type), valaddr, embedded_offset,
444 address, stream, format, deref_ref, recurse, pretty);
445 break;
446 }
447 /* FIXME: create_range_type does not set the unsigned bit in a
448 range type (I think it probably should copy it from the target
449 type), so we won't print values which are too large to
450 fit in a signed integer correctly. */
451 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
452 print with the target type, though, because the size of our type
453 and the target type might differ). */
454 /* FALLTHROUGH */
455
456 case TYPE_CODE_INT:
457 format = format ? format : output_format;
458 if (format)
459 print_scalar_formatted (valaddr + embedded_offset, type, format,
460 0, stream);
461 else
462 val_print_type_code_int (type, valaddr + embedded_offset, stream);
463 break;
464
465 case TYPE_CODE_CHAR:
466 format = format ? format : output_format;
467 if (format)
468 print_scalar_formatted (valaddr + embedded_offset, type,
469 format, 0, stream);
470 else
471 {
472 val = unpack_long (type, valaddr + embedded_offset);
473 if (TYPE_UNSIGNED (type))
474 fprintf_filtered (stream, "%u", (unsigned int) val);
475 else
476 fprintf_filtered (stream, "%d", (int) val);
477 fputs_filtered (" ", stream);
478 LA_PRINT_CHAR ((unsigned char) val, stream);
479 }
480 break;
481
482 case TYPE_CODE_FLT:
483 if (format)
484 print_scalar_formatted (valaddr + embedded_offset, type,
485 format, 0, stream);
486 else
487 print_floating (valaddr + embedded_offset, type, stream);
488 break;
489
490 case TYPE_CODE_METHOD:
491 break;
492
493 case TYPE_CODE_BITSTRING:
494 case TYPE_CODE_SET:
495 elttype = TYPE_INDEX_TYPE (type);
496 CHECK_TYPEDEF (elttype);
497 if (TYPE_STUB (elttype))
498 {
499 fprintf_filtered (stream, _("<incomplete type>"));
500 gdb_flush (stream);
501 break;
502 }
503 else
504 {
505 struct type *range = elttype;
506 LONGEST low_bound, high_bound;
507 int i;
508 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
509 int need_comma = 0;
510
511 if (is_bitstring)
512 fputs_filtered ("B'", stream);
513 else
514 fputs_filtered ("{", stream);
515
516 i = get_discrete_bounds (range, &low_bound, &high_bound);
517 maybe_bad_bstring:
518 if (i < 0)
519 {
520 fputs_filtered (_("<error value>"), stream);
521 goto done;
522 }
523
524 for (i = low_bound; i <= high_bound; i++)
525 {
526 int element = value_bit_index (type, valaddr + embedded_offset,
527 i);
528 if (element < 0)
529 {
530 i = element;
531 goto maybe_bad_bstring;
532 }
533 if (is_bitstring)
534 fprintf_filtered (stream, "%d", element);
535 else if (element)
536 {
537 if (need_comma)
538 fputs_filtered (", ", stream);
539 print_type_scalar (range, i, stream);
540 need_comma = 1;
541
542 if (i + 1 <= high_bound
543 && value_bit_index (type, valaddr + embedded_offset,
544 ++i))
545 {
546 int j = i;
547 fputs_filtered ("..", stream);
548 while (i + 1 <= high_bound
549 && value_bit_index (type,
550 valaddr + embedded_offset,
551 ++i))
552 j = i;
553 print_type_scalar (range, j, stream);
554 }
555 }
556 }
557 done:
558 if (is_bitstring)
559 fputs_filtered ("'", stream);
560 else
561 fputs_filtered ("}", stream);
562 }
563 break;
564
565 case TYPE_CODE_VOID:
566 fprintf_filtered (stream, "void");
567 break;
568
569 case TYPE_CODE_ERROR:
570 fprintf_filtered (stream, _("<error type>"));
571 break;
572
573 case TYPE_CODE_UNDEF:
574 /* This happens (without TYPE_FLAG_STUB set) on systems which don't use
575 dbx xrefs (NO_DBX_XREFS in gcc) if a file has a "struct foo *bar"
576 and no complete type for struct foo in that file. */
577 fprintf_filtered (stream, _("<incomplete type>"));
578 break;
579
580 default:
581 error (_("Invalid m2 type code %d in symbol table."), TYPE_CODE (type));
582 }
583 gdb_flush (stream);
584 return (0);
c906108c 585}
This page took 0.554614 seconds and 4 git commands to generate.