OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [gdb/] [mi/] [mi-cmd-var.c] - Blame information for rev 1782

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1181 sfurman
/* MI Command Set - varobj commands.
2
 
3
   Copyright 2000, 2002 Free Software Foundation, Inc.
4
 
5
   Contributed by Cygnus Solutions (a Red Hat company).
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 2 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 59 Temple Place - Suite 330,
22
   Boston, MA 02111-1307, USA.  */
23
 
24
#include "defs.h"
25
#include "mi-cmds.h"
26
#include "ui-out.h"
27
#include "mi-out.h"
28
#include "varobj.h"
29
#include "value.h"
30
#include <ctype.h>
31
#include "gdb_string.h"
32
 
33
extern int varobjdebug;         /* defined in varobj.c */
34
 
35
static int varobj_update_one (struct varobj *var);
36
 
37
/* VAROBJ operations */
38
 
39
enum mi_cmd_result
40
mi_cmd_var_create (char *command, char **argv, int argc)
41
{
42
  CORE_ADDR frameaddr = 0;
43
  struct varobj *var;
44
  char *name;
45
  char *frame;
46
  char *expr;
47
  char *type;
48
  struct cleanup *old_cleanups;
49
  enum varobj_type var_type;
50
 
51
  if (argc != 3)
52
    {
53
      /*      xasprintf (&mi_error_message,
54
         "mi_cmd_var_create: Usage: .");
55
         return MI_CMD_ERROR; */
56
      error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
57
    }
58
 
59
  name = xstrdup (argv[0]);
60
  /* Add cleanup for name. Must be free_current_contents as
61
     name can be reallocated */
62
  old_cleanups = make_cleanup (free_current_contents, &name);
63
 
64
  frame = xstrdup (argv[1]);
65
  old_cleanups = make_cleanup (xfree, frame);
66
 
67
  expr = xstrdup (argv[2]);
68
 
69
  if (strcmp (name, "-") == 0)
70
    {
71
      xfree (name);
72
      name = varobj_gen_name ();
73
    }
74
  else if (!isalpha (*name))
75
    error ("mi_cmd_var_create: name of object must begin with a letter");
76
 
77
  if (strcmp (frame, "*") == 0)
78
    var_type = USE_CURRENT_FRAME;
79
  else if (strcmp (frame, "@") == 0)
80
    var_type = USE_SELECTED_FRAME;
81
  else
82
    {
83
      var_type = USE_SPECIFIED_FRAME;
84
      frameaddr = parse_and_eval_address (frame);
85
    }
86
 
87
  if (varobjdebug)
88
    fprintf_unfiltered (gdb_stdlog,
89
                    "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
90
                        name, frame, paddr (frameaddr), expr);
91
 
92
  var = varobj_create (name, expr, frameaddr, var_type);
93
 
94
  if (var == NULL)
95
    error ("mi_cmd_var_create: unable to create variable object");
96
 
97
  ui_out_field_string (uiout, "name", name);
98
  ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
99
  type = varobj_get_type (var);
100
  if (type == NULL)
101
    ui_out_field_string (uiout, "type", "");
102
  else
103
    {
104
      ui_out_field_string (uiout, "type", type);
105
      xfree (type);
106
    }
107
 
108
  do_cleanups (old_cleanups);
109
  return MI_CMD_DONE;
110
}
111
 
