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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [jv-valprint.c] - Blame information for rev 227

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

Line No. Rev Author Line
1 227 jeremybenn
/* Support for printing Java values for GDB, the GNU debugger.
2
 
3
   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007,
4
   2008, 2009, 2010 Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
 
21
#include "defs.h"
22
#include "symtab.h"
23
#include "gdbtypes.h"
24
#include "gdbcore.h"
25
#include "expression.h"
26
#include "value.h"
27
#include "demangle.h"
28
#include "valprint.h"
29
#include "language.h"
30
#include "jv-lang.h"
31
#include "c-lang.h"
32
#include "annotate.h"
33
#include "gdb_string.h"
34
 
35
/* Local functions */
36
 
37
int
38
java_value_print (struct value *val, struct ui_file *stream,
39
                  const struct value_print_options *options)
40
{
41
  struct gdbarch *gdbarch = get_type_arch (value_type (val));
42
  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
43
  struct type *type;
44
  CORE_ADDR address;
45
  int i;
46
  char *name;
47
  struct value_print_options opts;
48
 
49
  type = value_type (val);
50
  address = value_address (val);
51
 
52
  if (is_object_type (type))
53
    {
54
      CORE_ADDR obj_addr;
55
 
56
      /* Get the run-time type, and cast the object into that */
57
 
58
      obj_addr = unpack_pointer (type, value_contents (val));
59
 
60
      if (obj_addr != 0)
61
        {
62
          type = type_from_class (gdbarch, java_class_from_object (val));
63
          type = lookup_pointer_type (type);
64
 
65
          val = value_at (type, address);
66
        }
67
    }
68
 
69
  if (TYPE_CODE (type) == TYPE_CODE_PTR && !value_logical_not (val))
70
    type_print (TYPE_TARGET_TYPE (type), "", stream, -1);
71
 
72
  name = TYPE_TAG_NAME (type);
73
  if (TYPE_CODE (type) == TYPE_CODE_STRUCT && name != NULL
74
      && (i = strlen (name), name[i - 1] == ']'))
75
    {
76
      gdb_byte buf4[4];
77
      long length;
78
      unsigned int things_printed = 0;
79
      int reps;
80
      struct type *el_type
81
        = java_primitive_type_from_name (gdbarch, name, i - 2);
82
      i = 0;
83
      read_memory (address + get_java_object_header_size (gdbarch), buf4, 4);
84
 
85
      length = (long) extract_signed_integer (buf4, 4, byte_order);
86
      fprintf_filtered (stream, "{length: %ld", length);
87
 
88
      if (el_type == NULL)
89
        {
90
          CORE_ADDR element;
91
          CORE_ADDR next_element = -1; /* dummy initial value */
92
 
93
          /* Skip object header and length. */
94
          address += get_java_object_header_size (gdbarch) + 4;
95
 
96
          while (i < length && things_printed < options->print_max)
97
            {
98
              gdb_byte *buf;
99
 
100
              buf = alloca (gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT);
101
              fputs_filtered (", ", stream);
102
              wrap_here (n_spaces (2));
103
 
104
              if (i > 0)
105
                element = next_element;
106
              else
107
                {
108
                  read_memory (address, buf, sizeof (buf));
109
                  address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
110
                  /* FIXME: cagney/2003-05-24: Bogus or what.  It
111
                     pulls a host sized pointer out of the target and
112
                     then extracts that as an address (while assuming
113
                     that the address is unsigned)!  */
114
                  element = extract_unsigned_integer (buf, sizeof (buf),
115
                                                      byte_order);
116
                }
117
 
118
              for (reps = 1; i + reps < length; reps++)
119
                {
120
                  read_memory (address, buf, sizeof (buf));
121
                  address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
122
                  /* FIXME: cagney/2003-05-24: Bogus or what.  It
123
                     pulls a host sized pointer out of the target and
124
                     then extracts that as an address (while assuming
125
                     that the address is unsigned)!  */
126
                  next_element = extract_unsigned_integer (buf, sizeof (buf),
127
                                                           byte_order);
128
                  if (next_element != element)
129
                    break;
130
                }
131
 
132
              if (reps == 1)
133
                fprintf_filtered (stream, "%d: ", i);
134
              else
135
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
136
 
137
              if (element == 0)
138
                fprintf_filtered (stream, "null");
139
              else
140
                fprintf_filtered (stream, "@%s", paddress (gdbarch, element));
141
 
142
              things_printed++;
143
              i += reps;
144
            }
145
        }
146
      else
147
        {
148
          struct value *v = allocate_value (el_type);
149
          struct value *next_v = allocate_value (el_type);
150
 
151
          set_value_address (v, (address
152
                                 + get_java_object_header_size (gdbarch) + 4));
153
          set_value_address (next_v, value_raw_address (v));
154
 
155
          while (i < length && things_printed < options->print_max)
156
            {
157
              fputs_filtered (", ", stream);
158
              wrap_here (n_spaces (2));
159
 
160
              if (i > 0)
161
                {
162
                  struct value *tmp;
163
 
164
                  tmp = next_v;
165
                  next_v = v;
166
                  v = tmp;
167
                }
168
              else
169
                {
170
                  set_value_lazy (v, 1);
171
                  set_value_offset (v, 0);
172
                }
173
 
174
              set_value_offset (next_v, value_offset (v));
175
 
176
              for (reps = 1; i + reps < length; reps++)
177
                {
178
                  set_value_lazy (next_v, 1);
179
                  set_value_offset (next_v, value_offset (next_v) + TYPE_LENGTH (el_type));
180
                  if (memcmp (value_contents (v), value_contents (next_v),
181
                              TYPE_LENGTH (el_type)) != 0)
182
                    break;
183
                }
184
 
185
              if (reps == 1)
186
                fprintf_filtered (stream, "%d: ", i);
187
              else
188
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
189
 
190
              opts = *options;
191
              opts.deref_ref = 1;
192
              common_val_print (v, stream, 1, &opts, current_language);
193
 
194
              things_printed++;
195
              i += reps;
196
            }
197
        }
198
 
199
      if (i < length)
200
        fprintf_filtered (stream, "...");
201
 
202
      fprintf_filtered (stream, "}");
203
 
204
      return 0;
205
    }
206
 
207
  /* If it's type String, print it */
208
 
209
  if (TYPE_CODE (type) == TYPE_CODE_PTR
210
      && TYPE_TARGET_TYPE (type)
211
      && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
212
      && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
213
                 "java.lang.String") == 0
214
      && (options->format == 0 || options->format == 's')
215
      && address != 0
216
      && value_as_address (val) != 0)
