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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gdb-7.2/] [gdb-7.2-or32-1.0rc3/] [gdb/] [f-typeprint.c] - Blame information for rev 791

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

Line No. Rev Author Line
1 330 jeremybenn
/* Support for printing Fortran types for GDB, the GNU debugger.
2
 
3
   Copyright (C) 1986, 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1998, 2000,
4
   2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010
5
   Free Software Foundation, Inc.
6
 
7
   Contributed by Motorola.  Adapted from the C version by Farooq Butt
8
   (fmbutt@engage.sps.mot.com).
9
 
10
   This file is part of GDB.
11
 
12
   This program is free software; you can redistribute it and/or modify
13
   it under the terms of the GNU General Public License as published by
14
   the Free Software Foundation; either version 3 of the License, or
15
   (at your option) any later version.
16
 
17
   This program is distributed in the hope that it will be useful,
18
   but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   GNU General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
24
 
25
#include "defs.h"
26
#include "gdb_obstack.h"
27
#include "bfd.h"
28
#include "symtab.h"
29
#include "gdbtypes.h"
30
#include "expression.h"
31
#include "value.h"
32
#include "gdbcore.h"
33
#include "target.h"
34
#include "f-lang.h"
35
 
36
#include "gdb_string.h"
37
#include <errno.h>
38
 
39
#if 0                           /* Currently unused */
40
static void f_type_print_args (struct type *, struct ui_file *);
41
#endif
42
 
43
static void f_type_print_varspec_suffix (struct type *, struct ui_file *, int,
44
                                         int, int, int);
45
 
46
void f_type_print_varspec_prefix (struct type *, struct ui_file *,
47
                                  int, int);
48
 
49
void f_type_print_base (struct type *, struct ui_file *, int, int);
50
 
51
 
52
/* LEVEL is the depth to indent lines by.  */
53
 
54
void
55
f_print_type (struct type *type, const char *varstring, struct ui_file *stream,
56
              int show, int level)
57
{
58
  enum type_code code;
59
  int demangled_args;
60
 
61
  f_type_print_base (type, stream, show, level);
62
  code = TYPE_CODE (type);
63
  if ((varstring != NULL && *varstring != '\0')
64
  /* Need a space if going to print stars or brackets;
65
     but not if we will print just a type name.  */
66
      || ((show > 0 || TYPE_NAME (type) == 0)
67
          && (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
68
              || code == TYPE_CODE_METHOD
69
              || code == TYPE_CODE_ARRAY
70
              || code == TYPE_CODE_REF)))
71
    fputs_filtered (" ", stream);
72
  f_type_print_varspec_prefix (type, stream, show, 0);
73
 
74
  if (varstring != NULL)
75
    {
76
      fputs_filtered (varstring, stream);
77
 
78
      /* For demangled function names, we have the arglist as part of the name,
79
         so don't print an additional pair of ()'s */
80
 
81
      demangled_args = varstring[strlen (varstring) - 1] == ')';
82
      f_type_print_varspec_suffix (type, stream, show, 0, demangled_args, 0);
83
   }
84
}
85
 
86
/* Print any asterisks or open-parentheses needed before the
87
   variable name (to describe its type).
88
 
89
   On outermost call, pass 0 for PASSED_A_PTR.
90
   On outermost call, SHOW > 0 means should ignore
91
   any typename for TYPE and show its details.
92
   SHOW is always zero on recursive calls.  */
93
 
94
void
95
f_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
96
                             int show, int passed_a_ptr)
97
{
98
  if (type == 0)
99
    return;
100
 
101
  if (TYPE_NAME (type) && show <= 0)
102
    return;
103
 
104
  QUIT;
105
 
106
  switch (TYPE_CODE (type))
107
    {
108
    case TYPE_CODE_PTR:
109
      f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
110
      break;
111
 
112
    case TYPE_CODE_FUNC:
113
      f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
114
      if (passed_a_ptr)
115
        fprintf_filtered (stream, "(");
116
      break;
117
 
118
    case TYPE_CODE_ARRAY:
119
      f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
120
      break;
121
 
122
    case TYPE_CODE_UNDEF:
123
    case TYPE_CODE_STRUCT:
124
    case TYPE_CODE_UNION:
125
    case TYPE_CODE_ENUM:
126
    case TYPE_CODE_INT:
127
    case TYPE_CODE_FLT:
128
    case TYPE_CODE_VOID:
129
    case TYPE_CODE_ERROR:
130
    case TYPE_CODE_CHAR:
131
    case TYPE_CODE_BOOL:
132
    case TYPE_CODE_SET:
133
    case TYPE_CODE_RANGE:
134
    case TYPE_CODE_STRING:
135
    case TYPE_CODE_BITSTRING:
136
    case TYPE_CODE_METHOD:
137
    case TYPE_CODE_REF:
138
    case TYPE_CODE_COMPLEX:
139
    case TYPE_CODE_TYPEDEF:
140
      /* These types need no prefix.  They are listed here so that
141
         gcc -Wall will reveal any types that haven't been handled.  */
142
      break;
143
    }
144
}
145
 
