OSDN Git Service

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