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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [gdb/] [jv-valprint.c] - Blame information for rev 330

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 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
 
83
      i = 0;
84
      read_memory (address + get_java_object_header_size (gdbarch), buf4, 4);
85
 
86
      length = (long) extract_signed_integer (buf4, 4, byte_order);
87
      fprintf_filtered (stream, "{length: %ld", length);
88
 
89
      if (el_type == NULL)
90
        {
91
          CORE_ADDR element;
92
          CORE_ADDR next_element = -1; /* dummy initial value */
93
 
94
          /* Skip object header and length. */
95
          address += get_java_object_header_size (gdbarch) + 4;
96
 
97
          while (i < length && things_printed < options->print_max)
98
            {
99
              gdb_byte *buf;
100
 
101
              buf = alloca (gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT);
102
              fputs_filtered (", ", stream);
103
              wrap_here (n_spaces (2));
104
 
105
              if (i > 0)
106
                element = next_element;
107
              else
108
                {
109
                  read_memory (address, buf, sizeof (buf));
110
                  address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
111
                  /* FIXME: cagney/2003-05-24: Bogus or what.  It
112
                     pulls a host sized pointer out of the target and
113
                     then extracts that as an address (while assuming
114
                     that the address is unsigned)!  */
115
                  element = extract_unsigned_integer (buf, sizeof (buf),
116
                                                      byte_order);
117
                }
118
 
119
              for (reps = 1; i + reps < length; reps++)
120
                {
121
                  read_memory (address, buf, sizeof (buf));
122
                  address += gdbarch_ptr_bit (gdbarch) / HOST_CHAR_BIT;
123
                  /* FIXME: cagney/2003-05-24: Bogus or what.  It
124
                     pulls a host sized pointer out of the target and
125
                     then extracts that as an address (while assuming
126
                     that the address is unsigned)!  */
127
                  next_element = extract_unsigned_integer (buf, sizeof (buf),
128
                                                           byte_order);
129
                  if (next_element != element)
130
                    break;
131
                }
132
 
133
              if (reps == 1)
134
                fprintf_filtered (stream, "%d: ", i);
135
              else
136
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
137
 
138
              if (element == 0)
139
                fprintf_filtered (stream, "null");
140
              else
141
                fprintf_filtered (stream, "@%s", paddress (gdbarch, element));
142
 
143
              things_printed++;
144
              i += reps;
145
            }
146
        }
147
      else
148
        {
149
          struct value *v = allocate_value (el_type);
150
          struct value *next_v = allocate_value (el_type);
151
 
152
          set_value_address (v, (address
153
                                 + get_java_object_header_size (gdbarch) + 4));
154
          set_value_address (next_v, value_raw_address (v));
155
 
156
          while (i < length && things_printed < options->print_max)
157
            {
158
              fputs_filtered (", ", stream);
159
              wrap_here (n_spaces (2));
160
 
161
              if (i > 0)
162
                {
163
                  struct value *tmp;
164
 
165
                  tmp = next_v;
166
                  next_v = v;
167
                  v = tmp;
168
                }
169
              else
170
                {
171
                  set_value_lazy (v, 1);
172
                  set_value_offset (v, 0);
173
                }
174
 
175
              set_value_offset (next_v, value_offset (v));
176
 
177
              for (reps = 1; i + reps < length; reps++)
178
                {
179
                  set_value_lazy (next_v, 1);
180
                  set_value_offset (next_v, value_offset (next_v) + TYPE_LENGTH (el_type));
181
                  if (memcmp (value_contents (v), value_contents (next_v),
182
                              TYPE_LENGTH (el_type)) != 0)
183
                    break;
184
                }
185
 
186
              if (reps == 1)
187
                fprintf_filtered (stream, "%d: ", i);
188
              else
189
                fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1);
190
 
191
              opts = *options;
192
              opts.deref_ref = 1;
193
              common_val_print (v, stream, 1, &opts, current_language);
194
 
195
              things_printed++;
196
              i += reps;
197
            }
198
        }
199
 
200
      if (i < length)
201
        fprintf_filtered (stream, "...");
202
 
203
      fprintf_filtered (stream, "}");
204
 
205
      return 0;
206
    }
207
 
208
  /* If it's type String, print it */
209
 
