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

Subversion Repositories openrisc

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

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

Line No. Rev Author Line
1 227 jeremybenn
/* Scheme/Guile language support routines for GDB, the GNU debugger.
2
 
3
   Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2005, 2007, 2008, 2009,
4
   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 "expression.h"
25
#include "parser-defs.h"
26
#include "language.h"
27
#include "value.h"
28
#include "scm-lang.h"
29
#include "valprint.h"
30
#include "gdbcore.h"
31
#include "c-lang.h"
32
#include "infcall.h"
33
#include "objfiles.h"
34
 
35
static void scm_ipruk (char *, struct type *, LONGEST, struct ui_file *);
36
static void scm_scmval_print (struct type *, LONGEST, struct ui_file *,
37
                              int, const struct value_print_options *);
38
static void scm_scmlist_print (struct type *, LONGEST, struct ui_file *,
39
                               int, const struct value_print_options *);
40
static int scm_inferior_print (struct type *, LONGEST, struct ui_file *,
41
                               int, const struct value_print_options *);
42
 
43
/* Prints the SCM value VALUE by invoking the inferior, if appropraite.
44
   Returns >= 0 on success;  return -1 if the inferior cannot/should not
45
   print VALUE. */
46
 
47
static int
48
scm_inferior_print (struct type *type, LONGEST value, struct ui_file *stream,
49
                    int recurse, const struct value_print_options *options)
50
{
51
  struct value *func, *arg, *result;
52
  struct symbol *gdb_output_sym, *gdb_output_len_sym;
53
  char *output;
54
  int ret, output_len;
55
 
56
  func = find_function_in_inferior ("gdb_print", NULL);
57
  arg = value_from_longest (type, value);
58
 
59
  result = call_function_by_hand (func, 1, &arg);
60
  ret = (int) value_as_long (result);
61
  if (ret == 0)
62
    {
63
      /* XXX: Should we cache these symbols?  */
64
      gdb_output_sym =
65
        lookup_symbol_global ("gdb_output", NULL, NULL, VAR_DOMAIN);
66
      gdb_output_len_sym =
67
        lookup_symbol_global ("gdb_output_length", NULL, NULL, VAR_DOMAIN);
68
 
69
      if ((gdb_output_sym == NULL) || (gdb_output_len_sym == NULL))
70
        ret = -1;
71
      else
72
        {
73
          struct value *remote_buffer;
74
 
75
          read_memory (SYMBOL_VALUE_ADDRESS (gdb_output_len_sym),
76
                       (char *) &output_len, sizeof (output_len));
77
 
78
          output = (char *) alloca (output_len);
79
          remote_buffer = value_at (type,
80
                                    SYMBOL_VALUE_ADDRESS (gdb_output_sym));
81
          read_memory (value_as_address (remote_buffer),
82
                       output, output_len);
83
 
84
          ui_file_write (stream, output, output_len);
85
        }
86
    }
87
 
88
  return ret;
89
}
90
 
91
/* {Names of immediate symbols}
92
 * This table must agree with the declarations in scm.h: {Immediate Symbols}.*/
93
 
94
static char *scm_isymnames[] =
95
{
96
  /* This table must agree with the declarations */
97
  "and",
98
  "begin",
99
  "case",
100
  "cond",
101
  "do",
102
  "if",
103
  "lambda",
104
  "let",
105
  "let*",
106
  "letrec",
107
  "or",
108
  "quote",
109
  "set!",
110
  "define",
111
#if 0
112
  "literal-variable-ref",
113
  "literal-variable-set!",
114
#endif
115
  "apply",
116
  "call-with-current-continuation",
117
 
118
 /* user visible ISYMS */
119
 /* other keywords */
120
 /* Flags */
121
 
122
  "#f",
123
  "#t",
124
  "#<undefined>",
125
  "#<eof>",
126
  "()",
127
  "#<unspecified>"
128
};
129
 