217
    {
218
      struct type *char_type;
219
      struct value *data_val;
220
      CORE_ADDR data;
221
      struct value *boffset_val;
222
      unsigned long boffset;
223
      struct value *count_val;
224
      unsigned long count;
225
      struct value *mark;
226
 
227
      mark = value_mark ();     /* Remember start of new values */
228
 
229
      data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
230
      data = value_as_address (data_val);
231
 
232
      boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
233
      boffset = value_as_address (boffset_val);
234
 
235
      count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
236
      count = value_as_address (count_val);
237
 
238
      value_free_to_mark (mark);        /* Release unnecessary values */
239
 
240
      char_type = builtin_java_type (gdbarch)->builtin_char;
241
      val_print_string (char_type, data + boffset, count, stream, options);
242
 
243
      return 0;
244
    }
245
 
246
  opts = *options;
247
  opts.deref_ref = 1;
248
  return common_val_print (val, stream, 0, &opts, current_language);
249
}
250
 
251
/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
252
   same meanings as in cp_print_value and c_val_print.
253
 
254
   DONT_PRINT is an array of baseclass types that we
255
   should not print, or zero if called from top level.  */
256
 
257
static void
258
java_print_value_fields (struct type *type, const gdb_byte *valaddr,
259
                         CORE_ADDR address, struct ui_file *stream,
260
                         int recurse,
261
                         const struct value_print_options *options)