210
  if (TYPE_CODE (type) == TYPE_CODE_PTR
211
      && TYPE_TARGET_TYPE (type)
212
      && TYPE_TAG_NAME (TYPE_TARGET_TYPE (type))
213
      && strcmp (TYPE_TAG_NAME (TYPE_TARGET_TYPE (type)),
214
                 "java.lang.String") == 0
215
      && (options->format == 0 || options->format == 's')
216
      && address != 0
217
      && value_as_address (val) != 0)
218
    {
219
      struct type *char_type;
220
      struct value *data_val;
221
      CORE_ADDR data;
222
      struct value *boffset_val;
223
      unsigned long boffset;
224
      struct value *count_val;
225
      unsigned long count;
226
      struct value *mark;
227
 
228
      mark = value_mark ();     /* Remember start of new values */
229
 
230
      data_val = value_struct_elt (&val, NULL, "data", NULL, NULL);
231
      data = value_as_address (data_val);
232
 
233
      boffset_val = value_struct_elt (&val, NULL, "boffset", NULL, NULL);
234
      boffset = value_as_address (boffset_val);
235
 
236
      count_val = value_struct_elt (&val, NULL, "count", NULL, NULL);
237
      count = value_as_address (count_val);
238
 
239
      value_free_to_mark (mark);        /* Release unnecessary values */
240
 
241
      char_type = builtin_java_type (gdbarch)->builtin_char;
242
      val_print_string (char_type, data + boffset, count, stream, options);
243
 
244
      return 0;
245
    }
246
 
247
  opts = *options;
248
  opts.deref_ref = 1;
249
  return common_val_print (val, stream, 0, &opts, current_language);
250
}
251
 
252
/* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and OPTIONS have the
253
   same meanings as in cp_print_value and c_val_print.
254
 
255
   DONT_PRINT is an array of baseclass types that we
256
   should not print, or zero if called from top level.  */
257
 
258
static void
259
java_print_value_fields (struct type *type, const gdb_byte *valaddr,
260
                         CORE_ADDR address, struct ui_file *stream,
261
                         int recurse,
262
                         const struct value *val,
263
                         const struct value_print_options *options)
264
{
265
  int i, len, n_baseclasses;
266
 
267
  CHECK_TYPEDEF (type);
268
 
269
  fprintf_filtered (stream, "{");
270
  len = TYPE_NFIELDS (type);
271
  n_baseclasses = TYPE_N_BASECLASSES (type);
272
 
273
  if (n_baseclasses > 0)
274
    {
275
      int i, n_baseclasses = TYPE_N_BASECLASSES (type);
276
 
277
      for (i = 0; i < n_baseclasses; i++)
278
        {
279
          int boffset;
280
          struct type *baseclass = check_typedef (TYPE_BASECLASS (type, i));
281
          char *basename = TYPE_NAME (baseclass);
282
          const gdb_byte *base_valaddr;
283
 
284
          if (BASETYPE_VIA_VIRTUAL (type, i))
285
            continue;
286
 
287
          if (basename != NULL && strcmp (basename, "java.lang.Object") == 0)
288
            continue;
289
 
290
          boffset = 0;
291
 
292
          if (options->pretty)
293
            {
294
              fprintf_filtered (stream, "\n");
295
              print_spaces_filtered (2 * (recurse + 1), stream);
296
            }
297
          fputs_filtered ("<", stream);
298
          /* Not sure what the best notation is in the case where there is no
299
             baseclass name.  */
300
          fputs_filtered (basename ? basename : "", stream);
301
          fputs_filtered ("> = ", stream);
302
 
303
          base_valaddr = valaddr;
304
 
305
          java_print_value_fields (baseclass, base_valaddr, address + boffset,
306
                                   stream, recurse + 1, val, options);
307
          fputs_filtered (", ", stream);
308
        }
309
 
310
    }
311
 
312
  if (!len && n_baseclasses == 1)
313
    fprintf_filtered (stream, "<No data fields>");
314
  else
315
    {
316
      int fields_seen = 0;
317
 
318
      for (i = n_baseclasses; i < len; i++)
319
        {
320
          /* If requested, skip printing of static fields.  */
321
          if (field_is_static (&TYPE_FIELD (type, i)))
322
            {
323
              char *name = TYPE_FIELD_NAME (type, i);
324
 
325
              if (!options->static_field_print)
326
                continue;
327
              if (name != NULL && strcmp (name, "class") == 0)
328
                continue;
329
            }
330
          if (fields_seen)
331
            fprintf_filtered (stream, ", ");
332
          else if (n_baseclasses > 0)
333
            {
334
              if (options->pretty)
335
                {
336
                  fprintf_filtered (stream, "\n");
337
                  print_spaces_filtered (2 + 2 * recurse, stream);
338
                  fputs_filtered ("members of ", stream);
339
                  fputs_filtered (type_name_no_tag (type), stream);
340
                  fputs_filtered (": ", stream);
341
                }
342
            }
343
          fields_seen = 1;
344
 
345
          if (options->pretty)
346
            {
347
              fprintf_filtered (stream, "\n");
348
              print_spaces_filtered (2 + 2 * recurse, stream);
349
            }
350
          else
351
            {
352
              wrap_here (n_spaces (2 + 2 * recurse));
353
            }
354
          if (options->inspect_it)
355
            {
356
              if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
357
                fputs_filtered ("\"( ptr \"", stream);
358
              else
359
                fputs_filtered ("\"( nodef \"", stream);
360
              if (field_is_static (&TYPE_FIELD (type, i)))
361
                fputs_filtered ("static ", stream);
362
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
363
                                       language_cplus,
364
                                       DMGL_PARAMS | DMGL_ANSI);
365
              fputs_filtered ("\" \"", stream);
366
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
367
                                       language_cplus,
368
                                       DMGL_PARAMS | DMGL_ANSI);
369
              fputs_filtered ("\") \"", stream);
370
            }
371
          else
372
            {
373
              annotate_field_begin (TYPE_FIELD_TYPE (type, i));
374
 
375
              if (field_is_static (&TYPE_FIELD (type, i)))
376
                fputs_filtered ("static ", stream);
377
              fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
378
                                       language_cplus,
379
                                       DMGL_PARAMS | DMGL_ANSI);
380
              annotate_field_name_end ();
381
              fputs_filtered (": ", stream);
382
              annotate_field_value ();
383
            }
