f-valprint.c revision 1.11 1 1.1 christos /* Support for printing Fortran values for GDB, the GNU debugger.
2 1.1 christos
3 1.11 christos Copyright (C) 1993-2024 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos Contributed by Motorola. Adapted from the C definitions by Farooq Butt
6 1.1 christos (fmbutt (at) engage.sps.mot.com), additionally worked over by Stan Shebs.
7 1.1 christos
8 1.1 christos This file is part of GDB.
9 1.1 christos
10 1.1 christos This program is free software; you can redistribute it and/or modify
11 1.1 christos it under the terms of the GNU General Public License as published by
12 1.1 christos the Free Software Foundation; either version 3 of the License, or
13 1.1 christos (at your option) any later version.
14 1.1 christos
15 1.1 christos This program is distributed in the hope that it will be useful,
16 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
17 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 1.1 christos GNU General Public License for more details.
19 1.1 christos
20 1.1 christos You should have received a copy of the GNU General Public License
21 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 1.1 christos
23 1.10 christos #include "annotate.h"
24 1.1 christos #include "symtab.h"
25 1.1 christos #include "gdbtypes.h"
26 1.1 christos #include "expression.h"
27 1.1 christos #include "value.h"
28 1.1 christos #include "valprint.h"
29 1.1 christos #include "language.h"
30 1.1 christos #include "f-lang.h"
31 1.1 christos #include "frame.h"
32 1.1 christos #include "gdbcore.h"
33 1.1 christos #include "command.h"
34 1.1 christos #include "block.h"
35 1.1 christos #include "dictionary.h"
36 1.9 christos #include "cli/cli-style.h"
37 1.9 christos #include "gdbarch.h"
38 1.10 christos #include "f-array-walker.h"
39 1.1 christos
40 1.1 christos static void f77_get_dynamic_length_of_aggregate (struct type *);
41 1.1 christos
42 1.9 christos LONGEST
43 1.1 christos f77_get_lowerbound (struct type *type)
44 1.1 christos {
45 1.11 christos if (!type->bounds ()->low.is_constant ())
46 1.1 christos error (_("Lower bound may not be '*' in F77"));
47 1.1 christos
48 1.9 christos return type->bounds ()->low.const_val ();
49 1.1 christos }
50 1.1 christos
51 1.9 christos LONGEST
52 1.1 christos f77_get_upperbound (struct type *type)
53 1.1 christos {
54 1.11 christos if (!type->bounds ()->high.is_constant ())
55 1.1 christos {
56 1.1 christos /* We have an assumed size array on our hands. Assume that
57 1.1 christos upper_bound == lower_bound so that we show at least 1 element.
58 1.1 christos If the user wants to see more elements, let him manually ask for 'em
59 1.1 christos and we'll subscript the array and show him. */
60 1.1 christos
61 1.1 christos return f77_get_lowerbound (type);
62 1.1 christos }
63 1.1 christos
64 1.9 christos return type->bounds ()->high.const_val ();
65 1.1 christos }
66 1.1 christos
67 1.1 christos /* Obtain F77 adjustable array dimensions. */
68 1.1 christos
69 1.1 christos static void
70 1.1 christos f77_get_dynamic_length_of_aggregate (struct type *type)
71 1.1 christos {
72 1.1 christos int upper_bound = -1;
73 1.1 christos int lower_bound = 1;
74 1.1 christos
75 1.1 christos /* Recursively go all the way down into a possibly multi-dimensional
76 1.1 christos F77 array and get the bounds. For simple arrays, this is pretty
77 1.1 christos easy but when the bounds are dynamic, we must be very careful
78 1.1 christos to add up all the lengths correctly. Not doing this right
79 1.1 christos will lead to horrendous-looking arrays in parameter lists.
80 1.1 christos
81 1.1 christos This function also works for strings which behave very
82 1.1 christos similarly to arrays. */
83 1.1 christos
84 1.10 christos if (type->target_type ()->code () == TYPE_CODE_ARRAY
85 1.10 christos || type->target_type ()->code () == TYPE_CODE_STRING)
86 1.10 christos f77_get_dynamic_length_of_aggregate (type->target_type ());
87 1.1 christos
88 1.1 christos /* Recursion ends here, start setting up lengths. */
89 1.1 christos lower_bound = f77_get_lowerbound (type);
90 1.1 christos upper_bound = f77_get_upperbound (type);
91 1.1 christos
92 1.1 christos /* Patch in a valid length value. */
93 1.10 christos type->set_length ((upper_bound - lower_bound + 1)
94 1.10 christos * check_typedef (type->target_type ())->length ());
95 1.10 christos }
96 1.10 christos
97 1.10 christos /* Per-dimension statistics. */
98 1.10 christos
99 1.10 christos struct dimension_stats
100 1.10 christos {
101 1.10 christos /* The type of the index used to address elements in the dimension. */
102 1.10 christos struct type *index_type;
103 1.10 christos
104 1.10 christos /* Total number of elements in the dimension, counted as we go. */
105 1.10 christos int nelts;
106 1.10 christos };
107 1.10 christos
108 1.10 christos /* A class used by FORTRAN_PRINT_ARRAY as a specialisation of the array
109 1.10 christos walking template. This specialisation prints Fortran arrays. */
110 1.10 christos
111 1.10 christos class fortran_array_printer_impl : public fortran_array_walker_base_impl
112 1.10 christos {
113 1.10 christos public:
114 1.10 christos /* Constructor. TYPE is the array type being printed, ADDRESS is the
115 1.10 christos address in target memory for the object of TYPE being printed. VAL is
116 1.10 christos the GDB value (of TYPE) being printed. STREAM is where to print to,
117 1.10 christos RECOURSE is passed through (and prevents infinite recursion), and
118 1.10 christos OPTIONS are the printing control options. */
119 1.10 christos explicit fortran_array_printer_impl (struct type *type,
120 1.10 christos CORE_ADDR address,
121 1.10 christos struct value *val,
122 1.10 christos struct ui_file *stream,
123 1.10 christos int recurse,
124 1.10 christos const struct value_print_options *options)
125 1.10 christos : m_elts (0),
126 1.10 christos m_val (val),
127 1.10 christos m_stream (stream),
128 1.10 christos m_recurse (recurse),
129 1.10 christos m_options (options),
130 1.10 christos m_dimension (0),
131 1.10 christos m_nrepeats (0),
132 1.10 christos m_stats (0)
133 1.10 christos { /* Nothing. */ }
134 1.10 christos
135 1.10 christos /* Called while iterating over the array bounds. When SHOULD_CONTINUE is
136 1.10 christos false then we must return false, as we have reached the end of the
137 1.10 christos array bounds for this dimension. However, we also return false if we
138 1.10 christos have printed too many elements (after printing '...'). In all other
139 1.10 christos cases, return true. */
140 1.10 christos bool continue_walking (bool should_continue)
141 1.10 christos {
142 1.10 christos bool cont = should_continue && (m_elts < m_options->print_max);
143 1.10 christos if (!cont && should_continue)
144 1.10 christos gdb_puts ("...", m_stream);
145 1.10 christos return cont;
146 1.10 christos }
147 1.10 christos
148 1.10 christos /* Called when we start iterating over a dimension. If it's not the
149 1.10 christos inner most dimension then print an opening '(' character. */
150 1.10 christos void start_dimension (struct type *index_type, LONGEST nelts, bool inner_p)
151 1.10 christos {
152 1.10 christos size_t dim_indx = m_dimension++;
153 1.10 christos
154 1.10 christos m_elt_type_prev = nullptr;
155 1.10 christos if (m_stats.size () < m_dimension)
156 1.10 christos {
157 1.10 christos m_stats.resize (m_dimension);
158 1.10 christos m_stats[dim_indx].index_type = index_type;
159 1.10 christos m_stats[dim_indx].nelts = nelts;
160 1.10 christos }
161 1.10 christos
162 1.10 christos gdb_puts ("(", m_stream);
163 1.10 christos }
164 1.10 christos
165 1.10 christos /* Called when we finish processing a batch of items within a dimension
166 1.10 christos of the array. Depending on whether this is the inner most dimension
167 1.10 christos or not we print different things, but this is all about adding
168 1.10 christos separators between elements, and dimensions of the array. */
169 1.10 christos void finish_dimension (bool inner_p, bool last_p)
170 1.10 christos {
171 1.10 christos gdb_puts (")", m_stream);
172 1.10 christos if (!last_p)
173 1.10 christos gdb_puts (" ", m_stream);
174 1.10 christos
175 1.10 christos m_dimension--;
176 1.10 christos }
177 1.10 christos
178 1.10 christos /* Called when processing dimensions of the array other than the
179 1.10 christos innermost one. WALK_1 is the walker to normally call, ELT_TYPE is
180 1.10 christos the type of the element being extracted, and ELT_OFF is the offset
181 1.10 christos of the element from the start of array being walked, INDEX_TYPE
182 1.10 christos and INDEX is the type and the value respectively of the element's
183 1.10 christos index in the dimension currently being walked and LAST_P is true
184 1.10 christos only when this is the last element that will be processed in this
185 1.10 christos dimension. */
186 1.10 christos void process_dimension (gdb::function_view<void (struct type *,
187 1.10 christos int, bool)> walk_1,
188 1.10 christos struct type *elt_type, LONGEST elt_off,
189 1.10 christos LONGEST index, bool last_p)
190 1.10 christos {
191 1.10 christos size_t dim_indx = m_dimension - 1;
192 1.10 christos struct type *elt_type_prev = m_elt_type_prev;
193 1.10 christos LONGEST elt_off_prev = m_elt_off_prev;
194 1.10 christos bool repeated = (m_options->repeat_count_threshold < UINT_MAX
195 1.10 christos && elt_type_prev != nullptr
196 1.10 christos && (m_elts + ((m_nrepeats + 1)
197 1.10 christos * m_stats[dim_indx + 1].nelts)
198 1.10 christos <= m_options->print_max)
199 1.10 christos && dimension_contents_eq (m_val, elt_type,
200 1.10 christos elt_off_prev, elt_off));
201 1.10 christos
202 1.10 christos if (repeated)
203 1.10 christos m_nrepeats++;
204 1.10 christos if (!repeated || last_p)
205 1.10 christos {
206 1.10 christos LONGEST nrepeats = m_nrepeats;
207 1.10 christos
208 1.10 christos m_nrepeats = 0;
209 1.10 christos if (nrepeats >= m_options->repeat_count_threshold)
210 1.10 christos {
211 1.10 christos annotate_elt_rep (nrepeats + 1);
212 1.10 christos gdb_printf (m_stream, "%p[<repeats %s times>%p]",
213 1.10 christos metadata_style.style ().ptr (),
214 1.10 christos plongest (nrepeats + 1),
215 1.10 christos nullptr);
216 1.10 christos annotate_elt_rep_end ();
217 1.10 christos if (!repeated)
218 1.10 christos gdb_puts (" ", m_stream);
219 1.10 christos m_elts += nrepeats * m_stats[dim_indx + 1].nelts;
220 1.10 christos }
221 1.10 christos else
222 1.10 christos for (LONGEST i = nrepeats; i > 0; i--)
223 1.10 christos {
224 1.10 christos maybe_print_array_index (m_stats[dim_indx].index_type,
225 1.10 christos index - nrepeats + repeated,
226 1.10 christos m_stream, m_options);
227 1.10 christos walk_1 (elt_type_prev, elt_off_prev, repeated && i == 1);
228 1.10 christos }
229 1.10 christos
230 1.10 christos if (!repeated)
231 1.10 christos {
232 1.10 christos /* We need to specially handle the case of hitting `print_max'
233 1.10 christos exactly as recursing would cause lone `(...)' to be printed.
234 1.10 christos And we need to print `...' by hand if the skipped element
235 1.10 christos would be the last one processed, because the subsequent call
236 1.10 christos to `continue_walking' from our caller won't do that. */
237 1.10 christos if (m_elts < m_options->print_max)
238 1.10 christos {
239 1.10 christos maybe_print_array_index (m_stats[dim_indx].index_type, index,
240 1.10 christos m_stream, m_options);
241 1.10 christos walk_1 (elt_type, elt_off, last_p);
242 1.10 christos nrepeats++;
243 1.10 christos }
244 1.10 christos else if (last_p)
245 1.10 christos gdb_puts ("...", m_stream);
246 1.10 christos }
247 1.10 christos }
248 1.10 christos
249 1.10 christos m_elt_type_prev = elt_type;
250 1.10 christos m_elt_off_prev = elt_off;
251 1.10 christos }
252 1.10 christos
253 1.10 christos /* Called to process an element of ELT_TYPE at offset ELT_OFF from the
254 1.10 christos start of the parent object, where INDEX is the value of the element's
255 1.10 christos index in the dimension currently being walked and LAST_P is true only
256 1.10 christos when this is the last element to be processed in this dimension. */
257 1.10 christos void process_element (struct type *elt_type, LONGEST elt_off,
258 1.10 christos LONGEST index, bool last_p)
259 1.10 christos {
260 1.10 christos size_t dim_indx = m_dimension - 1;
261 1.10 christos struct type *elt_type_prev = m_elt_type_prev;
262 1.10 christos LONGEST elt_off_prev = m_elt_off_prev;
263 1.11 christos bool repeated = false;
264 1.11 christos
265 1.11 christos if (m_options->repeat_count_threshold < UINT_MAX
266 1.11 christos && elt_type_prev != nullptr)
267 1.11 christos {
268 1.11 christos /* When printing large arrays this spot is called frequently, so clean
269 1.11 christos up temporary values asap to prevent allocating a large amount of
270 1.11 christos them. */
271 1.11 christos scoped_value_mark free_values;
272 1.11 christos struct value *e_val = value_from_component (m_val, elt_type, elt_off);
273 1.11 christos struct value *e_prev = value_from_component (m_val, elt_type,
274 1.11 christos elt_off_prev);
275 1.11 christos repeated = ((e_prev->entirely_available ()
276 1.11 christos && e_val->entirely_available ()
277 1.11 christos && e_prev->contents_eq (e_val))
278 1.11 christos || (e_prev->entirely_unavailable ()
279 1.11 christos && e_val->entirely_unavailable ()));
280 1.11 christos }
281 1.10 christos
282 1.10 christos if (repeated)
283 1.10 christos m_nrepeats++;
284 1.10 christos if (!repeated || last_p || m_elts + 1 == m_options->print_max)
285 1.10 christos {
286 1.10 christos LONGEST nrepeats = m_nrepeats;
287 1.10 christos bool printed = false;
288 1.10 christos
289 1.10 christos if (nrepeats != 0)
290 1.10 christos {
291 1.10 christos m_nrepeats = 0;
292 1.10 christos if (nrepeats >= m_options->repeat_count_threshold)
293 1.10 christos {
294 1.10 christos annotate_elt_rep (nrepeats + 1);
295 1.10 christos gdb_printf (m_stream, "%p[<repeats %s times>%p]",
296 1.10 christos metadata_style.style ().ptr (),
297 1.10 christos plongest (nrepeats + 1),
298 1.10 christos nullptr);
299 1.10 christos annotate_elt_rep_end ();
300 1.10 christos }
301 1.10 christos else
302 1.10 christos {
303 1.10 christos /* Extract the element value from the parent value. */
304 1.10 christos struct value *e_val
305 1.10 christos = value_from_component (m_val, elt_type, elt_off_prev);
306 1.10 christos
307 1.10 christos for (LONGEST i = nrepeats; i > 0; i--)
308 1.10 christos {
309 1.10 christos maybe_print_array_index (m_stats[dim_indx].index_type,
310 1.10 christos index - i + 1,
311 1.10 christos m_stream, m_options);
312 1.10 christos common_val_print (e_val, m_stream, m_recurse, m_options,
313 1.10 christos current_language);
314 1.10 christos if (i > 1)
315 1.10 christos gdb_puts (", ", m_stream);
316 1.10 christos }
317 1.10 christos }
318 1.10 christos printed = true;
319 1.10 christos }
320 1.10 christos
321 1.10 christos if (!repeated)
322 1.10 christos {
323 1.10 christos /* Extract the element value from the parent value. */
324 1.10 christos struct value *e_val
325 1.10 christos = value_from_component (m_val, elt_type, elt_off);
326 1.10 christos
327 1.10 christos if (printed)
328 1.10 christos gdb_puts (", ", m_stream);
329 1.10 christos maybe_print_array_index (m_stats[dim_indx].index_type, index,
330 1.10 christos m_stream, m_options);
331 1.10 christos common_val_print (e_val, m_stream, m_recurse, m_options,
332 1.10 christos current_language);
333 1.10 christos }
334 1.10 christos if (!last_p)
335 1.10 christos gdb_puts (", ", m_stream);
336 1.10 christos }
337 1.10 christos
338 1.10 christos m_elt_type_prev = elt_type;
339 1.10 christos m_elt_off_prev = elt_off;
340 1.10 christos ++m_elts;
341 1.10 christos }
342 1.10 christos
343 1.10 christos private:
344 1.10 christos /* Called to compare two VAL elements of ELT_TYPE at offsets OFFSET1
345 1.10 christos and OFFSET2 each. Handle subarrays recursively, because they may
346 1.10 christos have been sliced and we do not want to compare any memory contents
347 1.10 christos present between the slices requested. */
348 1.10 christos bool
349 1.11 christos dimension_contents_eq (struct value *val, struct type *type,
350 1.10 christos LONGEST offset1, LONGEST offset2)
351 1.10 christos {
352 1.10 christos if (type->code () == TYPE_CODE_ARRAY
353 1.10 christos && type->target_type ()->code () != TYPE_CODE_CHAR)
354 1.10 christos {
355 1.10 christos /* Extract the range, and get lower and upper bounds. */
356 1.10 christos struct type *range_type = check_typedef (type)->index_type ();
357 1.10 christos LONGEST lowerbound, upperbound;
358 1.10 christos if (!get_discrete_bounds (range_type, &lowerbound, &upperbound))
359 1.10 christos error ("failed to get range bounds");
360 1.10 christos
361 1.10 christos /* CALC is used to calculate the offsets for each element. */
362 1.10 christos fortran_array_offset_calculator calc (type);
363 1.10 christos
364 1.10 christos struct type *subarray_type = check_typedef (type->target_type ());
365 1.10 christos for (LONGEST i = lowerbound; i < upperbound + 1; i++)
366 1.10 christos {
367 1.10 christos /* Use the index and the stride to work out a new offset. */
368 1.10 christos LONGEST index_offset = calc.index_offset (i);
369 1.1 christos
370 1.10 christos if (!dimension_contents_eq (val, subarray_type,
371 1.10 christos offset1 + index_offset,
372 1.10 christos offset2 + index_offset))
373 1.10 christos return false;
374 1.10 christos }
375 1.10 christos return true;
376 1.10 christos }
377 1.10 christos else
378 1.11 christos {
379 1.11 christos struct value *e_val1 = value_from_component (val, type, offset1);
380 1.11 christos struct value *e_val2 = value_from_component (val, type, offset2);
381 1.11 christos
382 1.11 christos return ((e_val1->entirely_available ()
383 1.11 christos && e_val2->entirely_available ()
384 1.11 christos && e_val1->contents_eq (e_val2))
385 1.11 christos || (e_val1->entirely_unavailable ()
386 1.11 christos && e_val2->entirely_unavailable ()));
387 1.11 christos }
388 1.10 christos }
389 1.10 christos
390 1.10 christos /* The number of elements printed so far. */
391 1.10 christos int m_elts;
392 1.10 christos
393 1.10 christos /* The value from which we are printing elements. */
394 1.10 christos struct value *m_val;
395 1.1 christos
396 1.10 christos /* The stream we should print too. */
397 1.10 christos struct ui_file *m_stream;
398 1.1 christos
399 1.10 christos /* The recursion counter, passed through when we print each element. */
400 1.10 christos int m_recurse;
401 1.1 christos
402 1.10 christos /* The print control options. Gives us the maximum number of elements to
403 1.10 christos print, and is passed through to each element that we print. */
404 1.10 christos const struct value_print_options *m_options = nullptr;
405 1.6 christos
406 1.10 christos /* The number of the current dimension being handled. */
407 1.10 christos LONGEST m_dimension;
408 1.1 christos
409 1.10 christos /* The number of element repetitions in the current series. */
410 1.10 christos LONGEST m_nrepeats;
411 1.6 christos
412 1.10 christos /* The type and offset from M_VAL of the element handled in the previous
413 1.10 christos iteration over the current dimension. */
414 1.10 christos struct type *m_elt_type_prev;
415 1.10 christos LONGEST m_elt_off_prev;
416 1.1 christos
417 1.10 christos /* Per-dimension stats. */
418 1.10 christos std::vector<struct dimension_stats> m_stats;
419 1.10 christos };
420 1.1 christos
421 1.10 christos /* This function gets called to print a Fortran array. */
422 1.1 christos
423 1.1 christos static void
424 1.10 christos fortran_print_array (struct type *type, CORE_ADDR address,
425 1.10 christos struct ui_file *stream, int recurse,
426 1.10 christos const struct value *val,
427 1.10 christos const struct value_print_options *options)
428 1.10 christos {
429 1.10 christos fortran_array_walker<fortran_array_printer_impl> p
430 1.10 christos (type, address, (struct value *) val, stream, recurse, options);
431 1.10 christos p.walk ();
432 1.1 christos }
433 1.1 christos
434 1.1 christos
436 1.1 christos /* Decorations for Fortran. */
437 1.1 christos
438 1.1 christos static const struct generic_val_print_decorations f_decorations =
439 1.1 christos {
440 1.1 christos "(",
441 1.1 christos ",",
442 1.1 christos ")",
443 1.1 christos ".TRUE.",
444 1.9 christos ".FALSE.",
445 1.6 christos "void",
446 1.6 christos "{",
447 1.1 christos "}"
448 1.1 christos };
449 1.9 christos
450 1.1 christos /* See f-lang.h. */
451 1.1 christos
452 1.10 christos void
453 1.10 christos f_language::value_print_inner (struct value *val, struct ui_file *stream,
454 1.10 christos int recurse,
455 1.1 christos const struct value_print_options *options) const
456 1.11 christos {
457 1.10 christos struct type *type = check_typedef (val->type ());
458 1.6 christos struct gdbarch *gdbarch = type->arch ();
459 1.1 christos int printed_field = 0; /* Number of fields printed. */
460 1.1 christos struct type *elttype;
461 1.1 christos CORE_ADDR addr;
462 1.11 christos int index;
463 1.11 christos const gdb_byte *valaddr = val->contents_for_printing ().data ();
464 1.1 christos const CORE_ADDR address = val->address ();
465 1.9 christos
466 1.1 christos switch (type->code ())
467 1.1 christos {
468 1.1 christos case TYPE_CODE_STRING:
469 1.10 christos f77_get_dynamic_length_of_aggregate (type);
470 1.10 christos printstr (stream, builtin_type (gdbarch)->builtin_char, valaddr,
471 1.1 christos type->length (), NULL, 0, options);
472 1.1 christos break;
473 1.1 christos
474 1.10 christos case TYPE_CODE_ARRAY:
475 1.10 christos if (type->target_type ()->code () != TYPE_CODE_CHAR)
476 1.1 christos fortran_print_array (type, address, stream, recurse, val, options);
477 1.1 christos else
478 1.10 christos {
479 1.1 christos struct type *ch_type = type->target_type ();
480 1.1 christos
481 1.10 christos f77_get_dynamic_length_of_aggregate (type);
482 1.10 christos printstr (stream, ch_type, valaddr,
483 1.10 christos type->length () / ch_type->length (), NULL, 0,
484 1.1 christos options);
485 1.1 christos }
486 1.1 christos break;
487 1.1 christos
488 1.1 christos case TYPE_CODE_PTR:
489 1.1 christos if (options->format && options->format != 's')
490 1.9 christos {
491 1.1 christos value_print_scalar_formatted (val, options, 0, stream);
492 1.1 christos break;
493 1.1 christos }
494 1.1 christos else
495 1.1 christos {
496 1.1 christos int want_space = 0;
497 1.9 christos
498 1.10 christos addr = unpack_pointer (type, valaddr);
499 1.1 christos elttype = check_typedef (type->target_type ());
500 1.9 christos
501 1.1 christos if (elttype->code () == TYPE_CODE_FUNC)
502 1.1 christos {
503 1.1 christos /* Try to print what function it points to. */
504 1.1 christos print_function_pointer_address (options, gdbarch, addr, stream);
505 1.1 christos return;
506 1.1 christos }
507 1.1 christos
508 1.1 christos if (options->symbol_print)
509 1.1 christos want_space = print_address_demangle (options, gdbarch, addr,
510 1.1 christos stream, demangle);
511 1.1 christos else if (options->addressprint && options->format != 's')
512 1.10 christos {
513 1.1 christos gdb_puts (paddress (gdbarch, addr), stream);
514 1.1 christos want_space = 1;
515 1.1 christos }
516 1.1 christos
517 1.1 christos /* For a pointer to char or unsigned char, also print the string
518 1.10 christos pointed to, unless pointer is null. */
519 1.9 christos if (elttype->length () == 1
520 1.1 christos && elttype->code () == TYPE_CODE_INT
521 1.1 christos && (options->format == 0 || options->format == 's')
522 1.1 christos && addr != 0)
523 1.1 christos {
524 1.10 christos if (want_space)
525 1.10 christos gdb_puts (" ", stream);
526 1.6 christos val_print_string (type->target_type (), NULL, addr, -1,
527 1.1 christos stream, options);
528 1.1 christos }
529 1.1 christos return;
530 1.1 christos }
531 1.1 christos break;
532 1.1 christos
533 1.1 christos case TYPE_CODE_STRUCT:
534 1.10 christos case TYPE_CODE_UNION:
535 1.1 christos case TYPE_CODE_NAMELIST:
536 1.10 christos /* Starting from the Fortran 90 standard, Fortran supports derived
537 1.10 christos types. */
538 1.9 christos gdb_printf (stream, "( ");
539 1.10 christos for (index = 0; index < type->num_fields (); index++)
540 1.10 christos {
541 1.10 christos struct type *field_type
542 1.6 christos = check_typedef (type->field (index).type ());
543 1.9 christos
544 1.6 christos if (field_type->code () != TYPE_CODE_FUNC)
545 1.10 christos {
546 1.10 christos const char *field_name = type->field (index).name ();
547 1.10 christos struct value *field;
548 1.10 christos
549 1.10 christos if (type->code () == TYPE_CODE_NAMELIST)
550 1.10 christos {
551 1.10 christos /* While printing namelist items, fetch the appropriate
552 1.10 christos value field before printing its value. */
553 1.10 christos struct block_symbol sym
554 1.11 christos = lookup_symbol (field_name, get_selected_block (nullptr),
555 1.10 christos SEARCH_VFT, nullptr);
556 1.10 christos if (sym.symbol == nullptr)
557 1.10 christos error (_("failed to find symbol for name list component %s"),
558 1.10 christos field_name);
559 1.10 christos field = value_of_variable (sym.symbol, sym.block);
560 1.10 christos }
561 1.10 christos else
562 1.6 christos field = value_field (val, index);
563 1.6 christos
564 1.10 christos if (printed_field > 0)
565 1.1 christos gdb_puts (", ", stream);
566 1.6 christos
567 1.6 christos if (field_name != NULL)
568 1.9 christos {
569 1.9 christos fputs_styled (field_name, variable_name_style.style (),
570 1.10 christos stream);
571 1.6 christos gdb_puts (" = ", stream);
572 1.6 christos }
573 1.9 christos
574 1.9 christos common_val_print (field, stream, recurse + 1,
575 1.6 christos options, current_language);
576 1.6 christos
577 1.6 christos ++printed_field;
578 1.6 christos }
579 1.10 christos }
580 1.1 christos gdb_printf (stream, " )");
581 1.1 christos break;
582 1.9 christos
583 1.9 christos case TYPE_CODE_BOOL:
584 1.9 christos if (options->format || options->output_format)
585 1.9 christos {
586 1.9 christos struct value_print_options opts = *options;
587 1.9 christos opts.format = (options->format ? options->format
588 1.9 christos : options->output_format);
589 1.9 christos value_print_scalar_formatted (val, &opts, 0, stream);
590 1.9 christos }
591 1.9 christos else
592 1.9 christos {
593 1.9 christos LONGEST longval = value_as_long (val);
594 1.9 christos /* The Fortran standard doesn't specify how logical types are
595 1.9 christos represented. Different compilers use different non zero
596 1.9 christos values to represent logical true. */
597 1.10 christos if (longval == 0)
598 1.9 christos gdb_puts (f_decorations.false_name, stream);
599 1.10 christos else
600 1.9 christos gdb_puts (f_decorations.true_name, stream);
601 1.9 christos }
602 1.9 christos break;
603 1.10 christos
604 1.1 christos case TYPE_CODE_INT:
605 1.1 christos case TYPE_CODE_REF:
606 1.1 christos case TYPE_CODE_FUNC:
607 1.1 christos case TYPE_CODE_FLAGS:
608 1.1 christos case TYPE_CODE_FLT:
609 1.1 christos case TYPE_CODE_VOID:
610 1.1 christos case TYPE_CODE_ERROR:
611 1.1 christos case TYPE_CODE_RANGE:
612 1.1 christos case TYPE_CODE_UNDEF:
613 1.1 christos case TYPE_CODE_COMPLEX:
614 1.1 christos case TYPE_CODE_CHAR:
615 1.9 christos default:
616 1.1 christos generic_value_print (val, stream, recurse, options, &f_decorations);
617 1.1 christos break;
618 1.1 christos }
619 1.1 christos }
620 1.1 christos
621 1.3 christos static void
622 1.1 christos info_common_command_for_block (const struct block *block, const char *comname,
623 1.1 christos int *any_printed)
624 1.1 christos {
625 1.1 christos struct value_print_options opts;
626 1.1 christos
627 1.1 christos get_user_print_options (&opts);
628 1.11 christos
629 1.10 christos for (struct symbol *sym : block_iterator_range (block))
630 1.1 christos if (sym->domain () == COMMON_BLOCK_DOMAIN)
631 1.10 christos {
632 1.1 christos const struct common_block *common = sym->value_common_block ();
633 1.1 christos size_t index;
634 1.10 christos
635 1.1 christos gdb_assert (sym->aclass () == LOC_COMMON_BLOCK);
636 1.9 christos
637 1.10 christos if (comname && (!sym->linkage_name ()
638 1.1 christos || strcmp (comname, sym->linkage_name ()) != 0))
639 1.1 christos continue;
640 1.1 christos
641 1.10 christos if (*any_printed)
642 1.1 christos gdb_putc ('\n');
643 1.1 christos else
644 1.9 christos *any_printed = 1;
645 1.10 christos if (sym->print_name ())
646 1.10 christos gdb_printf (_("Contents of F77 COMMON block '%s':\n"),
647 1.1 christos sym->print_name ());
648 1.10 christos else
649 1.1 christos gdb_printf (_("Contents of blank COMMON block:\n"));
650 1.1 christos
651 1.1 christos for (index = 0; index < common->n_entries; index++)
652 1.1 christos {
653 1.1 christos struct value *val = NULL;
654 1.10 christos
655 1.10 christos gdb_printf ("%s = ",
656 1.1 christos common->contents[index]->print_name ());
657 1.9 christos
658 1.1 christos try
659 1.1 christos {
660 1.1 christos val = value_of_variable (common->contents[index], block);
661 1.1 christos value_print (val, gdb_stdout, &opts);
662 1.1 christos }
663 1.9 christos
664 1.5 christos catch (const gdb_exception_error &except)
665 1.9 christos {
666 1.9 christos fprintf_styled (gdb_stdout, metadata_style.style (),
667 1.9 christos "<error reading variable: %s>",
668 1.5 christos except.what ());
669 1.5 christos }
670 1.10 christos
671 1.1 christos gdb_putc ('\n');
672 1.1 christos }
673 1.1 christos }
674 1.1 christos }
675 1.1 christos
676 1.1 christos /* This function is used to print out the values in a given COMMON
677 1.1 christos block. It will always use the most local common block of the
678 1.1 christos given name. */
679 1.1 christos
680 1.8 christos static void
681 1.1 christos info_common_command (const char *comname, int from_tty)
682 1.10 christos {
683 1.3 christos frame_info_ptr fi;
684 1.1 christos const struct block *block;
685 1.1 christos int values_printed = 0;
686 1.1 christos
687 1.1 christos /* We have been told to display the contents of F77 COMMON
688 1.1 christos block supposedly visible in this function. Let us
689 1.1 christos first make sure that it is visible and if so, let
690 1.1 christos us display its contents. */
691 1.1 christos
692 1.1 christos fi = get_selected_frame (_("No frame selected"));
693 1.1 christos
694 1.1 christos /* The following is generally ripped off from stack.c's routine
695 1.1 christos print_frame_info(). */
696 1.1 christos
697 1.1 christos block = get_frame_block (fi, 0);
698 1.1 christos if (block == NULL)
699 1.10 christos {
700 1.1 christos gdb_printf (_("No symbol table info available.\n"));
701 1.1 christos return;
702 1.1 christos }
703 1.1 christos
704 1.1 christos while (block)
705 1.1 christos {
706 1.1 christos info_common_command_for_block (block, comname, &values_printed);
707 1.10 christos /* After handling the function's top-level block, stop. Don't
708 1.10 christos continue to its superblock, the block of per-file symbols. */
709 1.1 christos if (block->function ())
710 1.10 christos break;
711 1.1 christos block = block->superblock ();
712 1.1 christos }
713 1.1 christos
714 1.1 christos if (!values_printed)
715 1.1 christos {
716 1.10 christos if (comname)
717 1.1 christos gdb_printf (_("No common block '%s'.\n"), comname);
718 1.10 christos else
719 1.1 christos gdb_printf (_("No common blocks.\n"));
720 1.1 christos }
721 1.1 christos }
722 1.9 christos
723 1.1 christos void _initialize_f_valprint ();
724 1.9 christos void
725 1.1 christos _initialize_f_valprint ()
726 1.1 christos {
727 1.1 christos add_info ("common", info_common_command,
728 1.1 christos _("Print out the values contained in a Fortran COMMON block."));
729 }
730