262
{
263
  int i, len, n_baseclasses;
264
 
265
  CHECK_TYPEDEF (type);
266
 
267
  fprintf_filtered (stream, "{");
268
  len = TYPE_NFIELDS (type);
269
  n_baseclasses = TYPE_N_BASECLASSES (type);
270
 
271
  if (n_baseclasses > 0)
272
    {
273
      int i, n_baseclasses = TYPE_N_BASECLASSES (type);
274
 
275
      for (i = 0; i < n_baseclasses; i++)
276
        {
277
          int boffset;
278
          struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
279
          char *basename = TYPE_NAME (baseclass);
280
          const gdb_byte *base_valaddr;
281
 
282
          if (BASETYPE_VIA_VIRTUAL (type, i))
283
            continue;
284
 
285
          if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
286
            continue;
287
 
288
          boffset = 0;
289
 
290
          if (options->pretty)
291
            {
292
              fprintf_filtered (stream, "\n");
293
              print_spaces_filtered (2 * (recurse + 1), stream);
294
            }
295
          fputs_filtered ("<", stream);
296
          /* Not sure what the best notation is in the case where there is no
297
             baseclass name.  */
298
          fputs_filtered (basename ? basename : "", stream);
299
          fputs_filtered ("> = ", stream);
300
 
301
          base_valaddr = valaddr;
302
 
303
          java_print_value_fields (baseclass, base_valaddr, address + boffset,
304
                                   stream, recurse + 1, options);
305
          fputs_filtered (", ", stream);
306
        }
307
 
308
    }
309
 
310
  if (!len && n_baseclasses == 1)
311
    fprintf_filtered (stream, "<No data fields>");
312
  else
313
    {
314
      int fields_seen = 0;
315
 
316
      for (i = n_baseclasses; i < len; i++)
317
        {
318
          /* If requested, skip printing of static fields.  */
319
          if (field_is_static (&TYPE_FIELD (type, i)))
320
            {
321
              char *name = TYPE_FIELD_NAME (type, i);
322
              if (!options->static_field_print)
323
                continue;
324
              if (name != NULL && strcmp (name, "class") == 0)
325
                continue;
326
            }
327
          if (fields_seen)
328
            fprintf_filtered (stream, ", ");
329
          else if (n_baseclasses > 0)
330
            {
331
              if (options->pretty)
332
                {
333
                  fprintf_filtered (stream, "\n");
334
                  print_spaces_filtered (2 + 2 * recurse, stream);
335
                  fputs_filtered ("members of ", stream);
336
                  fputs_filtered (type_name_no_tag (type), stream);
337
                  fputs_filtered (": ", stream);
338
                }
339
            }
340
          fields_seen = 1;
341
 
342
          if (options->pretty)
343
            {
344
              fprintf_filtered (stream, "\n");
345
              print_spaces_filtered (2 + 2 * recurse, stream);
346
            }
347
          else
348
            {
349
              wrap_here (n_spaces (2 + 2 * recurse));
350
            }
351
          if (options->inspect_it)
352
            {
353
              if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
354
                fputs_filtered ("\"( ptr \"", stream);
355
              else
356
                fputs_filtered ("\"( nodef \"", stream);
357
              if (field_is_static (&TYPE_FIELD (type, i)))
358
                fputs_filtered ("static ", stream);
359
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
360
                                       language_cplus,
361
                                       DMGL_PARAMS | DMGL_ANSI);
362
              fputs_filtered ("\" \"", stream);
363
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
364
                                       language_cplus,
365
                                       DMGL_PARAMS | DMGL_ANSI);
366
              fputs_filtered ("\") \"", stream);
367
            }
368
          else
369
            {
370
              annotate_field_begin (TYPE_FIELD_TYPE (type, i));
371
 
372
              if (field_is_static (&TYPE_FIELD (type, i)))
373
                fputs_filtered ("static ", stream);
374
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
375
                                       language_cplus,
376
                                       DMGL_PARAMS | DMGL_ANSI);
377
              annotate_field_name_end ();
378
              fputs_filtered (": ", stream);
379
              annotate_field_value ();
380
            }
381
 
382
          if (!field_is_static (&TYPE_FIELD (type, i))
383
              && TYPE_FIELD_PACKED (type, i))
384
            {
385
              struct value *v;
386
 
387
              /* Bitfields require special handling, especially due to byte
388
                 order problems.  */
389
              if (TYPE_FIELD_IGNORE (type, i))
390
                {
391
                  fputs_filtered ("<optimized out or zero length>", stream);
392
                }
393
              else
394
                {
395
                  struct value_print_options opts;
396
 
397
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
398
                                   unpack_field_as_long (type, valaddr, i));
399
 
400
                  opts = *options;
401
                  opts.deref_ref = 0;
402
                  common_val_print (v, stream, recurse + 1,
403
                                    &opts, current_language);
404
                }
405
            }
406
          else
407
            {
408
              if (TYPE_FIELD_IGNORE (type, i))
409
                {
410
                  fputs_filtered ("<optimized out or zero length>", stream);
411
                }
412
              else if (field_is_static (&TYPE_FIELD (type, i)))
413
                {
414
                  struct value *v = value_static_field (type, i);
415
                  if (v == NULL)
416
                    fputs_filtered ("<optimized out>", stream);
417
                  else
418
                    {
419
                      struct value_print_options opts;
420
                      struct type *t = check_typedef (value_type (v));
421
                      if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
422
                        v = value_addr (v);
423
                      opts = *options;
424
                      opts.deref_ref = 0;
425
                      common_val_print (v, stream, recurse + 1,
426
                                        &opts, current_language);
427
                    }
428
                }
429
              else if (TYPE_FIELD_TYPE (type, i) == NULL)
430
                fputs_filtered ("<unknown type>", stream);
431
              else
432
                {
433
                  struct value_print_options opts = *options;
434
                  opts.deref_ref = 0;
435
                  val_print (TYPE_FIELD_TYPE (type, i),
436
                             valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
437
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
438
                             stream, recurse + 1, &opts,
439
                             current_language);
440
                }
441
            }