384
 
385
          if (!field_is_static (&TYPE_FIELD (type, i))
386
              && TYPE_FIELD_PACKED (type, i))
387
            {
388
              struct value *v;
389
 
390
              /* Bitfields require special handling, especially due to byte
391
                 order problems.  */
392
              if (TYPE_FIELD_IGNORE (type, i))
393
                {
394
                  fputs_filtered ("<optimized out or zero length>", stream);
395
                }
396
              else if (!value_bits_valid (val, TYPE_FIELD_BITPOS (type, i),
397
                                          TYPE_FIELD_BITSIZE (type, i)))
398
                {
399
                  fputs_filtered (_("<value optimized out>"), stream);
400
                }
401
              else
402
                {
403
                  struct value_print_options opts;
404
 
405
                  v = value_from_longest (TYPE_FIELD_TYPE (type, i),
406
                                   unpack_field_as_long (type, valaddr, i));
407
 
408
                  opts = *options;
409
                  opts.deref_ref = 0;
410
                  common_val_print (v, stream, recurse + 1,
411
                                    &opts, current_language);
412
                }
413
            }
414
          else
415
            {
416
              if (TYPE_FIELD_IGNORE (type, i))
417
                {
418
                  fputs_filtered ("<optimized out or zero length>", stream);
419
                }
420
              else if (field_is_static (&TYPE_FIELD (type, i)))
421
                {
422
                  struct value *v = value_static_field (type, i);
423
 
424
                  if (v == NULL)
425
                    fputs_filtered ("<optimized out>", stream);
426
                  else
427
                    {
428
                      struct value_print_options opts;
429
                      struct type *t = check_typedef (value_type (v));
430
 
431
                      if (TYPE_CODE (t) == TYPE_CODE_STRUCT)
432
                        v = value_addr (v);
433
                      opts = *options;
434
                      opts.deref_ref = 0;
435
                      common_val_print (v, stream, recurse + 1,
436
                                        &opts, current_language);
437
                    }
438
                }
439
              else if (TYPE_FIELD_TYPE (type, i) == NULL)
440
                fputs_filtered ("<unknown type>", stream);
441
              else
442
                {
443
                  struct value_print_options opts = *options;
444
 
445
                  opts.deref_ref = 0;
446
                  val_print (TYPE_FIELD_TYPE (type, i),
447
                             valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0,
448
                             address + TYPE_FIELD_BITPOS (type, i) / 8,
449
                             stream, recurse + 1, val, &opts,
450
                             current_language);
451
                }
452
            }
