OSDN Git Service

Update/correct copyright notices.
[pf3gnuchains/pf3gnuchains3x.git] / gdb / c-lang.c
1 /* C language support routines for GDB, the GNU debugger.
2    Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000
3    Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22 #include "defs.h"
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "expression.h"
26 #include "parser-defs.h"
27 #include "language.h"
28 #include "c-lang.h"
29 #include "valprint.h"
30
31 extern void _initialize_c_language (void);
32 static void c_emit_char (int c, struct ui_file * stream, int quoter);
33
34 /* Print the character C on STREAM as part of the contents of a literal
35    string whose delimiter is QUOTER.  Note that that format for printing
36    characters and strings is language specific. */
37
38 static void
39 c_emit_char (register int c, struct ui_file *stream, int quoter)
40 {
41   c &= 0xFF;                    /* Avoid sign bit follies */
42
43   if (PRINT_LITERAL_FORM (c))
44     {
45       if (c == '\\' || c == quoter)
46         {
47           fputs_filtered ("\\", stream);
48         }
49       fprintf_filtered (stream, "%c", c);
50     }
51   else
52     {
53       switch (c)
54         {
55         case '\n':
56           fputs_filtered ("\\n", stream);
57           break;
58         case '\b':
59           fputs_filtered ("\\b", stream);
60           break;
61         case '\t':
62           fputs_filtered ("\\t", stream);
63           break;
64         case '\f':
65           fputs_filtered ("\\f", stream);
66           break;
67         case '\r':
68           fputs_filtered ("\\r", stream);
69           break;
70         case '\033':
71           fputs_filtered ("\\e", stream);
72           break;
73         case '\007':
74           fputs_filtered ("\\a", stream);
75           break;
76         default:
77           fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
78           break;
79         }
80     }
81 }
82
83 void
84 c_printchar (int c, struct ui_file *stream)
85 {
86   fputc_filtered ('\'', stream);
87   LA_EMIT_CHAR (c, stream, '\'');
88   fputc_filtered ('\'', stream);
89 }
90
91 /* Print the character string STRING, printing at most LENGTH characters.
92    LENGTH is -1 if the string is nul terminated.  Each character is WIDTH bytes
93    long.  Printing stops early if the number hits print_max; repeat counts are
94    printed as appropriate.  Print ellipses at the end if we had to stop before
95    printing LENGTH characters, or if FORCE_ELLIPSES.  */
96
97 void
98 c_printstr (struct ui_file *stream, char *string, unsigned int length,
99             int width, int force_ellipses)
100 {
101   register unsigned int i;
102   unsigned int things_printed = 0;
103   int in_quotes = 0;
104   int need_comma = 0;
105   extern int inspect_it;
106
107   /* If the string was not truncated due to `set print elements', and
108      the last byte of it is a null, we don't print that, in traditional C
109      style.  */
110   if (!force_ellipses
111       && length > 0
112   && extract_unsigned_integer (string + (length - 1) * width, width) == '\0')
113     length--;
114
115   if (length == 0)
116     {
117       fputs_filtered ("\"\"", stream);
118       return;
119     }
120
121   for (i = 0; i < length && things_printed < print_max; ++i)
122     {
123       /* Position of the character we are examining
124          to see whether it is repeated.  */
125       unsigned int rep1;
126       /* Number of repetitions we have detected so far.  */
127       unsigned int reps;
128       unsigned long current_char;
129
130       QUIT;
131
132       if (need_comma)
133         {
134           fputs_filtered (", ", stream);
135           need_comma = 0;
136         }
137
138       current_char = extract_unsigned_integer (string + i * width, width);
139
140       rep1 = i + 1;
141       reps = 1;
142       while (rep1 < length
143              && extract_unsigned_integer (string + rep1 * width, width)
144              == current_char)
145         {
146           ++rep1;
147           ++reps;
148         }
149
150       if (reps > repeat_count_threshold)
151         {
152           if (in_quotes)
153             {
154               if (inspect_it)
155                 fputs_filtered ("\\\", ", stream);
156               else
157                 fputs_filtered ("\", ", stream);
158               in_quotes = 0;
159             }
160           LA_PRINT_CHAR (current_char, stream);
161           fprintf_filtered (stream, " <repeats %u times>", reps);
162           i = rep1 - 1;
163           things_printed += repeat_count_threshold;
164           need_comma = 1;
165         }
166       else
167         {
168           if (!in_quotes)
169             {
170               if (inspect_it)
171                 fputs_filtered ("\\\"", stream);
172               else
173                 fputs_filtered ("\"", stream);
174               in_quotes = 1;
175             }
176           LA_EMIT_CHAR (current_char, stream, '"');
177           ++things_printed;
178         }
179     }
180
181   /* Terminate the quotes if necessary.  */
182   if (in_quotes)
183     {
184       if (inspect_it)
185         fputs_filtered ("\\\"", stream);
186       else
187         fputs_filtered ("\"", stream);
188     }
189
190   if (force_ellipses || i < length)
191     fputs_filtered ("...", stream);
192 }
193
194 /* Create a fundamental C type using default reasonable for the current
195    target machine.
196
197    Some object/debugging file formats (DWARF version 1, COFF, etc) do not
198    define fundamental types such as "int" or "double".  Others (stabs or
199    DWARF version 2, etc) do define fundamental types.  For the formats which
200    don't provide fundamental types, gdb can create such types using this
201    function.
202
203    FIXME:  Some compilers distinguish explicitly signed integral types
204    (signed short, signed int, signed long) from "regular" integral types
205    (short, int, long) in the debugging information.  There is some dis-
206    agreement as to how useful this feature is.  In particular, gcc does
207    not support this.  Also, only some debugging formats allow the
208    distinction to be passed on to a debugger.  For now, we always just
209    use "short", "int", or "long" as the type name, for both the implicit
210    and explicitly signed types.  This also makes life easier for the
211    gdb test suite since we don't have to account for the differences
212    in output depending upon what the compiler and debugging format
213    support.  We will probably have to re-examine the issue when gdb
214    starts taking it's fundamental type information directly from the
215    debugging information supplied by the compiler.  fnf@cygnus.com */
216
217 struct type *
218 c_create_fundamental_type (struct objfile *objfile, int typeid)
219 {
220   register struct type *type = NULL;
221
222   switch (typeid)
223     {
224     default:
225       /* FIXME:  For now, if we are asked to produce a type not in this
226          language, create the equivalent of a C integer type with the
227          name "<?type?>".  When all the dust settles from the type
228          reconstruction work, this should probably become an error. */
229       type = init_type (TYPE_CODE_INT,
230                         TARGET_INT_BIT / TARGET_CHAR_BIT,
231                         0, "<?type?>", objfile);
232       warning ("internal error: no C/C++ fundamental type %d", typeid);
233       break;
234     case FT_VOID:
235       type = init_type (TYPE_CODE_VOID,
236                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
237                         0, "void", objfile);
238       break;
239     case FT_BOOLEAN:
240       type = init_type (TYPE_CODE_BOOL,
241                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
242                         0, "bool", objfile);
243
244       break;
245     case FT_CHAR:
246       type = init_type (TYPE_CODE_INT,
247                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
248                         0, "char", objfile);
249       TYPE_FLAGS (type) |= TYPE_FLAG_NOSIGN;
250       break;
251     case FT_SIGNED_CHAR:
252       type = init_type (TYPE_CODE_INT,
253                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
254                         0, "signed char", objfile);
255       break;
256     case FT_UNSIGNED_CHAR:
257       type = init_type (TYPE_CODE_INT,
258                         TARGET_CHAR_BIT / TARGET_CHAR_BIT,
259                         TYPE_FLAG_UNSIGNED, "unsigned char", objfile);
260       break;
261     case FT_SHORT:
262       type = init_type (TYPE_CODE_INT,
263                         TARGET_SHORT_BIT / TARGET_CHAR_BIT,
264                         0, "short", objfile);
265       break;
266     case FT_SIGNED_SHORT:
267       type = init_type (TYPE_CODE_INT,
268                         TARGET_SHORT_BIT / TARGET_CHAR_BIT,
269                         0, "short", objfile);   /* FIXME-fnf */
270       break;
271     case FT_UNSIGNED_SHORT:
272       type = init_type (TYPE_CODE_INT,
273                         TARGET_SHORT_BIT / TARGET_CHAR_BIT,
274                         TYPE_FLAG_UNSIGNED, "unsigned short", objfile);
275       break;
276     case FT_INTEGER:
277       type = init_type (TYPE_CODE_INT,
278                         TARGET_INT_BIT / TARGET_CHAR_BIT,
279                         0, "int", objfile);
280       break;
281     case FT_SIGNED_INTEGER:
282       type = init_type (TYPE_CODE_INT,
283                         TARGET_INT_BIT / TARGET_CHAR_BIT,
284                         0, "int", objfile);     /* FIXME -fnf */
285       break;
286     case FT_UNSIGNED_INTEGER:
287       type = init_type (TYPE_CODE_INT,
288                         TARGET_INT_BIT / TARGET_CHAR_BIT,
289                         TYPE_FLAG_UNSIGNED, "unsigned int", objfile);
290       break;
291     case FT_LONG:
292       type = init_type (TYPE_CODE_INT,
293                         TARGET_LONG_BIT / TARGET_CHAR_BIT,
294                         0, "long", objfile);
295       break;
296     case FT_SIGNED_LONG:
297       type = init_type (TYPE_CODE_INT,
298                         TARGET_LONG_BIT / TARGET_CHAR_BIT,
299                         0, "long", objfile);    /* FIXME -fnf */
300       break;
301     case FT_UNSIGNED_LONG:
302       type = init_type (TYPE_CODE_INT,
303                         TARGET_LONG_BIT / TARGET_CHAR_BIT,
304                         TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
305       break;
306     case FT_LONG_LONG:
307       type = init_type (TYPE_CODE_INT,
308                         TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
309                         0, "long long", objfile);
310       break;
311     case FT_SIGNED_LONG_LONG:
312       type = init_type (TYPE_CODE_INT,
313                         TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
314                         0, "signed long long", objfile);
315       break;
316     case FT_UNSIGNED_LONG_LONG:
317       type = init_type (TYPE_CODE_INT,
318                         TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
319                         TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
320       break;
321     case FT_FLOAT:
322       type = init_type (TYPE_CODE_FLT,
323                         TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
324                         0, "float", objfile);
325       break;
326     case FT_DBL_PREC_FLOAT:
327       type = init_type (TYPE_CODE_FLT,
328                         TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
329                         0, "double", objfile);
330       break;
331     case FT_EXT_PREC_FLOAT:
332       type = init_type (TYPE_CODE_FLT,
333                         TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
334                         0, "long double", objfile);
335       break;
336     case FT_TEMPLATE_ARG:
337       type = init_type (TYPE_CODE_TEMPLATE_ARG,
338                         0,
339                         0, "<template arg>", objfile);
340
341       break;
342     }
343   return (type);
344 }
345 \f
346
347 /* Table mapping opcodes into strings for printing operators
348    and precedences of the operators.  */
349
350 const struct op_print c_op_print_tab[] =
351 {
352   {",", BINOP_COMMA, PREC_COMMA, 0},
353   {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
354   {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
355   {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
356   {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
357   {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
358   {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
359   {"==", BINOP_EQUAL, PREC_EQUAL, 0},
360   {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
361   {"<=", BINOP_LEQ, PREC_ORDER, 0},
362   {">=", BINOP_GEQ, PREC_ORDER, 0},
363   {">", BINOP_GTR, PREC_ORDER, 0},
364   {"<", BINOP_LESS, PREC_ORDER, 0},
365   {">>", BINOP_RSH, PREC_SHIFT, 0},
366   {"<<", BINOP_LSH, PREC_SHIFT, 0},
367   {"+", BINOP_ADD, PREC_ADD, 0},
368   {"-", BINOP_SUB, PREC_ADD, 0},
369   {"*", BINOP_MUL, PREC_MUL, 0},
370   {"/", BINOP_DIV, PREC_MUL, 0},
371   {"%", BINOP_REM, PREC_MUL, 0},
372   {"@", BINOP_REPEAT, PREC_REPEAT, 0},
373   {"-", UNOP_NEG, PREC_PREFIX, 0},
374   {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
375   {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
376   {"*", UNOP_IND, PREC_PREFIX, 0},
377   {"&", UNOP_ADDR, PREC_PREFIX, 0},
378   {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
379   {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
380   {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
381   {NULL, 0, 0, 0}
382 };
383 \f
384 struct type **CONST_PTR (c_builtin_types[]) =
385 {
386   &builtin_type_int,
387     &builtin_type_long,
388     &builtin_type_short,
389     &builtin_type_char,
390     &builtin_type_float,
391     &builtin_type_double,
392     &builtin_type_void,
393     &builtin_type_long_long,
394     &builtin_type_signed_char,
395     &builtin_type_unsigned_char,
396     &builtin_type_unsigned_short,
397     &builtin_type_unsigned_int,
398     &builtin_type_unsigned_long,
399     &builtin_type_unsigned_long_long,
400     &builtin_type_long_double,
401     &builtin_type_complex,
402     &builtin_type_double_complex,
403     0
404 };
405
406 const struct language_defn c_language_defn =
407 {
408   "c",                          /* Language name */
409   language_c,
410   c_builtin_types,
411   range_check_off,
412   type_check_off,
413   case_sensitive_on,
414   c_parse,
415   c_error,
416   evaluate_subexp_standard,
417   c_printchar,                  /* Print a character constant */
418   c_printstr,                   /* Function to print string constant */
419   c_emit_char,                  /* Print a single char */
420   c_create_fundamental_type,    /* Create fundamental type in this language */
421   c_print_type,                 /* Print a type using appropriate syntax */
422   c_val_print,                  /* Print a value using appropriate syntax */
423   c_value_print,                /* Print a top-level value */
424   {"", "", "", ""},             /* Binary format info */
425   {"0%lo", "0", "o", ""},       /* Octal format info */
426   {"%ld", "", "d", ""},         /* Decimal format info */
427   {"0x%lx", "0x", "x", ""},     /* Hex format info */
428   c_op_print_tab,               /* expression operators for printing */
429   1,                            /* c-style arrays */
430   0,                            /* String lower bound */
431   &builtin_type_char,           /* Type of string elements */
432   LANG_MAGIC
433 };
434
435 struct type **const (cplus_builtin_types[]) =
436 {
437   &builtin_type_int,
438     &builtin_type_long,
439     &builtin_type_short,
440     &builtin_type_char,
441     &builtin_type_float,
442     &builtin_type_double,
443     &builtin_type_void,
444     &builtin_type_long_long,
445     &builtin_type_signed_char,
446     &builtin_type_unsigned_char,
447     &builtin_type_unsigned_short,
448     &builtin_type_unsigned_int,
449     &builtin_type_unsigned_long,
450     &builtin_type_unsigned_long_long,
451     &builtin_type_long_double,
452     &builtin_type_complex,
453     &builtin_type_double_complex,
454     &builtin_type_bool,
455     0
456 };
457
458 const struct language_defn cplus_language_defn =
459 {
460   "c++",                        /* Language name */
461   language_cplus,
462   cplus_builtin_types,
463   range_check_off,
464   type_check_off,
465   case_sensitive_on,
466   c_parse,
467   c_error,
468   evaluate_subexp_standard,
469   c_printchar,                  /* Print a character constant */
470   c_printstr,                   /* Function to print string constant */
471   c_emit_char,                  /* Print a single char */
472   c_create_fundamental_type,    /* Create fundamental type in this language */
473   c_print_type,                 /* Print a type using appropriate syntax */
474   c_val_print,                  /* Print a value using appropriate syntax */
475   c_value_print,                /* Print a top-level value */
476   {"", "", "", ""},             /* Binary format info */
477   {"0%lo", "0", "o", ""},       /* Octal format info */
478   {"%ld", "", "d", ""},         /* Decimal format info */
479   {"0x%lx", "0x", "x", ""},     /* Hex format info */
480   c_op_print_tab,               /* expression operators for printing */
481   1,                            /* c-style arrays */
482   0,                            /* String lower bound */
483   &builtin_type_char,           /* Type of string elements */
484   LANG_MAGIC
485 };
486
487 const struct language_defn asm_language_defn =
488 {
489   "asm",                        /* Language name */
490   language_asm,
491   c_builtin_types,
492   range_check_off,
493   type_check_off,
494   case_sensitive_on,
495   c_parse,
496   c_error,
497   evaluate_subexp_standard,
498   c_printchar,                  /* Print a character constant */
499   c_printstr,                   /* Function to print string constant */
500   c_emit_char,                  /* Print a single char */
501   c_create_fundamental_type,    /* Create fundamental type in this language */
502   c_print_type,                 /* Print a type using appropriate syntax */
503   c_val_print,                  /* Print a value using appropriate syntax */
504   c_value_print,                /* Print a top-level value */
505   {"", "", "", ""},             /* Binary format info */
506   {"0%lo", "0", "o", ""},       /* Octal format info */
507   {"%ld", "", "d", ""},         /* Decimal format info */
508   {"0x%lx", "0x", "x", ""},     /* Hex format info */
509   c_op_print_tab,               /* expression operators for printing */
510   1,                            /* c-style arrays */
511   0,                            /* String lower bound */
512   &builtin_type_char,           /* Type of string elements */
513   LANG_MAGIC
514 };
515
516 void
517 _initialize_c_language (void)
518 {
519   add_language (&c_language_defn);
520   add_language (&cplus_language_defn);
521   add_language (&asm_language_defn);
522 }