112
enum mi_cmd_result
113
mi_cmd_var_delete (char *command, char **argv, int argc)
114
{
115
  char *name;
116
  char *expr;
117
  struct varobj *var;
118
  int numdel;
119
  int children_only_p = 0;
120
  struct cleanup *old_cleanups;
121
 
122
  if (argc < 1 || argc > 2)
123
    error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION.");
124
 
125
  name = xstrdup (argv[0]);
126
  /* Add cleanup for name. Must be free_current_contents as
127
     name can be reallocated */
128
  old_cleanups = make_cleanup (free_current_contents, &name);
129
 
130
  /* If we have one single argument it cannot be '-c' or any string
131
     starting with '-'. */
132
  if (argc == 1)
133
    {
134
      if (strcmp (name, "-c") == 0)
135
        error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name");
136
      if (*name == '-')
137
        error ("mi_cmd_var_delete: Illegal variable object name");
138
    }
139
 
140
  /* If we have 2 arguments they must be '-c' followed by a string
141
     which would be the variable name. */
142
  if (argc == 2)
143
    {
144
      expr = xstrdup (argv[1]);
145
      if (strcmp (name, "-c") != 0)
146
        error ("mi_cmd_var_delete: Invalid option.");
147
      children_only_p = 1;
148
      xfree (name);
149
      name = xstrdup (expr);
150
      xfree (expr);
151
    }
152
 
153
  /* If we didn't error out, now NAME contains the name of the
154
     variable. */
155
 
156
  var = varobj_get_handle (name);
157
 
158
  if (var == NULL)
159
    error ("mi_cmd_var_delete: Variable object not found.");
160
 
161
  numdel = varobj_delete (var, NULL, children_only_p);
162
 
163
  ui_out_field_int (uiout, "ndeleted", numdel);
164
 
165
  do_cleanups (old_cleanups);
166
  return MI_CMD_DONE;
167
}
168
 
169
enum mi_cmd_result
170
mi_cmd_var_set_format (char *command, char **argv, int argc)
171
{
172
  enum varobj_display_formats format;
173
  int len;
174
  struct varobj *var;
175
  char *formspec;
176
 
177
  if (argc != 2)
178
    error ("mi_cmd_var_set_format: Usage: NAME FORMAT.");
179
 
180
  /* Get varobj handle, if a valid var obj name was specified */
181
  var = varobj_get_handle (argv[0]);
182
 
183
  if (var == NULL)
184
    error ("mi_cmd_var_set_format: Variable object not found");
185
 
186
  formspec = xstrdup (argv[1]);
187
  if (formspec == NULL)
188
    error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
189
 
190
  len = strlen (formspec);
191
 
192
  if (STREQN (formspec, "natural", len))
193
    format = FORMAT_NATURAL;
194
  else if (STREQN (formspec, "binary", len))
195
    format = FORMAT_BINARY;
196
  else if (STREQN (formspec, "decimal", len))
197
    format = FORMAT_DECIMAL;
198
  else if (STREQN (formspec, "hexadecimal", len))
199
    format = FORMAT_HEXADECIMAL;
200
  else if (STREQN (formspec, "octal", len))
201
    format = FORMAT_OCTAL;
202
  else
203
    error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
204
 
205
  /* Set the format of VAR to given format */
206
  varobj_set_display_format (var, format);
207
 
208
  /* Report the new current format */
209
  ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
210
  return MI_CMD_DONE;
211
}
212
 
213
enum mi_cmd_result
214
mi_cmd_var_show_format (char *command, char **argv, int argc)
215
{
216
  enum varobj_display_formats format;
217
  struct varobj *var;
218
 
219
  if (argc != 1)
220
    error ("mi_cmd_var_show_format: Usage: NAME.");
221
 
222
  /* Get varobj handle, if a valid var obj name was specified */
223
  var = varobj_get_handle (argv[0]);
224
  if (var == NULL)
225
    error ("mi_cmd_var_show_format: Variable object not found");
226
 
227
  format = varobj_get_display_format (var);
228
 
229
  /* Report the current format */
230
  ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
231
  return MI_CMD_DONE;
232
}
233
 
234
enum mi_cmd_result
235
mi_cmd_var_info_num_children (char *command, char **argv, int argc)
236
{
237
  struct varobj *var;
238
 
239
  if (argc != 1)
240
    error ("mi_cmd_var_info_num_children: Usage: NAME.");
241
 
242
  /* Get varobj handle, if a valid var obj name was specified */
243
  var = varobj_get_handle (argv[0]);
244
  if (var == NULL)
245
    error ("mi_cmd_var_info_num_children: Variable object not found");
246
 
247
  ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
248
  return MI_CMD_DONE;
249
}
250
 