130
static void
131
scm_scmlist_print (struct type *type, LONGEST svalue,
132
                   struct ui_file *stream, int recurse,
133
                   const struct value_print_options *options)
134
{
135
#define SCM_SIZE (TYPE_LENGTH (type))
136
#define SCM_BYTE_ORDER (gdbarch_byte_order (get_type_arch (type)))
137
  unsigned int more = options->print_max;
138
  if (recurse > 6)
139
    {
140
      fputs_filtered ("...", stream);
141
      return;
142
    }
143
  scm_scmval_print (type, SCM_CAR (svalue), stream, recurse + 1, options);
144
  svalue = SCM_CDR (svalue);
145
  for (; SCM_NIMP (svalue); svalue = SCM_CDR (svalue))
146
    {
147
      if (SCM_NECONSP (svalue))
148
        break;
149
      fputs_filtered (" ", stream);
150
      if (--more == 0)
151
        {
152
          fputs_filtered ("...", stream);
153
          return;
154
        }
155
      scm_scmval_print (type, SCM_CAR (svalue), stream, recurse + 1, options);
156
    }
157
  if (SCM_NNULLP (svalue))
158
    {
159
      fputs_filtered (" . ", stream);
160
      scm_scmval_print (type, svalue, stream, recurse + 1, options);
161
    }
162
#undef SCM_BYTE_ORDER
163
#undef SCM_SIZE
164
}
165
 
166
static void
167
scm_ipruk (char *hdr, struct type *type, LONGEST ptr,
168
           struct ui_file *stream)
169
{
170
#define SCM_SIZE (TYPE_LENGTH (type))
171
#define SCM_BYTE_ORDER (gdbarch_byte_order (get_type_arch (type)))
172
  fprintf_filtered (stream, "#<unknown-%s", hdr);
173
  if (SCM_CELLP (ptr))
174
    fprintf_filtered (stream, " (0x%lx . 0x%lx) @",
175
                      (long) SCM_CAR (ptr), (long) SCM_CDR (ptr));
176
  fprintf_filtered (stream, " 0x%s>", phex_nz (ptr, SCM_SIZE));
177
#undef SCM_BYTE_ORDER
178
#undef SCM_SIZE
179
}
180
 
181
static void
182
scm_scmval_print (struct type *type, LONGEST svalue,
183
                  struct ui_file *stream, int recurse,
184
                  const struct value_print_options *options)