146
/* Print any array sizes, function arguments or close parentheses
147
   needed after the variable name (to describe its type).
148
   Args work like c_type_print_varspec_prefix.  */
149
 
150
static void
151
f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
152
                             int show, int passed_a_ptr, int demangled_args,
153
                             int arrayprint_recurse_level)
154
{
155
  int upper_bound, lower_bound;
156
 
157
  /* No static variables are permitted as an error call may occur during
158
     execution of this function.  */
159
 
160
  if (type == 0)
161
    return;
162
 
163
  if (TYPE_NAME (type) && show <= 0)
164
    return;
165
 
166
  QUIT;
167
 
168
  switch (TYPE_CODE (type))
169
    {
170
    case TYPE_CODE_ARRAY:
171
      arrayprint_recurse_level++;
172
 
173
      if (arrayprint_recurse_level == 1)
174
        fprintf_filtered (stream, "(");
175
 
176
      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY)
177
        f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0,
178
                                     arrayprint_recurse_level);
179
 
180
      lower_bound = f77_get_lowerbound (type);
181
      if (lower_bound != 1)     /* Not the default.  */
182
        fprintf_filtered (stream, "%d:", lower_bound);
183
 
184
      /* Make sure that, if we have an assumed size array, we
185
         print out a warning and print the upperbound as '*' */
186
 
187
      if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
188
        fprintf_filtered (stream, "*");
189
      else
190
        {
191
          upper_bound = f77_get_upperbound (type);
192
          fprintf_filtered (stream, "%d", upper_bound);
193
        }
194
 
195
      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY)
196
        f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0,
197
                                     arrayprint_recurse_level);
198
      if (arrayprint_recurse_level == 1)
199
        fprintf_filtered (stream, ")");
200
      else
201
        fprintf_filtered (stream, ",");
202
      arrayprint_recurse_level--;
203
      break;
204
 
205
    case TYPE_CODE_PTR:
206
    case TYPE_CODE_REF:
207
      f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0,
208
                                   arrayprint_recurse_level);
209
      fprintf_filtered (stream, ")");
210
      break;
211
 
212
    case TYPE_CODE_FUNC:
213
      f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
214
                                   passed_a_ptr, 0, arrayprint_recurse_level);
215
      if (passed_a_ptr)
216
        fprintf_filtered (stream, ")");
217
 
218
      fprintf_filtered (stream, "()");
219
      break;
220
 
221
    case TYPE_CODE_UNDEF:
222
    case TYPE_CODE_STRUCT:
223
    case TYPE_CODE_UNION:
224
    case TYPE_CODE_ENUM:
225
    case TYPE_CODE_INT:
226
    case TYPE_CODE_FLT:
227
    case TYPE_CODE_VOID:
228
    case TYPE_CODE_ERROR:
229
    case TYPE_CODE_CHAR:
230
    case TYPE_CODE_BOOL:
231
    case TYPE_CODE_SET:
232
    case TYPE_CODE_RANGE:
233
    case TYPE_CODE_STRING:
234
    case TYPE_CODE_BITSTRING:
235
    case TYPE_CODE_METHOD:
236
    case TYPE_CODE_COMPLEX:
237
    case TYPE_CODE_TYPEDEF:
238
      /* These types do not need a suffix.  They are listed so that
239
         gcc -Wall will report types that may not have been considered.  */
240
      break;
241
    }
242
}
243
 
244
/* Print the name of the type (or the ultimate pointer target,
245
   function value or array element), or the description of a
246
   structure or union.
247
 
248
   SHOW nonzero means don't print this type as just its name;
249
   show its real definition even if it has a name.
250
   SHOW zero means print just typename or struct tag if there is one
251
   SHOW negative means abbreviate structure elements.
252
   SHOW is decremented for printing of structure elements.
253
 
254
   LEVEL is the depth to indent by.
255
   We increase it for some recursive calls.  */
256
 
257
void
258
f_type_print_base (struct type *type, struct ui_file *stream, int show,
259
                   int level)
