Remove support for FreeBSD/alpha.
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmd-stack.c
CommitLineData
fb40c209 1/* MI Command Set - stack commands.
61baf725 2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
ab91fdd5 3 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
19
20#include "defs.h"
21#include "target.h"
22#include "frame.h"
23#include "value.h"
24#include "mi-cmds.h"
25#include "ui-out.h"
e88c90f2 26#include "symtab.h"
fe898f56 27#include "block.h"
b9362cc7 28#include "stack.h"
de4f826b 29#include "dictionary.h"
d8ca156b 30#include "language.h"
79a45b7d 31#include "valprint.h"
1e611234
PM
32#include "utils.h"
33#include "mi-getopt.h"
6dddc817 34#include "extension.h"
1e611234 35#include <ctype.h>
87967e27 36#include "mi-parse.h"
daf3c977
VP
37
38enum what_to_list { locals, arguments, all };
39
6211c335 40static void list_args_or_locals (enum what_to_list what,
bdaf8d4a 41 enum print_values values,
6211c335
YQ
42 struct frame_info *fi,
43 int skip_unavailable);
fb40c209 44
1e611234
PM
45/* True if we want to allow Python-based frame filters. */
46static int frame_filters = 0;
47
48void
49mi_cmd_enable_frame_filters (char *command, char **argv, int argc)
50{
51 if (argc != 0)
52 error (_("-enable-frame-filters: no arguments allowed"));
53 frame_filters = 1;
54}
55
10367c7c
PA
56/* Like apply_ext_lang_frame_filter, but take a print_values */
57
58static enum ext_lang_bt_status
59mi_apply_ext_lang_frame_filter (struct frame_info *frame, int flags,
60 enum print_values print_values,
61 struct ui_out *out,
62 int frame_low, int frame_high)
63{
64 /* ext_lang_frame_args's MI options are compatible with MI print
65 values. */
66 return apply_ext_lang_frame_filter (frame, flags,
67 (enum ext_lang_frame_args) print_values,
68 out,
69 frame_low, frame_high);
70}
71
2b03b41d 72/* Print a list of the stack frames. Args can be none, in which case
fb40c209
AC
73 we want to print the whole backtrace, or a pair of numbers
74 specifying the frame numbers at which to start and stop the
2b03b41d
SS
75 display. If the two numbers are equal, a single frame will be
76 displayed. */
77
ce8f13f8 78void
fb40c209
AC
79mi_cmd_stack_list_frames (char *command, char **argv, int argc)
80{
81 int frame_low;
82 int frame_high;
83 int i;
6ad4a2cf 84 struct cleanup *cleanup_stack;
fb40c209 85 struct frame_info *fi;
6dddc817 86 enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
1e611234
PM
87 int raw_arg = 0;
88 int oind = 0;
89 enum opt
90 {
91 NO_FRAME_FILTERS
92 };
93 static const struct mi_opt opts[] =
94 {
95 {"-no-frame-filters", NO_FRAME_FILTERS, 0},
96 { 0, 0, 0 }
97 };
98
99 /* Parse arguments. In this instance we are just looking for
100 --no-frame-filters. */
101 while (1)
102 {
103 char *oarg;
104 int opt = mi_getopt ("-stack-list-frames", argc, argv,
105 opts, &oind, &oarg);
106 if (opt < 0)
107 break;
108 switch ((enum opt) opt)
109 {
110 case NO_FRAME_FILTERS:
111 raw_arg = oind;
112 break;
113 }
114 }
fb40c209 115
1e611234
PM
116 /* After the last option is parsed, there should either be low -
117 high range, or no further arguments. */
118 if ((argc - oind != 0) && (argc - oind != 2))
119 error (_("-stack-list-frames: Usage: [--no-frame-filters] [FRAME_LOW FRAME_HIGH]"));
fb40c209 120
1e611234
PM
121 /* If there is a range, set it. */
122 if (argc - oind == 2)
fb40c209 123 {
1e611234
PM
124 frame_low = atoi (argv[0 + oind]);
125 frame_high = atoi (argv[1 + oind]);
fb40c209
AC
126 }
127 else
128 {
129 /* Called with no arguments, it means we want the whole
2b03b41d 130 backtrace. */
fb40c209
AC
131 frame_low = -1;
132 frame_high = -1;
133 }
134
135 /* Let's position fi on the frame at which to start the
136 display. Could be the innermost frame if the whole stack needs
2b03b41d 137 displaying, or if frame_low is 0. */
fb40c209
AC
138 for (i = 0, fi = get_current_frame ();
139 fi && i < frame_low;
140 i++, fi = get_prev_frame (fi));
141
142 if (fi == NULL)
1b05df00 143 error (_("-stack-list-frames: Not enough frames in stack."));
fb40c209 144
79a45e25 145 cleanup_stack = make_cleanup_ui_out_list_begin_end (current_uiout, "stack");
fb40c209 146
1e611234 147 if (! raw_arg && frame_filters)
fb40c209 148 {
1e611234
PM
149 int flags = PRINT_LEVEL | PRINT_FRAME_INFO;
150 int py_frame_low = frame_low;
151
152 /* We cannot pass -1 to frame_low, as that would signify a
153 relative backtrace from the tail of the stack. So, in the case
154 of frame_low == -1, assign and increment it. */
155 if (py_frame_low == -1)
156 py_frame_low++;
157
6dddc817
DE
158 result = apply_ext_lang_frame_filter (get_current_frame (), flags,
159 NO_VALUES, current_uiout,
160 py_frame_low, frame_high);
1e611234
PM
161 }
162
163 /* Run the inbuilt backtrace if there are no filters registered, or
164 if "--no-frame-filters" has been specified from the command. */
6dddc817 165 if (! frame_filters || raw_arg || result == EXT_LANG_BT_NO_FILTERS)
1e611234
PM
166 {
167 /* Now let's print the frames up to frame_high, or until there are
168 frames in the stack. */
169 for (;
170 fi && (i <= frame_high || frame_high == -1);
171 i++, fi = get_prev_frame (fi))
172 {
173 QUIT;
174 /* Print the location and the address always, even for level 0.
175 If args is 0, don't print the arguments. */
08d72866 176 print_frame_info (fi, 1, LOC_AND_ADDRESS, 0 /* args */, 0);
1e611234 177 }
fb40c209
AC
178 }
179
6ad4a2cf 180 do_cleanups (cleanup_stack);
fb40c209
AC
181}
182
ce8f13f8 183void
fb40c209
AC
184mi_cmd_stack_info_depth (char *command, char **argv, int argc)
185{
186 int frame_high;
187 int i;
188 struct frame_info *fi;
189
fb40c209 190 if (argc > 1)
1b05df00 191 error (_("-stack-info-depth: Usage: [MAX_DEPTH]"));
fb40c209
AC
192
193 if (argc == 1)
194 frame_high = atoi (argv[0]);
195 else
196 /* Called with no arguments, it means we want the real depth of
2b03b41d 197 the stack. */
fb40c209
AC
198 frame_high = -1;
199
200 for (i = 0, fi = get_current_frame ();
201 fi && (i < frame_high || frame_high == -1);
202 i++, fi = get_prev_frame (fi))
203 QUIT;
204
112e8700 205 current_uiout->field_int ("depth", i);
fb40c209
AC
206}
207
7a93fb82 208/* Print a list of the locals for the current frame. With argument of
fb40c209 209 0, print only the names, with argument of 1 print also the
2b03b41d
SS
210 values. */
211
ce8f13f8 212void
fb40c209
AC
213mi_cmd_stack_list_locals (char *command, char **argv, int argc)
214{
f5ec2042 215 struct frame_info *frame;
1e611234 216 int raw_arg = 0;
6dddc817 217 enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
f486487f 218 enum print_values print_value;
645eab03 219 int oind = 0;
6211c335 220 int skip_unavailable = 0;
f5ec2042 221
645eab03
YQ
222 if (argc > 1)
223 {
645eab03
YQ
224 enum opt
225 {
6211c335
YQ
226 NO_FRAME_FILTERS,
227 SKIP_UNAVAILABLE,
645eab03
YQ
228 };
229 static const struct mi_opt opts[] =
230 {
231 {"-no-frame-filters", NO_FRAME_FILTERS, 0},
6211c335 232 {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
645eab03
YQ
233 { 0, 0, 0 }
234 };
235
236 while (1)
237 {
238 char *oarg;
239 /* Don't parse 'print-values' as an option. */
240 int opt = mi_getopt ("-stack-list-locals", argc - 1, argv,
241 opts, &oind, &oarg);
242
243 if (opt < 0)
244 break;
245 switch ((enum opt) opt)
246 {
247 case NO_FRAME_FILTERS:
248 raw_arg = oind;
6211c335
YQ
249 case SKIP_UNAVAILABLE:
250 skip_unavailable = 1;
645eab03
YQ
251 break;
252 }
253 }
254 }
fb40c209 255
645eab03
YQ
256 /* After the last option is parsed, there should be only
257 'print-values'. */
258 if (argc - oind != 1)
6211c335
YQ
259 error (_("-stack-list-locals: Usage: [--no-frame-filters] "
260 "[--skip-unavailable] PRINT_VALUES"));
f5ec2042 261
1e611234 262 frame = get_selected_frame (NULL);
645eab03 263 print_value = mi_parse_print_values (argv[oind]);
1e611234
PM
264
265 if (! raw_arg && frame_filters)
266 {
267 int flags = PRINT_LEVEL | PRINT_LOCALS;
268
10367c7c
PA
269 result = mi_apply_ext_lang_frame_filter (frame, flags, print_value,
270 current_uiout, 0, 0);
1e611234
PM
271 }
272
273 /* Run the inbuilt backtrace if there are no filters registered, or
274 if "--no-frame-filters" has been specified from the command. */
6dddc817 275 if (! frame_filters || raw_arg || result == EXT_LANG_BT_NO_FILTERS)
1e611234 276 {
6211c335
YQ
277 list_args_or_locals (locals, print_value, frame,
278 skip_unavailable);
1e611234 279 }
fb40c209
AC
280}
281
7a93fb82 282/* Print a list of the arguments for the current frame. With argument
fb40c209 283 of 0, print only the names, with argument of 1 print also the
2b03b41d
SS
284 values. */
285
ce8f13f8 286void
fb40c209
AC
287mi_cmd_stack_list_args (char *command, char **argv, int argc)
288{
289 int frame_low;
290 int frame_high;
291 int i;
292 struct frame_info *fi;
6ad4a2cf 293 struct cleanup *cleanup_stack_args;
8b777f02 294 enum print_values print_values;
79a45e25 295 struct ui_out *uiout = current_uiout;
1e611234 296 int raw_arg = 0;
242f1fd7 297 int oind = 0;
6211c335 298 int skip_unavailable = 0;
6dddc817 299 enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
242f1fd7
YQ
300 enum opt
301 {
302 NO_FRAME_FILTERS,
6211c335 303 SKIP_UNAVAILABLE,
242f1fd7
YQ
304 };
305 static const struct mi_opt opts[] =
306 {
307 {"-no-frame-filters", NO_FRAME_FILTERS, 0},
6211c335 308 {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
242f1fd7
YQ
309 { 0, 0, 0 }
310 };
311
312 while (1)
313 {
314 char *oarg;
315 int opt = mi_getopt_allow_unknown ("-stack-list-args", argc, argv,
316 opts, &oind, &oarg);
fb40c209 317
242f1fd7
YQ
318 if (opt < 0)
319 break;
320 switch ((enum opt) opt)
321 {
322 case NO_FRAME_FILTERS:
323 raw_arg = oind;
324 break;
6211c335
YQ
325 case SKIP_UNAVAILABLE:
326 skip_unavailable = 1;
327 break;
242f1fd7
YQ
328 }
329 }
fb40c209 330
242f1fd7
YQ
331 if (argc - oind != 1 && argc - oind != 3)
332 error (_("-stack-list-arguments: Usage: " \
6211c335
YQ
333 "[--no-frame-filters] [--skip-unavailable] "
334 "PRINT_VALUES [FRAME_LOW FRAME_HIGH]"));
1e611234 335
242f1fd7 336 if (argc - oind == 3)
fb40c209 337 {
242f1fd7
YQ
338 frame_low = atoi (argv[1 + oind]);
339 frame_high = atoi (argv[2 + oind]);
fb40c209
AC
340 }
341 else
342 {
343 /* Called with no arguments, it means we want args for the whole
2b03b41d 344 backtrace. */
fb40c209
AC
345 frame_low = -1;
346 frame_high = -1;
347 }
348
242f1fd7 349 print_values = mi_parse_print_values (argv[oind]);
8b777f02 350
fb40c209
AC
351 /* Let's position fi on the frame at which to start the
352 display. Could be the innermost frame if the whole stack needs
2b03b41d 353 displaying, or if frame_low is 0. */
fb40c209
AC
354 for (i = 0, fi = get_current_frame ();
355 fi && i < frame_low;
356 i++, fi = get_prev_frame (fi));
357
358 if (fi == NULL)
1b05df00 359 error (_("-stack-list-arguments: Not enough frames in stack."));
fb40c209 360
9a2b4c1b
MS
361 cleanup_stack_args
362 = make_cleanup_ui_out_list_begin_end (uiout, "stack-args");
fb40c209 363
1e611234 364 if (! raw_arg && frame_filters)
fb40c209 365 {
1e611234
PM
366 int flags = PRINT_LEVEL | PRINT_ARGS;
367 int py_frame_low = frame_low;
368
369 /* We cannot pass -1 to frame_low, as that would signify a
370 relative backtrace from the tail of the stack. So, in the case
371 of frame_low == -1, assign and increment it. */
372 if (py_frame_low == -1)
373 py_frame_low++;
374
10367c7c
PA
375 result = mi_apply_ext_lang_frame_filter (get_current_frame (), flags,
376 print_values, current_uiout,
377 py_frame_low, frame_high);
fb40c209
AC
378 }
379
1e611234
PM
380 /* Run the inbuilt backtrace if there are no filters registered, or
381 if "--no-frame-filters" has been specified from the command. */
6dddc817 382 if (! frame_filters || raw_arg || result == EXT_LANG_BT_NO_FILTERS)
1e611234
PM
383 {
384 /* Now let's print the frames up to frame_high, or until there are
385 frames in the stack. */
386 for (;
387 fi && (i <= frame_high || frame_high == -1);
388 i++, fi = get_prev_frame (fi))
389 {
390 struct cleanup *cleanup_frame;
391
392 QUIT;
393 cleanup_frame = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
112e8700 394 uiout->field_int ("level", i);
6211c335 395 list_args_or_locals (arguments, print_values, fi, skip_unavailable);
1e611234
PM
396 do_cleanups (cleanup_frame);
397 }
398 }
6ad4a2cf 399 do_cleanups (cleanup_stack_args);
fb40c209
AC
400}
401
daf3c977 402/* Print a list of the local variables (including arguments) for the
7a93fb82
VP
403 current frame. ARGC must be 1 and ARGV[0] specify if only the names,
404 or both names and values of the variables must be printed. See
405 parse_print_value for possible values. */
2b03b41d 406
daf3c977
VP
407void
408mi_cmd_stack_list_variables (char *command, char **argv, int argc)
409{
410 struct frame_info *frame;
1e611234 411 int raw_arg = 0;
6dddc817 412 enum ext_lang_bt_status result = EXT_LANG_BT_ERROR;
f486487f 413 enum print_values print_value;
645eab03 414 int oind = 0;
6211c335 415 int skip_unavailable = 0;
daf3c977 416
645eab03
YQ
417 if (argc > 1)
418 {
645eab03
YQ
419 enum opt
420 {
6211c335
YQ
421 NO_FRAME_FILTERS,
422 SKIP_UNAVAILABLE,
645eab03
YQ
423 };
424 static const struct mi_opt opts[] =
425 {
426 {"-no-frame-filters", NO_FRAME_FILTERS, 0},
6211c335 427 {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
645eab03
YQ
428 { 0, 0, 0 }
429 };
430
431 while (1)
432 {
433 char *oarg;
434 /* Don't parse 'print-values' as an option. */
435 int opt = mi_getopt ("-stack-list-variables", argc - 1,
436 argv, opts, &oind, &oarg);
437 if (opt < 0)
438 break;
439 switch ((enum opt) opt)
440 {
441 case NO_FRAME_FILTERS:
442 raw_arg = oind;
443 break;
6211c335
YQ
444 case SKIP_UNAVAILABLE:
445 skip_unavailable = 1;
446 break;
645eab03
YQ
447 }
448 }
449 }
daf3c977 450
645eab03
YQ
451 /* After the last option is parsed, there should be only
452 'print-values'. */
453 if (argc - oind != 1)
6211c335
YQ
454 error (_("-stack-list-variables: Usage: [--no-frame-filters] " \
455 "[--skip-unavailable] PRINT_VALUES"));
daf3c977 456
1e611234 457 frame = get_selected_frame (NULL);
645eab03 458 print_value = mi_parse_print_values (argv[oind]);
1e611234
PM
459
460 if (! raw_arg && frame_filters)
461 {
462 int flags = PRINT_LEVEL | PRINT_ARGS | PRINT_LOCALS;
463
10367c7c
PA
464 result = mi_apply_ext_lang_frame_filter (frame, flags,
465 print_value,
466 current_uiout, 0, 0);
1e611234
PM
467 }
468
469 /* Run the inbuilt backtrace if there are no filters registered, or
470 if "--no-frame-filters" has been specified from the command. */
6dddc817 471 if (! frame_filters || raw_arg || result == EXT_LANG_BT_NO_FILTERS)
1e611234 472 {
6211c335
YQ
473 list_args_or_locals (all, print_value, frame,
474 skip_unavailable);
1e611234 475 }
daf3c977
VP
476}
477
2b03b41d
SS
478/* Print single local or argument. ARG must be already read in. For
479 WHAT and VALUES see list_args_or_locals.
93d86cef 480
2b03b41d 481 Errors are printed as if they would be the parameter value. Use
6211c335
YQ
482 zeroed ARG iff it should not be printed according to VALUES. If
483 SKIP_UNAVAILABLE is true, only print ARG if it is available. */
93d86cef
JK
484
485static void
486list_arg_or_local (const struct frame_arg *arg, enum what_to_list what,
6211c335 487 enum print_values values, int skip_unavailable)
93d86cef 488{
f99d8bf4 489 struct cleanup *old_chain;
93d86cef 490 struct ui_out *uiout = current_uiout;
f99d8bf4 491
93d86cef
JK
492 gdb_assert (!arg->val || !arg->error);
493 gdb_assert ((values == PRINT_NO_VALUES && arg->val == NULL
494 && arg->error == NULL)
495 || values == PRINT_SIMPLE_VALUES
496 || (values == PRINT_ALL_VALUES
497 && (arg->val != NULL || arg->error != NULL)));
e18b2753
JK
498 gdb_assert (arg->entry_kind == print_entry_values_no
499 || (arg->entry_kind == print_entry_values_only
500 && (arg->val || arg->error)));
93d86cef 501
6211c335
YQ
502 if (skip_unavailable && arg->val != NULL
503 && (value_entirely_unavailable (arg->val)
504 /* A scalar object that does not have all bits available is
505 also considered unavailable, because all bits contribute
506 to its representation. */
507 || (val_print_scalar_type_p (value_type (arg->val))
508 && !value_bytes_available (arg->val,
509 value_embedded_offset (arg->val),
510 TYPE_LENGTH (value_type (arg->val))))))
511 return;
512
d7e74731 513 old_chain = make_cleanup (null_cleanup, NULL);
6211c335 514
93d86cef 515 if (values != PRINT_NO_VALUES || what == all)
cd82eddc 516 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
93d86cef 517
d7e74731
PA
518 string_file stb;
519
520 stb.puts (SYMBOL_PRINT_NAME (arg->sym));
e18b2753 521 if (arg->entry_kind == print_entry_values_only)
d7e74731 522 stb.puts ("@entry");
112e8700 523 uiout->field_stream ("name", stb);
93d86cef
JK
524
525 if (what == all && SYMBOL_IS_ARGUMENT (arg->sym))
112e8700 526 uiout->field_int ("arg", 1);
93d86cef
JK
527
528 if (values == PRINT_SIMPLE_VALUES)
529 {
530 check_typedef (arg->sym->type);
d7e74731 531 type_print (arg->sym->type, "", &stb, -1);
112e8700 532 uiout->field_stream ("type", stb);
93d86cef
JK
533 }
534
535 if (arg->val || arg->error)
536 {
492d29ea 537 const char *error_message = NULL;
93d86cef
JK
538
539 if (arg->error)
492d29ea 540 error_message = arg->error;
93d86cef
JK
541 else
542 {
492d29ea 543 TRY
93d86cef
JK
544 {
545 struct value_print_options opts;
546
2a998fc0 547 get_no_prettyformat_print_options (&opts);
93d86cef 548 opts.deref_ref = 1;
d7e74731 549 common_val_print (arg->val, &stb, 0, &opts,
93d86cef
JK
550 language_def (SYMBOL_LANGUAGE (arg->sym)));
551 }
492d29ea
PA
552 CATCH (except, RETURN_MASK_ERROR)
553 {
554 error_message = except.message;
555 }
556 END_CATCH
93d86cef 557 }
492d29ea 558 if (error_message != NULL)
d7e74731 559 stb.printf (_("<error reading variable: %s>"), error_message);
112e8700 560 uiout->field_stream ("value", stb);
93d86cef
JK
561 }
562
f99d8bf4 563 do_cleanups (old_chain);
93d86cef 564}
daf3c977 565
5c4aa40b
YQ
566/* Print a list of the objects for the frame FI in a certain form,
567 which is determined by VALUES. The objects can be locals,
6211c335
YQ
568 arguments or both, which is determined by WHAT. If SKIP_UNAVAILABLE
569 is true, only print the arguments or local variables whose values
570 are available. */
2b03b41d 571
fb40c209 572static void
bdaf8d4a 573list_args_or_locals (enum what_to_list what, enum print_values values,
6211c335 574 struct frame_info *fi, int skip_unavailable)
fb40c209 575{
3977b71f 576 const struct block *block;
fb40c209 577 struct symbol *sym;
8157b174 578 struct block_iterator iter;
6ad4a2cf 579 struct cleanup *cleanup_list;
f5ec2042 580 struct type *type;
daf3c977 581 char *name_of_result;
79a45e25 582 struct ui_out *uiout = current_uiout;
fb40c209 583
ae767bfb 584 block = get_frame_block (fi, 0);
fb40c209 585
daf3c977
VP
586 switch (what)
587 {
588 case locals:
d6fd4674
PA
589 name_of_result = "locals";
590 break;
daf3c977 591 case arguments:
d6fd4674
PA
592 name_of_result = "args";
593 break;
daf3c977 594 case all:
d6fd4674
PA
595 name_of_result = "variables";
596 break;
654e7c1f 597 default:
d6fd4674
PA
598 internal_error (__FILE__, __LINE__,
599 "unexpected what_to_list: %d", (int) what);
daf3c977
VP
600 }
601
602 cleanup_list = make_cleanup_ui_out_list_begin_end (uiout, name_of_result);
fb40c209
AC
603
604 while (block != 0)
605 {
de4f826b 606 ALL_BLOCK_SYMBOLS (block, iter, sym)
fb40c209 607 {
39bf4652
JB
608 int print_me = 0;
609
fb40c209
AC
610 switch (SYMBOL_CLASS (sym))
611 {
612 default:
613 case LOC_UNDEF: /* catches errors */
614 case LOC_CONST: /* constant */
615 case LOC_TYPEDEF: /* local typedef */
616 case LOC_LABEL: /* local label */
617 case LOC_BLOCK: /* local function */
618 case LOC_CONST_BYTES: /* loc. byte seq. */
619 case LOC_UNRESOLVED: /* unresolved static */
620 case LOC_OPTIMIZED_OUT: /* optimized out */
621 print_me = 0;
622 break;
623
624 case LOC_ARG: /* argument */
625 case LOC_REF_ARG: /* reference arg */
fb40c209 626 case LOC_REGPARM_ADDR: /* indirect register arg */
fb40c209 627 case LOC_LOCAL: /* stack local */
fb40c209
AC
628 case LOC_STATIC: /* static */
629 case LOC_REGISTER: /* register */
4cf623b6 630 case LOC_COMPUTED: /* computed location */
daf3c977 631 if (what == all)
fb40c209 632 print_me = 1;
daf3c977
VP
633 else if (what == locals)
634 print_me = !SYMBOL_IS_ARGUMENT (sym);
635 else
636 print_me = SYMBOL_IS_ARGUMENT (sym);
fb40c209
AC
637 break;
638 }
639 if (print_me)
640 {
6bb0384f 641 struct symbol *sym2;
e18b2753 642 struct frame_arg arg, entryarg;
fb40c209 643
daf3c977 644 if (SYMBOL_IS_ARGUMENT (sym))
f7e44f65 645 sym2 = lookup_symbol (SYMBOL_LINKAGE_NAME (sym),
f5ec2042 646 block, VAR_DOMAIN,
d12307c1 647 NULL).symbol;
f5ec2042 648 else
2a2d4dc3 649 sym2 = sym;
f7e44f65 650 gdb_assert (sym2 != NULL);
93d86cef
JK
651
652 memset (&arg, 0, sizeof (arg));
653 arg.sym = sym2;
e18b2753
JK
654 arg.entry_kind = print_entry_values_no;
655 memset (&entryarg, 0, sizeof (entryarg));
656 entryarg.sym = sym2;
657 entryarg.entry_kind = print_entry_values_no;
93d86cef 658
f5ec2042
NR
659 switch (values)
660 {
661 case PRINT_SIMPLE_VALUES:
662 type = check_typedef (sym2->type);
f5ec2042
NR
663 if (TYPE_CODE (type) != TYPE_CODE_ARRAY
664 && TYPE_CODE (type) != TYPE_CODE_STRUCT
665 && TYPE_CODE (type) != TYPE_CODE_UNION)
666 {
f5ec2042 667 case PRINT_ALL_VALUES:
82a0a75f
YQ
668 if (SYMBOL_IS_ARGUMENT (sym))
669 read_frame_arg (sym2, fi, &arg, &entryarg);
670 else
671 read_frame_local (sym2, fi, &arg);
93d86cef 672 }
f5ec2042 673 break;
fb40c209 674 }
7a93fb82 675
e18b2753 676 if (arg.entry_kind != print_entry_values_only)
6211c335 677 list_arg_or_local (&arg, what, values, skip_unavailable);
e18b2753 678 if (entryarg.entry_kind != print_entry_values_no)
6211c335 679 list_arg_or_local (&entryarg, what, values, skip_unavailable);
93d86cef 680 xfree (arg.error);
e18b2753 681 xfree (entryarg.error);
fb40c209
AC
682 }
683 }
2b03b41d 684
fb40c209
AC
685 if (BLOCK_FUNCTION (block))
686 break;
687 else
688 block = BLOCK_SUPERBLOCK (block);
689 }
6ad4a2cf 690 do_cleanups (cleanup_list);
fb40c209
AC
691}
692
ce8f13f8 693void
fb40c209
AC
694mi_cmd_stack_select_frame (char *command, char **argv, int argc)
695{
fcf43932 696 if (argc == 0 || argc > 1)
1b05df00 697 error (_("-stack-select-frame: Usage: FRAME_SPEC"));
fb40c209 698
fcf43932 699 select_frame_command (argv[0], 1 /* not used */ );
fb40c209 700}
64fd8944 701
ce8f13f8 702void
64fd8944
NR
703mi_cmd_stack_info_frame (char *command, char **argv, int argc)
704{
705 if (argc > 0)
2b03b41d 706 error (_("-stack-info-frame: No arguments allowed"));
ce8f13f8 707
08d72866 708 print_frame_info (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 0, 1);
64fd8944 709}
This page took 1.435479 seconds and 4 git commands to generate.