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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [typeprint.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* Language independent support for printing types for GDB, the GNU debugger.
2
   Copyright 1986, 1988, 1989, 1991-1993, 1998, 2000 Free Software Foundation, Inc.
3
 
4
   This file is part of GDB.
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License as published by
8
   the Free Software Foundation; either version 2 of the License, or
9
   (at your option) any later version.
10
 
11
   This program is distributed in the hope that it will be useful,
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
   GNU General Public License for more details.
15
 
16
   You should have received a copy of the GNU General Public License
17
   along with this program; if not, write to the Free Software
18
   Foundation, Inc., 59 Temple Place - Suite 330,
19
   Boston, MA 02111-1307, USA.  */
20
 
21
#include "defs.h"
22
#include "obstack.h"
23
#include "bfd.h"                /* Binary File Description */
24
#include "symtab.h"
25
#include "gdbtypes.h"
26
#include "expression.h"
27
#include "value.h"
28
#include "gdbcore.h"
29
#include "command.h"
30
#include "gdbcmd.h"
31
#include "target.h"
32
#include "language.h"
33
#include "demangle.h"
34
 
35
#include "gdb_string.h"
36
#include <errno.h>
37
 
38
/* For real-type printing in whatis_exp() */
39
extern int objectprint;         /* Controls looking up an object's derived type
40
                                   using what we find in its vtables.  */
41
 
42
extern void _initialize_typeprint PARAMS ((void));
43
 
44
static void
45
ptype_command PARAMS ((char *, int));
46
 
47
static struct type *
48
  ptype_eval PARAMS ((struct expression *));
49
 
50
static void
51
whatis_command PARAMS ((char *, int));
52
 
53
static void
54
whatis_exp PARAMS ((char *, int));
55
 
56
/* Print a description of a type TYPE in the form of a declaration of a
57
   variable named VARSTRING.  (VARSTRING is demangled if necessary.)
58
   Output goes to STREAM (via stdio).
59
   If SHOW is positive, we show the contents of the outermost level
60
   of structure even if there is a type name that could be used instead.
61
   If SHOW is negative, we never show the details of elements' types.  */
62
 
63
void
64
type_print (type, varstring, stream, show)
65
     struct type *type;
66
     char *varstring;
67
     struct ui_file *stream;
68
     int show;
69
{
70
  LA_PRINT_TYPE (type, varstring, stream, show, 0);
71
}
72
 
73
/* Print type of EXP, or last thing in value history if EXP == NULL.
74
   show is passed to type_print.  */
75
 
76
static void
77
whatis_exp (exp, show)
78
     char *exp;
79
     int show;
80
{
81
  struct expression *expr;
82
  register value_ptr val;
83
  register struct cleanup *old_chain = NULL;
84
  struct type *real_type = NULL;
85
  struct type *type;
86
  int full = 0;
87
  int top = -1;
88
  int using_enc = 0;
89
 
90
  if (exp)
91
    {
92
      expr = parse_expression (exp);
93
      old_chain = make_cleanup ((make_cleanup_func) free_current_contents,
94
                                &expr);
95
      val = evaluate_type (expr);
96
    }
97
  else
98
    val = access_value_history (0);
99
 
100
  type = VALUE_TYPE (val);
101
 
102
  if (objectprint)
103
    {
104
      if (((TYPE_CODE (type) == TYPE_CODE_PTR) ||
105
           (TYPE_CODE (type) == TYPE_CODE_REF))
106
          &&
107
          (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
108
        {
109
          real_type = value_rtti_target_type (val, &full, &top, &using_enc);
110
          if (real_type)
111
            {
112
              if (TYPE_CODE (type) == TYPE_CODE_PTR)
113
                real_type = lookup_pointer_type (real_type);
114
              else
115
                real_type = lookup_reference_type (real_type);
116
            }
117
        }
118
      else if (TYPE_CODE (type) == TYPE_CODE_CLASS)
119
  real_type = value_rtti_type (val, &full, &top, &using_enc);
120
    }
121
 
122
  printf_filtered ("type = ");
123
 
124
  if (real_type)
125
    {
126
      printf_filtered ("/* real type = ");
127
      type_print (real_type, "", gdb_stdout, -1);
128
      if (! full)
129
        printf_filtered (" (incomplete object)");
130
      printf_filtered (" */\n");
131
    }
132
 
133
  type_print (type, "", gdb_stdout, show);
134
  printf_filtered ("\n");
135
 
136
  if (exp)
137
    do_cleanups (old_chain);
138
}
139
 
140
/* ARGSUSED */
141
static void
142
whatis_command (exp, from_tty)
143
     char *exp;
144
     int from_tty;
145
{
146
  /* Most of the time users do not want to see all the fields
147
     in a structure.  If they do they can use the "ptype" command.
148
     Hence the "-1" below.  */
149
  whatis_exp (exp, -1);
150
}
151
 
152
/* Simple subroutine for ptype_command.  */
153
 
154
static struct type *
155
ptype_eval (exp)
156
     struct expression *exp;
157
{
158
  if (exp->elts[0].opcode == OP_TYPE)
159
    {
160
      return (exp->elts[1].type);
161
    }
162
  else
163
    {
164
      return (NULL);
165
    }
166
}
167
 
168
/* TYPENAME is either the name of a type, or an expression.  */
169
 
170
/* ARGSUSED */
171
static void
172
ptype_command (typename, from_tty)
173
     char *typename;
174
     int from_tty;
175
{
176
  register struct type *type;
177
  struct expression *expr;
178
  register struct cleanup *old_chain;
179
 
180
  if (typename == NULL)
181
    {
182
      /* Print type of last thing in value history. */
183
      whatis_exp (typename, 1);
184
    }
185
  else
186
    {
187
      expr = parse_expression (typename);
188
      old_chain = make_cleanup ((make_cleanup_func) free_current_contents,
189
                                &expr);
190
      type = ptype_eval (expr);
191
      if (type != NULL)
192
        {
193
          /* User did "ptype <typename>" */
194
          printf_filtered ("type = ");
195
          type_print (type, "", gdb_stdout, 1);
196
          printf_filtered ("\n");
197
          do_cleanups (old_chain);
198
        }
199
      else
200
        {
201
          /* User did "ptype <symbolname>" */
202
          do_cleanups (old_chain);
203
          whatis_exp (typename, 1);
204
        }
205
    }
206
}
207
 
208
/* Print integral scalar data VAL, of type TYPE, onto stdio stream STREAM.
209
   Used to print data from type structures in a specified type.  For example,
210
   array bounds may be characters or booleans in some languages, and this
211
   allows the ranges to be printed in their "natural" form rather than as
212
   decimal integer values.
213
 
214
   FIXME:  This is here simply because only the type printing routines
215
   currently use it, and it wasn't clear if it really belonged somewhere
216
   else (like printcmd.c).  There are a lot of other gdb routines that do
217
   something similar, but they are generally concerned with printing values
218
   that come from the inferior in target byte order and target size. */
219
 
220
void
221
print_type_scalar (type, val, stream)
222
     struct type *type;
223
     LONGEST val;
224
     struct ui_file *stream;
225
{
226
  unsigned int i;
227
  unsigned len;
228
 
229
  CHECK_TYPEDEF (type);
230
 
231
  switch (TYPE_CODE (type))
232
    {
233
 
234
    case TYPE_CODE_ENUM:
235
      len = TYPE_NFIELDS (type);
236
      for (i = 0; i < len; i++)
237
        {
238
          if (TYPE_FIELD_BITPOS (type, i) == val)
239
            {
240
              break;
241
            }
242
        }
243
      if (i < len)
244
        {
245
          fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
246
        }
247
      else
248
        {
249
          print_longest (stream, 'd', 0, val);
250
        }
251
      break;
252
 
253
    case TYPE_CODE_INT:
254
      print_longest (stream, TYPE_UNSIGNED (type) ? 'u' : 'd', 0, val);
255
      break;
256
 
257
    case TYPE_CODE_CHAR:
258
      LA_PRINT_CHAR ((unsigned char) val, stream);
259
      break;
260
 
261
    case TYPE_CODE_BOOL:
262
      fprintf_filtered (stream, val ? "TRUE" : "FALSE");
263
      break;
264
 
265
    case TYPE_CODE_RANGE:
266
      print_type_scalar (TYPE_TARGET_TYPE (type), val, stream);
267
      return;
268
 
269
    case TYPE_CODE_UNDEF:
270
    case TYPE_CODE_PTR:
271
    case TYPE_CODE_ARRAY:
272
    case TYPE_CODE_STRUCT:
273
    case TYPE_CODE_UNION:
274
    case TYPE_CODE_FUNC:
275
    case TYPE_CODE_FLT:
276
    case TYPE_CODE_VOID:
277
    case TYPE_CODE_SET:
278
    case TYPE_CODE_STRING:
279
    case TYPE_CODE_ERROR:
280
    case TYPE_CODE_MEMBER:
281
    case TYPE_CODE_METHOD:
282
    case TYPE_CODE_REF:
283
      error ("internal error: unhandled type in print_type_scalar");
284
      break;
285
 
286
    default:
287
      error ("Invalid type code in symbol table.");
288
    }
289
  gdb_flush (stream);
290
}
291
 
292
/* Dump details of a type specified either directly or indirectly.
293
   Uses the same sort of type lookup mechanism as ptype_command()
294
   and whatis_command(). */
295
 
296
void
297
maintenance_print_type (typename, from_tty)
298
     char *typename;
299
     int from_tty;
300
{
301
  register value_ptr val;
302
  register struct type *type;
303
  register struct cleanup *old_chain;
304
  struct expression *expr;
305
 
306
  if (typename != NULL)
307
    {
308
      expr = parse_expression (typename);
309
      old_chain = make_cleanup ((make_cleanup_func) free_current_contents, &expr);
310
      if (expr->elts[0].opcode == OP_TYPE)
311
        {
312
          /* The user expression names a type directly, just use that type. */
313
          type = expr->elts[1].type;
314
        }
315
      else
316
        {
317
          /* The user expression may name a type indirectly by naming an
318
             object of that type.  Find that indirectly named type. */
319
          val = evaluate_type (expr);
320
          type = VALUE_TYPE (val);
321
        }
322
      if (type != NULL)
323
        {
324
          recursive_dump_type (type, 0);
325
        }
326
      do_cleanups (old_chain);
327
    }
328
}
329
 
330
 
331
void
332
_initialize_typeprint ()
333
{
334
 
335
  add_com ("ptype", class_vars, ptype_command,
336
           "Print definition of type TYPE.\n\
337
Argument may be a type name defined by typedef, or \"struct STRUCT-TAG\"\n\
338
or \"class CLASS-NAME\" or \"union UNION-TAG\" or \"enum ENUM-TAG\".\n\
339
The selected stack frame's lexical context is used to look up the name.");
340
 
341
  add_com ("whatis", class_vars, whatis_command,
342
           "Print data type of expression EXP.");
343
 
344
}

powered by: WebSVN 2.1.0

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