260
{
261
  int upper_bound;
262
  int index;
263
 
264
  QUIT;
265
 
266
  wrap_here ("    ");
267
  if (type == NULL)
268
    {
269
      fputs_filtered ("<type unknown>", stream);
270
      return;
271
    }
272
 
273
  /* When SHOW is zero or less, and there is a valid type name, then always
274
     just print the type name directly from the type. */
275
 
276
  if ((show <= 0) && (TYPE_NAME (type) != NULL))
277
    {
278
      fputs_filtered (TYPE_NAME (type), stream);
279
      return;
280
    }
281
 
282
  if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
283
    CHECK_TYPEDEF (type);
284
 
285
  switch (TYPE_CODE (type))
286
    {
287
    case TYPE_CODE_TYPEDEF:
288
      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
289
      break;
290
 
291
    case TYPE_CODE_ARRAY:
292
    case TYPE_CODE_FUNC:
293
      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
294
      break;
295
 
296
    case TYPE_CODE_PTR:
297
      fprintf_filtered (stream, "PTR TO -> ( ");
298
      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
299
      break;
300
 
301
    case TYPE_CODE_REF:
302
      fprintf_filtered (stream, "REF TO -> ( ");
303
      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
304
      break;
305
 
306
    case TYPE_CODE_VOID:
307
      fprintfi_filtered (level, stream, "VOID");
308
      break;
309
 
310
    case TYPE_CODE_UNDEF:
311
      fprintfi_filtered (level, stream, "struct <unknown>");
312
      break;
313
 
314
    case TYPE_CODE_ERROR:
315
      fprintfi_filtered (level, stream, "%s", TYPE_ERROR_NAME (type));
316
      break;
317
 
318
    case TYPE_CODE_RANGE:
319
      /* This should not occur */
320
      fprintfi_filtered (level, stream, "<range type>");
321
      break;
322
 
323
    case TYPE_CODE_CHAR:
324
      /* Override name "char" and make it "character" */
325
      fprintfi_filtered (level, stream, "character");
326
      break;
327
 
328
    case TYPE_CODE_INT:
329
      /* There may be some character types that attempt to come
330
         through as TYPE_CODE_INT since dbxstclass.h is so
331
         C-oriented, we must change these to "character" from "char".  */
332
 
333
      if (strcmp (TYPE_NAME (type), "char") == 0)
334
        fprintfi_filtered (level, stream, "character");
335
      else
336
        goto default_case;
337
      break;
338
 
339
    case TYPE_CODE_STRING:
340
      /* Strings may have dynamic upperbounds (lengths) like arrays. */
341
 
342
      if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
343
        fprintfi_filtered (level, stream, "character*(*)");
344
      else
345
        {
346
          upper_bound = f77_get_upperbound (type);
347
          fprintf_filtered (stream, "character*%d", upper_bound);
348
        }
349
      break;
350
 
351
    case TYPE_CODE_STRUCT:
352
    case TYPE_CODE_UNION:
353
      if (TYPE_CODE (type) == TYPE_CODE_UNION)
354
        fprintfi_filtered (level, stream, "Type, C_Union :: ");
355
      else
356
        fprintfi_filtered (level, stream, "Type ");
357
      fputs_filtered (TYPE_TAG_NAME (type), stream);
358
      fputs_filtered ("\n", stream);
359
      for (index = 0; index < TYPE_NFIELDS (type); index++)
360
        {
361
          f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, show,
362
                             level + 4);
363
          fputs_filtered (" :: ", stream);
364
          fputs_filtered (TYPE_FIELD_NAME (type, index), stream);
365
          f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index),
366
                                       stream, 0, 0, 0, 0);
367
          fputs_filtered ("\n", stream);
368
        }
369
      fprintfi_filtered (level, stream, "End Type ");
370
      fputs_filtered (TYPE_TAG_NAME (type), stream);
371
      break;
372
 
373
    case TYPE_CODE_MODULE:
374
      fprintfi_filtered (level, stream, "module %s", TYPE_TAG_NAME (type));
375
      break;
376
 
377
    default_case:
378
    default:
379
      /* Handle types not explicitly handled by the other cases,
380
         such as fundamental types.  For these, just print whatever
381
         the type name is, as recorded in the type itself.  If there
382
         is no type name, then complain. */
383
      if (TYPE_NAME (type) != NULL)
384
        fprintfi_filtered (level, stream, "%s", TYPE_NAME (type));
385
      else
386
        error (_("Invalid type code (%d) in symbol table."), TYPE_CODE (type));
387
      break;
388
    }
389
}

powered by: WebSVN 2.1.0

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