251
enum mi_cmd_result
252
mi_cmd_var_list_children (char *command, char **argv, int argc)
253
{
254
  struct varobj *var;
255
  struct varobj **childlist;
256
  struct varobj **cc;
257
  int numchild;
258
  char *type;
259
 
260
  if (argc != 1)
261
    error ("mi_cmd_var_list_children: Usage: NAME.");
262
 
263
  /* Get varobj handle, if a valid var obj name was specified */
264
  var = varobj_get_handle (argv[0]);
265
  if (var == NULL)
266
    error ("mi_cmd_var_list_children: Variable object not found");
267
 
268
  numchild = varobj_list_children (var, &childlist);
269
  ui_out_field_int (uiout, "numchild", numchild);
270
 
271
  if (numchild <= 0)
272
    return MI_CMD_DONE;
273
 
274
  ui_out_tuple_begin (uiout, "children");
275
  cc = childlist;
276
  while (*cc != NULL)
277
    {
278
      ui_out_tuple_begin (uiout, "child");
279
      ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
280
      ui_out_field_string (uiout, "exp", varobj_get_expression (*cc));
281
      ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc));
282
      type = varobj_get_type (*cc);
283
      /* C++ pseudo-variables (public, private, protected) do not have a type */
284
      if (type)
285
        ui_out_field_string (uiout, "type", varobj_get_type (*cc));
286
      ui_out_tuple_end (uiout);
287
      cc++;
288
    }
289
  ui_out_tuple_end (uiout);
290
  xfree (childlist);
291
  return MI_CMD_DONE;
292
}
293
 
294
enum mi_cmd_result
295
mi_cmd_var_info_type (char *command, char **argv, int argc)
296
{
297
  struct varobj *var;
298
 
299
  if (argc != 1)
300
    error ("mi_cmd_var_info_type: Usage: NAME.");
301
 
302
  /* Get varobj handle, if a valid var obj name was specified */
303
  var = varobj_get_handle (argv[0]);
304
  if (var == NULL)
305
    error ("mi_cmd_var_info_type: Variable object not found");
306
 
307
  ui_out_field_string (uiout, "type", varobj_get_type (var));
308
  return MI_CMD_DONE;
309
}
310
 
311
enum mi_cmd_result
312
mi_cmd_var_info_expression (char *command, char **argv, int argc)
313
{
314
  enum varobj_languages lang;
315
  struct varobj *var;
316
 
317
  if (argc != 1)
318
    error ("mi_cmd_var_info_expression: Usage: NAME.");
319
 
320
  /* Get varobj handle, if a valid var obj name was specified */
321
  var = varobj_get_handle (argv[0]);
322
  if (var == NULL)
323
    error ("mi_cmd_var_info_expression: Variable object not found");
324
 
325
  lang = varobj_get_language (var);
326
 
327
  ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]);
328
  ui_out_field_string (uiout, "exp", varobj_get_expression (var));
329
  return MI_CMD_DONE;
330
}
331
 
332
enum mi_cmd_result
333
mi_cmd_var_show_attributes (char *command, char **argv, int argc)
334
{
335
  int attr;
336
  char *attstr;
337
  struct varobj *var;
338
 
339
  if (argc != 1)
340
    error ("mi_cmd_var_show_attributes: Usage: NAME.");
341
 
342
  /* Get varobj handle, if a valid var obj name was specified */
343
  var = varobj_get_handle (argv[0]);
344
  if (var == NULL)
345
    error ("mi_cmd_var_show_attributes: Variable object not found");
346
 
347
  attr = varobj_get_attributes (var);
348
  /* FIXME: define masks for attributes */
349
  if (attr & 0x00000001)
350
    attstr = "editable";
351
  else
352
    attstr = "noneditable";
353
 
354
  ui_out_field_string (uiout, "attr", attstr);
355
  return MI_CMD_DONE;
356
}
357
 
358
enum mi_cmd_result
359
mi_cmd_var_evaluate_expression (char *command, char **argv, int argc)
360
{
361
  struct varobj *var;
362
 
363
  if (argc != 1)
364
    error ("mi_cmd_var_evaluate_expression: Usage: NAME.");
365
 
366
  /* Get varobj handle, if a valid var obj name was specified */
367
  var = varobj_get_handle (argv[0]);
368
  if (var == NULL)
369
    error ("mi_cmd_var_evaluate_expression: Variable object not found");
370
 
371
  ui_out_field_string (uiout, "value", varobj_get_value (var));
372
  return MI_CMD_DONE;
373
}
374
 