442
          annotate_field_end ();
443
        }
444
 
445
      if (options->pretty)
446
        {
447
          fprintf_filtered (stream, "\n");
448
          print_spaces_filtered (2 * recurse, stream);
449
        }
450
    }
451
  fprintf_filtered (stream, "}");
452
}
453
 
454
/* Print data of type TYPE located at VALADDR (within GDB), which came from
455
   the inferior at address ADDRESS, onto stdio stream STREAM according to
456
   OPTIONS.  The data at VALADDR is in target byte order.
457
 
458
   If the data are a string pointer, returns the number of string characters
459
   printed.  */
460
 
461
int
462
java_val_print (struct type *type, const gdb_byte *valaddr,
463
                int embedded_offset, CORE_ADDR address,
464
                struct ui_file *stream, int recurse,
465
                const struct value_print_options *options)
466
{
467
  struct gdbarch *gdbarch = get_type_arch (type);
468
  unsigned int i = 0;    /* Number of characters printed */
469
  struct type *target_type;
470
  CORE_ADDR addr;
471
 
472
  CHECK_TYPEDEF (type);
473
  switch (TYPE_CODE (type))
474
    {
475
    case TYPE_CODE_PTR:
476
      if (options->format && options->format != 's')
477
        {
478
          print_scalar_formatted (valaddr, type, options, 0, stream);
479
          break;
480
        }
481
#if 0
482
      if (options->vtblprint && cp_is_vtbl_ptr_type (type))
483
        {
484
          /* Print the unmangled name if desired.  */
485
          /* Print vtable entry - we only get here if we ARE using
486
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_STRUCT.) */
487
          /* Extract an address, assume that it is unsigned.  */
488
          print_address_demangle (gdbarch,
489
                                  extract_unsigned_integer (valaddr, TYPE_LENGTH (type)),
490
                                  stream, demangle);
491
          break;
492
        }
493
#endif
494
      addr = unpack_pointer (type, valaddr);
495
      if (addr == 0)
496
        {
497
          fputs_filtered ("null", stream);
498
          return i;
499
        }
500
      target_type = check_typedef (TYPE_TARGET_TYPE (type));
501
 
502
      if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
503
        {
504
          /* Try to print what function it points to.  */
505
          print_address_demangle (gdbarch, addr, stream, demangle);
506
          /* Return value is irrelevant except for string pointers.  */
507
          return (0);
508
        }
509
 
510
      if (options->addressprint && options->format != 's')
511
        {
512
          fputs_filtered ("@", stream);
513
          print_longest (stream, 'x', 0, (ULONGEST) addr);
514
        }
515
 
516
      return i;
517
 
518
    case TYPE_CODE_CHAR:
519
    case TYPE_CODE_INT:
520
      /* Can't just call c_val_print because that prints bytes as C
521
         chars.  */
522
      if (options->format || options->output_format)
523
        {
524
          struct value_print_options opts = *options;
525
          opts.format = (options->format ? options->format
526
                         : options->output_format);
527
          print_scalar_formatted (valaddr, type, &opts, 0, stream);
528
        }
529
      else if (TYPE_CODE (type) == TYPE_CODE_CHAR
530
               || (TYPE_CODE (type) == TYPE_CODE_INT
531
                   && TYPE_LENGTH (type) == 2
532
                   && strcmp (TYPE_NAME (type), "char") == 0))
533
        LA_PRINT_CHAR ((int) unpack_long (type, valaddr), type, stream);
534
      else
535
        val_print_type_code_int (type, valaddr, stream);
536
      break;
537
 
538
    case TYPE_CODE_STRUCT:
539
      java_print_value_fields (type, valaddr, address, stream, recurse,
540
                               options);
541
      break;
542
 
543
    default:
544
      return c_val_print (type, valaddr, embedded_offset, address, stream,
545
                          recurse, options);
546
    }
547
 
548
  return 0;
549
}

powered by: WebSVN 2.1.0

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