2012-05-18 Pedro Alves <palves@redhat.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
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
GM
197 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
198
199 if (TYPE_CODE (elttype) == TYPE_CODE_FUNC)
200 {
201 /* Try to print what function it points to. */
50810684
UW
202 print_function_pointer_address (gdbarch, addr, stream,
203 options->addressprint);
72019c9c
GM
204 /* Return value is irrelevant except for string pointers. */
205 return 0;
206 }
207
79a45b7d 208 if (options->addressprint && options->format != 's')
5af949e3 209 fputs_filtered (paddress (gdbarch, address), stream);
72019c9c
GM
210
211 /* For a pointer to char or unsigned char, also print the string
212 pointed to, unless pointer is null. */
213
214 if (TYPE_LENGTH (elttype) == 1
215 && TYPE_CODE (elttype) == TYPE_CODE_INT
79a45b7d 216 && (options->format == 0 || options->format == 's')
72019c9c 217 && addr != 0)
09ca9e2e 218 return val_print_string (TYPE_TARGET_TYPE (type), NULL, addr, -1,
6c7a06a3 219 stream, options);
72019c9c
GM
220
221 return 0;
222}
223
224static void
844781a1
GM
225print_variable_at_address (struct type *type,
226 const gdb_byte *valaddr,
79a45b7d
TT
227 struct ui_file *stream,
228 int recurse,
229 const struct value_print_options *options)
72019c9c 230{
5af949e3 231 struct gdbarch *gdbarch = get_type_arch (type);
72019c9c
GM
232 CORE_ADDR addr = unpack_pointer (type, valaddr);
233 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
234
235 fprintf_filtered (stream, "[");
5af949e3 236 fputs_filtered (paddress (gdbarch, addr), stream);
72019c9c
GM
237 fprintf_filtered (stream, "] : ");
238
239 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
240 {
241 struct value *deref_val =
d8631d21 242 value_at (TYPE_TARGET_TYPE (type), unpack_pointer (type, valaddr));
b8d56208 243
79a45b7d 244 common_val_print (deref_val, stream, recurse, options, current_language);
72019c9c
GM
245 }
246 else
247 fputs_filtered ("???", stream);
248}
249
844781a1
GM
250
251/* m2_print_array_contents - prints out the contents of an
252 array up to a max_print values.
253 It prints arrays of char as a string
254 and all other data types as comma
255 separated values. */
256
257static void
258m2_print_array_contents (struct type *type, const gdb_byte *valaddr,
259 int embedded_offset, CORE_ADDR address,
79a45b7d 260 struct ui_file *stream, int recurse,
0e03807e 261 const struct value *val,
79a45b7d
TT
262 const struct value_print_options *options,
263 int len)
844781a1
GM
264{
265 int eltlen;
266 CHECK_TYPEDEF (type);
267
268 if (TYPE_LENGTH (type) > 0)
269 {
270 eltlen = TYPE_LENGTH (type);
79a45b7d 271 if (options->prettyprint_arrays)
844781a1
GM
272 print_spaces_filtered (2 + 2 * recurse, stream);
273 /* For an array of chars, print with string syntax. */
274 if (eltlen == 1 &&
275 ((TYPE_CODE (type) == TYPE_CODE_INT)
276 || ((current_language->la_language == language_m2)
277 && (TYPE_CODE (type) == TYPE_CODE_CHAR)))
79a45b7d 278 && (options->format == 0 || options->format == 's'))
09ca9e2e 279 val_print_string (type, NULL, address, len+1, stream, options);
844781a1
GM
280 else
281 {
282 fprintf_filtered (stream, "{");
490f124f 283 val_print_array_elements (type, valaddr, embedded_offset,
0e03807e
TT
284 address, stream, recurse, val,
285 options, 0);
844781a1
GM
286 fprintf_filtered (stream, "}");
287 }
288 }
289}
290
e88acd96
TT
291/* Decorations for Modula 2. */
292
293static const struct generic_val_print_decorations m2_decorations =
294{
295 "",
296 " + ",
297 " * I",
298 "TRUE",
299 "FALSE",
300 "void"
301};
844781a1 302
32b72a42 303/* See val_print for a description of the various parameters of this
d3eab38a 304 function; they are identical. */
c906108c 305
d3eab38a 306void
fc1a4b47 307m2_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
79a45b7d 308 CORE_ADDR address, struct ui_file *stream, int recurse,
0e03807e 309 const struct value *original_value,
79a45b7d 310 const struct value_print_options *options)
c906108c 311{
5af949e3 312 struct gdbarch *gdbarch = get_type_arch (type);
025bb325 313 unsigned int i = 0; /* Number of characters printed. */
72019c9c
GM
314 unsigned len;
315 struct type *elttype;
316 unsigned eltlen;
72019c9c
GM
317 LONGEST val;
318 CORE_ADDR addr;
319
320 CHECK_TYPEDEF (type);
321 switch (TYPE_CODE (type))
322 {
323 case TYPE_CODE_ARRAY:
324 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
325 {
326 elttype = check_typedef (TYPE_TARGET_TYPE (type));
327 eltlen = TYPE_LENGTH (elttype);
328 len = TYPE_LENGTH (type) / eltlen;
79a45b7d 329 if (options->prettyprint_arrays)
72019c9c
GM
330 print_spaces_filtered (2 + 2 * recurse, stream);
331 /* For an array of chars, print with string syntax. */
332 if (eltlen == 1 &&
333 ((TYPE_CODE (elttype) == TYPE_CODE_INT)
334 || ((current_language->la_language == language_m2)
335 && (TYPE_CODE (elttype) == TYPE_CODE_CHAR)))
79a45b7d 336 && (options->format == 0 || options->format == 's'))
72019c9c
GM
337 {
338 /* If requested, look for the first null char and only print
339 elements up to it. */
79a45b7d 340 if (options->stop_print_at_null)
72019c9c
GM
341 {
342 unsigned int temp_len;
343
025bb325 344 /* Look for a NULL char. */
72019c9c
GM
345 for (temp_len = 0;
346 (valaddr + embedded_offset)[temp_len]
79a45b7d 347 && temp_len < len && temp_len < options->print_max;
72019c9c
GM
348 temp_len++);
349 len = temp_len;
350 }
351
6c7a06a3 352 LA_PRINT_STRING (stream, TYPE_TARGET_TYPE (type),
be759fcf
PM
353 valaddr + embedded_offset, len, NULL,
354 0, options);
72019c9c
GM
355 i = len;
356 }
357 else
358 {
359 fprintf_filtered (stream, "{");
490f124f 360 val_print_array_elements (type, valaddr, embedded_offset,
025bb325
MS
361 address, stream,
362 recurse, original_value,
0e03807e 363 options, 0);
72019c9c
GM
364 fprintf_filtered (stream, "}");
365 }
366 break;
367 }
368 /* Array of unspecified length: treat like pointer to first elt. */
79a45b7d 369 print_unpacked_pointer (type, address, address, options, stream);
72019c9c
GM
370 break;
371
372 case TYPE_CODE_PTR:
373 if (TYPE_CONST (type))
374 print_variable_at_address (type, valaddr + embedded_offset,
79a45b7d
TT
375 stream, recurse, options);
376 else if (options->format && options->format != 's')
ab2188aa
PA
377 val_print_scalar_formatted (type, valaddr, embedded_offset,
378 original_value, options, 0, stream);
72019c9c
GM
379 else
380 {
381 addr = unpack_pointer (type, valaddr + embedded_offset);
79a45b7d 382 print_unpacked_pointer (type, addr, address, options, stream);
72019c9c
GM
383 }
384 break;
385
72019c9c 386 case TYPE_CODE_UNION:
79a45b7d 387 if (recurse && !options->unionprint)
72019c9c
GM
388 {
389 fprintf_filtered (stream, "{...}");
390 break;
391 }
392 /* Fall through. */
393 case TYPE_CODE_STRUCT:
394 if (m2_is_long_set (type))
395 m2_print_long_set (type, valaddr, embedded_offset, address,
79a45b7d 396 stream);
844781a1
GM
397 else if (m2_is_unbounded_array (type))
398 m2_print_unbounded_array (type, valaddr, embedded_offset,
79a45b7d 399 address, stream, recurse, options);
72019c9c
GM
400 else
401 cp_print_value_fields (type, type, valaddr, embedded_offset,
0e03807e
TT
402 address, stream, recurse, original_value,
403 options, NULL, 0);
72019c9c
GM
404 break;
405
72019c9c
GM
406 case TYPE_CODE_BITSTRING:
407 case TYPE_CODE_SET:
408 elttype = TYPE_INDEX_TYPE (type);
409 CHECK_TYPEDEF (elttype);
410 if (TYPE_STUB (elttype))
411 {
412 fprintf_filtered (stream, _("<incomplete type>"));
413 gdb_flush (stream);
414 break;
415 }
416 else
417 {
418 struct type *range = elttype;
419 LONGEST low_bound, high_bound;
420 int i;
421 int is_bitstring = TYPE_CODE (type) == TYPE_CODE_BITSTRING;
422 int need_comma = 0;
423
424 if (is_bitstring)
425 fputs_filtered ("B'", stream);
426 else
427 fputs_filtered ("{", stream);
428
429 i = get_discrete_bounds (range, &low_bound, &high_bound);
430 maybe_bad_bstring:
431 if (i < 0)
432 {
433 fputs_filtered (_("<error value>"), stream);
434 goto done;
435 }
436
437 for (i = low_bound; i <= high_bound; i++)
438 {
439 int element = value_bit_index (type, valaddr + embedded_offset,
440 i);
b8d56208 441
72019c9c
GM
442 if (element < 0)
443 {
444 i = element;
445 goto maybe_bad_bstring;
446 }
447 if (is_bitstring)
448 fprintf_filtered (stream, "%d", element);
449 else if (element)
450 {
451 if (need_comma)
452 fputs_filtered (", ", stream);
453 print_type_scalar (range, i, stream);
454 need_comma = 1;
455
456 if (i + 1 <= high_bound
457 && value_bit_index (type, valaddr + embedded_offset,
458 ++i))
459 {
460 int j = i;
b8d56208 461
72019c9c
GM
462 fputs_filtered ("..", stream);
463 while (i + 1 <= high_bound
464 && value_bit_index (type,
465 valaddr + embedded_offset,
466 ++i))
467 j = i;
468 print_type_scalar (range, j, stream);
469 }
470 }
471 }
472 done:
473 if (is_bitstring)
474 fputs_filtered ("'", stream);
475 else
476 fputs_filtered ("}", stream);
477 }
478 break;
479
e88acd96
TT
480 case TYPE_CODE_RANGE:
481 if (TYPE_LENGTH (type) == TYPE_LENGTH (TYPE_TARGET_TYPE (type)))
482 {
483 m2_val_print (TYPE_TARGET_TYPE (type), valaddr, embedded_offset,
484 address, stream, recurse, original_value, options);
485 break;
486 }
487 /* FIXME: create_range_type does not set the unsigned bit in a
488 range type (I think it probably should copy it from the target
489 type), so we won't print values which are too large to
490 fit in a signed integer correctly. */
491 /* FIXME: Doesn't handle ranges of enums correctly. (Can't just
492 print with the target type, though, because the size of our type
493 and the target type might differ). */
494 /* FALLTHROUGH */
72019c9c 495
e88acd96
TT
496 case TYPE_CODE_REF:
497 case TYPE_CODE_ENUM:
498 case TYPE_CODE_FUNC:
499 case TYPE_CODE_INT:
500 case TYPE_CODE_FLT:
501 case TYPE_CODE_METHOD:
502 case TYPE_CODE_VOID:
72019c9c 503 case TYPE_CODE_ERROR:
72019c9c 504 case TYPE_CODE_UNDEF:
e88acd96
TT
505 case TYPE_CODE_BOOL:
506 case TYPE_CODE_CHAR:
72019c9c 507 default:
e88acd96
TT
508 generic_val_print (type, valaddr, embedded_offset, address,
509 stream, recurse, original_value, options,
510 &m2_decorations);
511 break;
72019c9c
GM
512 }
513 gdb_flush (stream);
c906108c 514}
This page took 0.984188 seconds and 4 git commands to generate.