453
          annotate_field_end ();
454
        }
455
 
456
      if (options->pretty)
457
        {
458
          fprintf_filtered (stream, "\n");
459
          print_spaces_filtered (2 * recurse, stream);
460
        }
461
    }
462
  fprintf_filtered (stream, "}");
463
}
464
 
465
/* Print data of type TYPE located at VALADDR (within GDB), which came from
466
   the inferior at address ADDRESS, onto stdio stream STREAM according to
467
   OPTIONS.  The data at VALADDR is in target byte order.
468
 
469
   If the data are a string pointer, returns the number of string characters
470
   printed.  */
471
 
472
int
473
java_val_print (struct type *type, const gdb_byte *valaddr,
474
                int embedded_offset, CORE_ADDR address,
475
                struct ui_file *stream, int recurse,
476
                const struct value *val,
477
                const struct value_print_options *options)
478
{
479
  struct gdbarch *gdbarch = get_type_arch (type);
480
  unsigned int i = 0;    /* Number of characters printed */
481
  struct type *target_type;
482
  CORE_ADDR addr;
483
 
484
  CHECK_TYPEDEF (type);
485
  switch (TYPE_CODE (type))
486
    {
487
    case TYPE_CODE_PTR:
488
      if (options->format && options->format != 's')
489
        {
490
          print_scalar_formatted (valaddr, type, options, 0, stream);
491
          break;
492
        }
493
#if 0
494
      if (options->vtblprint && cp_is_vtbl_ptr_type (type))
495
        {
496
          /* Print the unmangled name if desired.  */
497
          /* Print vtable entry - we only get here if we ARE using
498
             -fvtable_thunks.  (Otherwise, look under TYPE_CODE_STRUCT.) */
499
          /* Extract an address, assume that it is unsigned.  */
500
          print_address_demangle (gdbarch,
501
                                  extract_unsigned_integer (valaddr, TYPE_LENGTH (type)),
502
                                  stream, demangle);
503
          break;
504
        }
505
#endif
506
      addr = unpack_pointer (type, valaddr);
507
      if (addr == 0)
508
        {
509
          fputs_filtered ("null", stream);
510
          return i;
511
        }
512
      target_type = check_typedef (TYPE_TARGET_TYPE (type));
513
 
514
      if (TYPE_CODE (target_type) == TYPE_CODE_FUNC)
515
        {
516
          /* Try to print what function it points to.  */
517
          print_address_demangle (gdbarch, addr, stream, demangle);
518
          /* Return value is irrelevant except for string pointers.  */
519
          return (0);
520
        }
521
 
522
      if (options->addressprint && options->format != 's')
523
        {
524
          fputs_filtered ("@", stream);
525
          print_longest (stream, 'x', 0, (ULONGEST) addr);
526
        }
527
 
528
      return i;
529
 
530
    case TYPE_CODE_CHAR:
531
    case TYPE_CODE_INT:
532
      /* Can't just call c_val_print because that prints bytes as C
533
         chars.  */
534
      if (options->format || options->output_format)
535
        {
536
          struct value_print_options opts = *options;
537
 
538
          opts.format = (options->format ? options->format
539
                         : options->output_format);
540
          print_scalar_formatted (valaddr, type, &opts, 0, stream);
541
        }
542
      else if (TYPE_CODE (type) == TYPE_CODE_CHAR
543
               || (TYPE_CODE (type) == TYPE_CODE_INT
544
                   && TYPE_LENGTH (type) == 2
545
                   && strcmp (TYPE_NAME (type), "char") == 0))
546
        LA_PRINT_CHAR ((int) unpack_long (type, valaddr), type, stream);
547
      else
548
        val_print_type_code_int (type, valaddr, stream);
549
      break;
550
 
551
    case TYPE_CODE_STRUCT:
552
      java_print_value_fields (type, valaddr, address, stream, recurse,
553
                               val, options);
554
      break;
555
 
556
    default:
557
      return c_val_print (type, valaddr, embedded_offset, address, stream,
558
                          recurse, val, options);
559
    }
560
 
561
  return 0;
562
}

powered by: WebSVN 2.1.0

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