185
{
186
  struct gdbarch *gdbarch = get_type_arch (type);
187
 
188
#define SCM_SIZE (TYPE_LENGTH (type))
189
#define SCM_BYTE_ORDER (gdbarch_byte_order (gdbarch))
190
taloop:
191
  switch (7 & (int) svalue)
192
    {
193
    case 2:
194
    case 6:
195
      print_longest (stream,
196
                     options->format ? options->format : 'd',
197
                     1, svalue >> 2);
198
      break;
199
    case 4:
200
      if (SCM_ICHRP (svalue))
201
        {
202
          svalue = SCM_ICHR (svalue);
203
          scm_printchar (svalue, builtin_type (gdbarch)->builtin_char,
204
                         stream);
205
          break;
206
        }
207
      else if (SCM_IFLAGP (svalue)
208
               && (SCM_ISYMNUM (svalue)
209
                   < (sizeof scm_isymnames / sizeof (char *))))
210
        {
211
          fputs_filtered (SCM_ISYMCHARS (svalue), stream);
212
          break;
213
        }
214
      else if (SCM_ILOCP (svalue))
215
        {
216
          fprintf_filtered (stream, "#@%ld%c%ld",
217
                            (long) SCM_IFRAME (svalue),
218
                            SCM_ICDRP (svalue) ? '-' : '+',
219
                            (long) SCM_IDIST (svalue));
220
          break;
221
        }
222
      else
223
        goto idef;
224
      break;
225
    case 1:
226
      /* gloc */
227
      svalue = SCM_CAR (svalue - 1);
228
      goto taloop;
229
    default:
230
    idef:
231
      scm_ipruk ("immediate", type, svalue, stream);
232
      break;
233
    case 0:
234
 
235
      switch (SCM_TYP7 (svalue))
236
        {
237
        case scm_tcs_cons_gloc:
238
          if (SCM_CDR (SCM_CAR (svalue) - 1L) == 0)
239
            {
240
#if 0
241
              SCM name;
242
#endif
243
              fputs_filtered ("#<latte ", stream);
244
#if 1
245
              fputs_filtered ("???", stream);
246
#else
247
              name = ((SCM n *) (STRUCT_TYPE (exp)))[struct_i_name];
248
              scm_lfwrite (CHARS (name),
249
                           (sizet) sizeof (char),
250
                             (sizet) LENGTH (name),
251
                           port);
252
#endif
253
              fprintf_filtered (stream, " #X%s>", phex_nz (svalue, SCM_SIZE));
254
              break;
255
            }
256
        case scm_tcs_cons_imcar:
257
        case scm_tcs_cons_nimcar:
258
          fputs_filtered ("(", stream);
259
          scm_scmlist_print (type, svalue, stream, recurse + 1, options);
260
          fputs_filtered (")", stream);
261
          break;
262
        case scm_tcs_closures:
263
          fputs_filtered ("#<CLOSURE ", stream);
264
          scm_scmlist_print (type, SCM_CODE (svalue), stream,
265
                             recurse + 1, options);
266
          fputs_filtered (">", stream);
267
          break;
268
        case scm_tc7_string:
269
          {
270
            int len = SCM_LENGTH (svalue);
271
            CORE_ADDR addr = (CORE_ADDR) SCM_CDR (svalue);
272
            int i;
273
            int done = 0;
274
            int buf_size;
275
            gdb_byte buffer[64];
276
            int truncate = options->print_max && len > (int) options->print_max;
277
            if (truncate)
278
              len = options->print_max;
279
            fputs_filtered ("\"", stream);
280
            for (; done < len; done += buf_size)
281
              {
282
                buf_size = min (len - done, 64);
283
                read_memory (addr + done, buffer, buf_size);
284
 
285
                for (i = 0; i < buf_size; ++i)
286
                  switch (buffer[i])
287
                    {
288
                    case '\"':
289
                    case '\\':
290
                      fputs_filtered ("\\", stream);
291
                    default:
292
                      fprintf_filtered (stream, "%c", buffer[i]);
293
                    }
294
              }
295
            fputs_filtered (truncate ? "...\"" : "\"", stream);
296
            break;
297
          }
298
          break;
299
        case scm_tcs_symbols:
300
          {
301
            int len = SCM_LENGTH (svalue);
302
 
303
            char *str = alloca (len);
304
            read_memory (SCM_CDR (svalue), (gdb_byte *) str, len + 1);
305
            /* Should handle weird characters FIXME */
306
            str[len] = '\0';
307
            fputs_filtered (str, stream);
308
            break;
309
          }
310
        case scm_tc7_vector:
311
          {
312
            int len = SCM_LENGTH (svalue);
313
            int i;
314
            LONGEST elements = SCM_CDR (svalue);
315
            LONGEST val;
316
            fputs_filtered ("#(", stream);
317
            for (i = 0; i < len; ++i)
318
              {
319
                if (i > 0)
320
                  fputs_filtered (" ", stream);
321
                val = scm_get_field (elements, i, SCM_SIZE, SCM_BYTE_ORDER);
322
                scm_scmval_print (type, val, stream, recurse + 1, options);
323
              }
324
            fputs_filtered (")", stream);
325
          }
326
          break;
327
#if 0
328
        case tc7_lvector:
329
          {
330
            SCM result;
331
            SCM hook;
332
            hook = scm_get_lvector_hook (exp, LV_PRINT_FN);
333
            if (hook == BOOL_F)
334
              {
335
                scm_puts ("#<locked-vector ", port);
336
                scm_intprint (CDR (exp), 16, port);
337
                scm_puts (">", port);
338
              }
339
            else
340
              {
341
                result
342
                  = scm_apply (hook,
343
                               scm_listify (exp, port,
344
                                            (writing ? BOOL_T : BOOL_F),
345
                                            SCM_UNDEFINED),
346
                               EOL);
347
                if (result == BOOL_F)
348
                  goto punk;
349
              }
350
            break;
351
          }
352
          break;
353
        case tc7_bvect:
354
        case tc7_ivect:
355
        case tc7_uvect:
356
        case tc7_fvect:
357
        case tc7_dvect:
358
        case tc7_cvect:
359
          scm_raprin1 (exp, port, writing);
360
          break;
361
#endif
362
        case scm_tcs_subrs:
363
          {
364
            int index = SCM_CAR (svalue) >> 8;
365
#if 1
366
            char str[20];
367
            sprintf (str, "#%d", index);
368
#else
369
            char *str = index ? SCM_CHARS (scm_heap_org + index) : "";
370
#define SCM_CHARS(x) ((char *)(SCM_CDR(x)))
371
            char *str = CHARS (SNAME (exp));
372
#endif
373
            fprintf_filtered (stream, "#<primitive-procedure %s>",
374
                              str);
375
          }
376
          break;
377
#if 0
378
#ifdef CCLO
379
        case tc7_cclo:
380
          scm_puts ("#<compiled-closure ", port);
381
          scm_iprin1 (CCLO_SUBR (exp), port, writing);
382
          scm_putc ('>', port);
383
          break;
384
#endif
385
        case tc7_contin:
386
          fprintf_filtered (stream, "#<continuation %d @ #X%lx >",
387
                            LENGTH (svalue),
388
                            (long) CHARS (svalue));
389
          break;
390
        case tc7_port:
391
          i = PTOBNUM (exp);
392
          if (i < scm_numptob
393
              && scm_ptobs[i].print
394
              && (scm_ptobs[i].print) (exp, port, writing))
395
            break;
396
          goto punk;
397
        case tc7_smob:
398
          i = SMOBNUM (exp);
399
          if (i < scm_numsmob && scm_smobs[i].print
400
              && (scm_smobs[i].print) (exp, port, writing))
401
            break;
402
          goto punk;
403
#endif
404
        default:
405
#if 0
406
        punk:
407
#endif
408
          scm_ipruk ("type", type, svalue, stream);
409
        }
410
      break;
411
    }
412
#undef SCM_BYTE_ORDER
413
#undef SCM_SIZE
414
}
415
 
416
int
417
scm_val_print (struct type *type, const gdb_byte *valaddr,
418
               int embedded_offset, CORE_ADDR address,
419
               struct ui_file *stream, int recurse,
420
               const struct value_print_options *options)
421
{
422
  if (is_scmvalue_type (type))
423
    {
424
      enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
425
      LONGEST svalue
426
        = extract_signed_integer (valaddr, TYPE_LENGTH (type), byte_order);
427
 
428
      if (scm_inferior_print (type, svalue, stream, recurse, options) >= 0)
429
        {
430
        }
431
      else
432
        {
433
          scm_scmval_print (type, svalue, stream, recurse, options);
434
        }
435
 
436
      gdb_flush (stream);
437
      return (0);
438
    }
439
  else
440
    {
441
      return c_val_print (type, valaddr, 0, address, stream, recurse, options);
442
    }
443
}
444
 
445
int
446
scm_value_print (struct value *val, struct ui_file *stream,
447
                 const struct value_print_options *options)
448
{
449
  struct value_print_options opts = *options;
450
  opts.deref_ref = 1;
451
  return (common_val_print (val, stream, 0, &opts, current_language));
452
}

powered by: WebSVN 2.1.0

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