1 /* C language support routines for GDB, the GNU debugger.
2 Copyright 1992, 1993, 1994 Free Software Foundation, Inc.
4 This file is part of GDB.
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.
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.
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, Boston, MA 02111-1307, USA. */
23 #include "expression.h"
24 #include "parser-defs.h"
28 static void emit_char PARAMS ((int, GDB_FILE *, int));
30 /* Print the character C on STREAM as part of the contents of a literal
31 string whose delimiter is QUOTER. Note that that format for printing
32 characters and strings is language specific. */
35 emit_char (c, stream, quoter)
41 c &= 0xFF; /* Avoid sign bit follies */
43 if (PRINT_LITERAL_FORM (c))
45 if (c == '\\' || c == quoter)
47 fputs_filtered ("\\", stream);
49 fprintf_filtered (stream, "%c", c);
56 fputs_filtered ("\\n", stream);
59 fputs_filtered ("\\b", stream);
62 fputs_filtered ("\\t", stream);
65 fputs_filtered ("\\f", stream);
68 fputs_filtered ("\\r", stream);
71 fputs_filtered ("\\e", stream);
74 fputs_filtered ("\\a", stream);
77 fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
84 c_printchar (c, stream)
88 fputs_filtered ("'", stream);
89 emit_char (c, stream, '\'');
90 fputs_filtered ("'", stream);
93 /* Print the character string STRING, printing at most LENGTH characters.
94 Printing stops early if the number hits print_max; repeat counts
95 are printed as appropriate. Print ellipses at the end if we
96 had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */
99 c_printstr (stream, string, length, force_ellipses)
105 register unsigned int i;
106 unsigned int things_printed = 0;
109 extern int inspect_it;
110 extern int repeat_count_threshold;
111 extern int print_max;
113 /* If the string was not truncated due to `set print elements', and
114 the last byte of it is a null, we don't print that, in traditional C
116 if ((!force_ellipses) && length > 0 && string[length-1] == '\0')
121 fputs_filtered ("\"\"", stream);
125 for (i = 0; i < length && things_printed < print_max; ++i)
127 /* Position of the character we are examining
128 to see whether it is repeated. */
130 /* Number of repetitions we have detected so far. */
137 fputs_filtered (", ", stream);
143 while (rep1 < length && string[rep1] == string[i])
149 if (reps > repeat_count_threshold)
154 fputs_filtered ("\\\", ", stream);
156 fputs_filtered ("\", ", stream);
159 c_printchar (string[i], stream);
160 fprintf_filtered (stream, " <repeats %u times>", reps);
162 things_printed += repeat_count_threshold;
170 fputs_filtered ("\\\"", stream);
172 fputs_filtered ("\"", stream);
175 emit_char (string[i], stream, '"');
180 /* Terminate the quotes if necessary. */
184 fputs_filtered ("\\\"", stream);
186 fputs_filtered ("\"", stream);
189 if (force_ellipses || i < length)
190 fputs_filtered ("...", stream);
193 /* Create a fundamental C type using default reasonable for the current
196 Some object/debugging file formats (DWARF version 1, COFF, etc) do not
197 define fundamental types such as "int" or "double". Others (stabs or
198 DWARF version 2, etc) do define fundamental types. For the formats which
199 don't provide fundamental types, gdb can create such types using this
202 FIXME: Some compilers distinguish explicitly signed integral types
203 (signed short, signed int, signed long) from "regular" integral types
204 (short, int, long) in the debugging information. There is some dis-
205 agreement as to how useful this feature is. In particular, gcc does
206 not support this. Also, only some debugging formats allow the
207 distinction to be passed on to a debugger. For now, we always just
208 use "short", "int", or "long" as the type name, for both the implicit
209 and explicitly signed types. This also makes life easier for the
210 gdb test suite since we don't have to account for the differences
211 in output depending upon what the compiler and debugging format
212 support. We will probably have to re-examine the issue when gdb
213 starts taking it's fundamental type information directly from the
217 c_create_fundamental_type (objfile, typeid)
218 struct objfile *objfile;
221 register struct type *type = NULL;
226 /* FIXME: For now, if we are asked to produce a type not in this
227 language, create the equivalent of a C integer type with the
228 name "<?type?>". When all the dust settles from the type
229 reconstruction work, this should probably become an error. */
230 type = init_type (TYPE_CODE_INT,
231 TARGET_INT_BIT / TARGET_CHAR_BIT,
232 0, "<?type?>", objfile);
233 warning ("internal error: no C/C++ fundamental type %d", typeid);
236 type = init_type (TYPE_CODE_VOID,
237 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
241 type = init_type (TYPE_CODE_INT,
242 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
246 type = init_type (TYPE_CODE_INT,
247 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
248 0, "signed char", objfile);
250 case FT_UNSIGNED_CHAR:
251 type = init_type (TYPE_CODE_INT,
252 TARGET_CHAR_BIT / TARGET_CHAR_BIT,
253 TYPE_FLAG_UNSIGNED, "unsigned char", objfile);
256 type = init_type (TYPE_CODE_INT,
257 TARGET_SHORT_BIT / TARGET_CHAR_BIT,
258 0, "short", objfile);
260 case FT_SIGNED_SHORT:
261 type = init_type (TYPE_CODE_INT,
262 TARGET_SHORT_BIT / TARGET_CHAR_BIT,
263 0, "short", objfile); /* FIXME-fnf */
265 case FT_UNSIGNED_SHORT:
266 type = init_type (TYPE_CODE_INT,
267 TARGET_SHORT_BIT / TARGET_CHAR_BIT,
268 TYPE_FLAG_UNSIGNED, "unsigned short", objfile);
271 type = init_type (TYPE_CODE_INT,
272 TARGET_INT_BIT / TARGET_CHAR_BIT,
275 case FT_SIGNED_INTEGER:
276 type = init_type (TYPE_CODE_INT,
277 TARGET_INT_BIT / TARGET_CHAR_BIT,
278 0, "int", objfile); /* FIXME -fnf */
280 case FT_UNSIGNED_INTEGER:
281 type = init_type (TYPE_CODE_INT,
282 TARGET_INT_BIT / TARGET_CHAR_BIT,
283 TYPE_FLAG_UNSIGNED, "unsigned int", objfile);
286 type = init_type (TYPE_CODE_INT,
287 TARGET_LONG_BIT / TARGET_CHAR_BIT,
291 type = init_type (TYPE_CODE_INT,
292 TARGET_LONG_BIT / TARGET_CHAR_BIT,
293 0, "long", objfile); /* FIXME -fnf */
295 case FT_UNSIGNED_LONG:
296 type = init_type (TYPE_CODE_INT,
297 TARGET_LONG_BIT / TARGET_CHAR_BIT,
298 TYPE_FLAG_UNSIGNED, "unsigned long", objfile);
301 type = init_type (TYPE_CODE_INT,
302 TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
303 0, "long long", objfile);
305 case FT_SIGNED_LONG_LONG:
306 type = init_type (TYPE_CODE_INT,
307 TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
308 0, "signed long long", objfile);
310 case FT_UNSIGNED_LONG_LONG:
311 type = init_type (TYPE_CODE_INT,
312 TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,
313 TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);
316 type = init_type (TYPE_CODE_FLT,
317 TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
318 0, "float", objfile);
320 case FT_DBL_PREC_FLOAT:
321 type = init_type (TYPE_CODE_FLT,
322 TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
323 0, "double", objfile);
325 case FT_EXT_PREC_FLOAT:
326 type = init_type (TYPE_CODE_FLT,
327 TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
328 0, "long double", objfile);
335 /* Table mapping opcodes into strings for printing operators
336 and precedences of the operators. */
338 const struct op_print c_op_print_tab[] =
340 {",", BINOP_COMMA, PREC_COMMA, 0},
341 {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
342 {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
343 {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
344 {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
345 {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
346 {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
347 {"==", BINOP_EQUAL, PREC_EQUAL, 0},
348 {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
349 {"<=", BINOP_LEQ, PREC_ORDER, 0},
350 {">=", BINOP_GEQ, PREC_ORDER, 0},
351 {">", BINOP_GTR, PREC_ORDER, 0},
352 {"<", BINOP_LESS, PREC_ORDER, 0},
353 {">>", BINOP_RSH, PREC_SHIFT, 0},
354 {"<<", BINOP_LSH, PREC_SHIFT, 0},
355 {"+", BINOP_ADD, PREC_ADD, 0},
356 {"-", BINOP_SUB, PREC_ADD, 0},
357 {"*", BINOP_MUL, PREC_MUL, 0},
358 {"/", BINOP_DIV, PREC_MUL, 0},
359 {"%", BINOP_REM, PREC_MUL, 0},
360 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
361 {"-", UNOP_NEG, PREC_PREFIX, 0},
362 {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
363 {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
364 {"*", UNOP_IND, PREC_PREFIX, 0},
365 {"&", UNOP_ADDR, PREC_PREFIX, 0},
366 {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
367 {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
368 {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
370 {"::", BINOP_SCOPE, PREC_PREFIX, 0},
374 struct type ** CONST_PTR (c_builtin_types[]) =
381 &builtin_type_double,
383 &builtin_type_long_long,
384 &builtin_type_signed_char,
385 &builtin_type_unsigned_char,
386 &builtin_type_unsigned_short,
387 &builtin_type_unsigned_int,
388 &builtin_type_unsigned_long,
389 &builtin_type_unsigned_long_long,
390 &builtin_type_long_double,
391 &builtin_type_complex,
392 &builtin_type_double_complex,
396 const struct language_defn c_language_defn = {
397 "c", /* Language name */
404 evaluate_subexp_standard,
405 c_printchar, /* Print a character constant */
406 c_printstr, /* Function to print string constant */
407 c_create_fundamental_type, /* Create fundamental type in this language */
408 c_print_type, /* Print a type using appropriate syntax */
409 c_val_print, /* Print a value using appropriate syntax */
410 c_value_print, /* Print a top-level value */
411 {"", "", "", ""}, /* Binary format info */
412 {"0%lo", "0", "o", ""}, /* Octal format info */
413 {"%ld", "", "d", ""}, /* Decimal format info */
414 {"0x%lx", "0x", "x", ""}, /* Hex format info */
415 c_op_print_tab, /* expression operators for printing */
416 1, /* c-style arrays */
417 0, /* String lower bound */
418 &builtin_type_char, /* Type of string elements */
422 const struct language_defn cplus_language_defn = {
423 "c++", /* Language name */
430 evaluate_subexp_standard,
431 c_printchar, /* Print a character constant */
432 c_printstr, /* Function to print string constant */
433 c_create_fundamental_type, /* Create fundamental type in this language */
434 c_print_type, /* Print a type using appropriate syntax */
435 c_val_print, /* Print a value using appropriate syntax */
436 c_value_print, /* Print a top-level value */
437 {"", "", "", ""}, /* Binary format info */
438 {"0%lo", "0", "o", ""}, /* Octal format info */
439 {"%ld", "", "d", ""}, /* Decimal format info */
440 {"0x%lx", "0x", "x", ""}, /* Hex format info */
441 c_op_print_tab, /* expression operators for printing */
442 1, /* c-style arrays */
443 0, /* String lower bound */
444 &builtin_type_char, /* Type of string elements */
448 const struct language_defn asm_language_defn = {
449 "asm", /* Language name */
456 evaluate_subexp_standard,
457 c_printchar, /* Print a character constant */
458 c_printstr, /* Function to print string constant */
459 c_create_fundamental_type, /* Create fundamental type in this language */
460 c_print_type, /* Print a type using appropriate syntax */
461 c_val_print, /* Print a value using appropriate syntax */
462 c_value_print, /* Print a top-level value */
463 {"", "", "", ""}, /* Binary format info */
464 {"0%lo", "0", "o", ""}, /* Octal format info */
465 {"%ld", "", "d", ""}, /* Decimal format info */
466 {"0x%lx", "0x", "x", ""}, /* Hex format info */
467 c_op_print_tab, /* expression operators for printing */
468 1, /* c-style arrays */
469 0, /* String lower bound */
470 &builtin_type_char, /* Type of string elements */
475 _initialize_c_language ()
477 add_language (&c_language_defn);
478 add_language (&cplus_language_defn);
479 add_language (&asm_language_defn);