375
enum mi_cmd_result
376
mi_cmd_var_assign (char *command, char **argv, int argc)
377
{
378
  struct varobj *var;
379
  char *expression;
380
 
381
  if (argc != 2)
382
    error ("mi_cmd_var_assign: Usage: NAME EXPRESSION.");
383
 
384
  /* Get varobj handle, if a valid var obj name was specified */
385
  var = varobj_get_handle (argv[0]);
386
  if (var == NULL)
387
    error ("mi_cmd_var_assign: Variable object not found");
388
 
389
  /* FIXME: define masks for attributes */
390
  if (!(varobj_get_attributes (var) & 0x00000001))
391
    error ("mi_cmd_var_assign: Variable object is not editable");
392
 
393
  expression = xstrdup (argv[1]);
394
 
395
  if (!varobj_set_value (var, expression))
396
    error ("mi_cmd_var_assign: Could not assign expression to varible object");
397
 
398
  ui_out_field_string (uiout, "value", varobj_get_value (var));
399
  return MI_CMD_DONE;
400
}
401
 
402
enum mi_cmd_result
403
mi_cmd_var_update (char *command, char **argv, int argc)
404
{
405
  struct varobj *var;
406
  struct varobj **rootlist;
407
  struct varobj **cr;
408
  char *name;
409
  int nv;
410
 
411
  if (argc != 1)
412
    error ("mi_cmd_var_update: Usage: NAME.");
413
 
414
  name = argv[0];
415
 
416
  /* Check if the parameter is a "*" which means that we want
417
     to update all variables */
418
 
419
  if ((*name == '*') && (*(name + 1) == '\0'))
420
    {
421
      nv = varobj_list (&rootlist);
422
      ui_out_tuple_begin (uiout, "changelist");
423
      if (nv <= 0)
424
        {
425
          ui_out_tuple_end (uiout);
426
          return MI_CMD_DONE;
427
        }
428
      cr = rootlist;
429
      while (*cr != NULL)
430
        {
431
          varobj_update_one (*cr);
432
          cr++;
433
        }
434
      xfree (rootlist);
435
      ui_out_tuple_end (uiout);
436
    }
437
  else
438
    {
439
      /* Get varobj handle, if a valid var obj name was specified */
440
      var = varobj_get_handle (name);
441
      if (var == NULL)
442
        error ("mi_cmd_var_update: Variable object not found");
443
 
444
      ui_out_tuple_begin (uiout, "changelist");
445
      varobj_update_one (var);
446
      ui_out_tuple_end (uiout);
447
    }
448
    return MI_CMD_DONE;
449
}
450
 
451
/* Helper for mi_cmd_var_update() Returns 0 if the update for
452
   the variable fails (usually because the variable is out of
453
   scope), and 1 if it succeeds. */
454
 
455
static int
456
varobj_update_one (struct varobj *var)
457
{
458
  struct varobj **changelist;
459
  struct varobj **cc;
460
  int nc;
461
 
462
  nc = varobj_update (&var, &changelist);
463
 
464
  /* nc == 0 means that nothing has changed.
465
     nc == -1 means that an error occured in updating the variable.
466
     nc == -2 means the variable has changed type. */
467
 
468
  if (nc == 0)
469
    return 1;
470
  else if (nc == -1)
471
    {
472
      ui_out_field_string (uiout, "name", varobj_get_objname(var));
473
      ui_out_field_string (uiout, "in_scope", "false");
474
      return -1;
475
    }
476
  else if (nc == -2)
477
    {
478
      ui_out_field_string (uiout, "name", varobj_get_objname (var));
479
      ui_out_field_string (uiout, "in_scope", "true");
480
      ui_out_field_string (uiout, "new_type", varobj_get_type(var));
481
      ui_out_field_int (uiout, "new_num_children",
482
                           varobj_get_num_children(var));
483
    }
484
  else
485
    {
486
 
487
      cc = changelist;
488
      while (*cc != NULL)
489
        {
490
          ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
491
          ui_out_field_string (uiout, "in_scope", "true");
492
          ui_out_field_string (uiout, "type_changed", "false");
493
          cc++;
494
        }
495
      xfree (changelist);
496
      return 1;
497
    }
498
  return 1;
499
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.