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