X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fc-typeprint.c;h=31a98ea5eaa829788ade2e3b8c79cd3186a82342;hb=5c6ce71d76dc5618b6ebfc967e5c4b99d701ef50;hp=6c5e815e2af2446df95e357b47812b97bfd9561b;hpb=9750e763c18794a2d96ad44db439ac50ee472cf6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index 6c5e815e2a..31a98ea5ea 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -1,13 +1,13 @@ /* Support for printing C and C++ types for GDB, the GNU debugger. - Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998, - 1999, 2000, 2001, 2002 + Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1998, + 1999, 2000, 2001, 2002, 2003, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdb_obstack.h" @@ -38,9 +36,6 @@ #include "gdb_string.h" #include -/* Flag indicating target was compiled by HP compiler */ -extern int hp_som_som_object_present; - static void cp_type_print_method_args (struct type *mtype, char *prefix, char *varstring, int staticp, struct ui_file *stream); @@ -65,7 +60,7 @@ void c_print_type (struct type *type, char *varstring, struct ui_file *stream, int show, int level) { - register enum type_code code; + enum type_code code; int demangled_args; int need_post_space; @@ -83,7 +78,8 @@ c_print_type (struct type *type, char *varstring, struct ui_file *stream, (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC || code == TYPE_CODE_METHOD || code == TYPE_CODE_ARRAY - || code == TYPE_CODE_MEMBER + || code == TYPE_CODE_MEMBERPTR + || code == TYPE_CODE_METHODPTR || code == TYPE_CODE_REF))) fputs_filtered (" ", stream); need_post_space = (varstring != NULL && strcmp (varstring, "") != 0); @@ -101,6 +97,24 @@ c_print_type (struct type *type, char *varstring, struct ui_file *stream, } } +/* Print a typedef using C syntax. TYPE is the underlying type. + NEW_SYMBOL is the symbol naming the type. STREAM is the stream on + which to print. */ + +void +c_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + CHECK_TYPEDEF (type); + fprintf_filtered (stream, "typedef "); + type_print (type, "", stream, 0); + if (TYPE_NAME ((SYMBOL_TYPE (new_symbol))) == 0 + || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))), + SYMBOL_LINKAGE_NAME (new_symbol)) != 0) + fprintf_filtered (stream, " %s", SYMBOL_PRINT_NAME (new_symbol)); + fprintf_filtered (stream, ";\n"); +} + /* If TYPE is a derived type, then print out derivation information. Print only the actual base classes of this type, not the base classes of the base classes. I.E. for the derivation hierarchy: @@ -216,54 +230,55 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream, switch (TYPE_CODE (type)) { case TYPE_CODE_PTR: - c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, 1); + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 1, 1); fprintf_filtered (stream, "*"); c_type_print_modifier (type, stream, 1, need_post_space); break; - case TYPE_CODE_MEMBER: - if (passed_a_ptr) - fprintf_filtered (stream, "("); - c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); - fprintf_filtered (stream, " "); + case TYPE_CODE_MEMBERPTR: + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0); name = type_name_no_tag (TYPE_DOMAIN_TYPE (type)); if (name) fputs_filtered (name, stream); else c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr); - fprintf_filtered (stream, "::"); + fprintf_filtered (stream, "::*"); break; - case TYPE_CODE_METHOD: - if (passed_a_ptr) - fprintf_filtered (stream, "("); - c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); - if (passed_a_ptr) - { - fprintf_filtered (stream, " "); - c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr); - fprintf_filtered (stream, "::"); - } + case TYPE_CODE_METHODPTR: + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0); + fprintf_filtered (stream, "("); + name = type_name_no_tag (TYPE_DOMAIN_TYPE (type)); + if (name) + fputs_filtered (name, stream); + else + c_type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0, passed_a_ptr); + fprintf_filtered (stream, "::*"); break; case TYPE_CODE_REF: - c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0); + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 1, 0); fprintf_filtered (stream, "&"); c_type_print_modifier (type, stream, 1, need_post_space); break; + case TYPE_CODE_METHOD: case TYPE_CODE_FUNC: - c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0); if (passed_a_ptr) fprintf_filtered (stream, "("); break; case TYPE_CODE_ARRAY: - c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0); if (passed_a_ptr) fprintf_filtered (stream, "("); break; + case TYPE_CODE_TYPEDEF: + c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, show, 0, 0); + break; + case TYPE_CODE_UNDEF: case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: @@ -279,13 +294,14 @@ c_type_print_varspec_prefix (struct type *type, struct ui_file *stream, case TYPE_CODE_STRING: case TYPE_CODE_BITSTRING: case TYPE_CODE_COMPLEX: - case TYPE_CODE_TYPEDEF: case TYPE_CODE_TEMPLATE: + case TYPE_CODE_NAMESPACE: + case TYPE_CODE_DECFLOAT: /* These types need no prefix. They are listed here so that gcc -Wall will reveal any types that haven't been handled. */ break; default: - error ("type not handled in c_type_print_varspec_prefix()"); + error (_("type not handled in c_type_print_varspec_prefix()")); break; } } @@ -300,7 +316,7 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, int need_pre_space, int need_post_space) { int did_print_modifier = 0; - char *address_space_id; + const char *address_space_id; /* We don't print `const' qualifiers for references --- since all operators affect the thing referenced, not the reference itself, @@ -336,42 +352,49 @@ c_type_print_modifier (struct type *type, struct ui_file *stream, } - +/* Print out the arguments of TYPE, which should have TYPE_CODE_METHOD + or TYPE_CODE_FUNC, to STREAM. Artificial arguments, such as "this" + in non-static methods, are displayed. */ static void c_type_print_args (struct type *type, struct ui_file *stream) { - int i; + int i, len; struct field *args; + int printed_any = 0; fprintf_filtered (stream, "("); args = TYPE_FIELDS (type); - if (args != NULL) - { - int i; + len = TYPE_NFIELDS (type); - /* FIXME drow/2002-05-31: Always skips the first argument, - should we be checking for static members? */ - - for (i = 1; i < TYPE_NFIELDS (type); i++) + for (i = 0; i < TYPE_NFIELDS (type); i++) + { + if (printed_any) { - c_print_type (args[i].type, "", stream, -1, 0); - if (i != TYPE_NFIELDS (type)) - { - fprintf_filtered (stream, ","); - wrap_here (" "); - } + fprintf_filtered (stream, ", "); + wrap_here (" "); } - if (TYPE_VARARGS (type)) - fprintf_filtered (stream, "..."); - else if (i == 1 - && (current_language->la_language == language_cplus)) - fprintf_filtered (stream, "void"); + + c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0); + printed_any = 1; } - else if (current_language->la_language == language_cplus) + + if (printed_any && TYPE_VARARGS (type)) { - fprintf_filtered (stream, "void"); + /* Print out a trailing ellipsis for varargs functions. Ignore + TYPE_VARARGS if the function has no named arguments; that + represents unprototyped (K&R style) C functions. */ + if (printed_any && TYPE_VARARGS (type)) + { + fprintf_filtered (stream, ", "); + wrap_here (" "); + fprintf_filtered (stream, "..."); + } } + else if (!printed_any + && (TYPE_PROTOTYPED (type) + || current_language->la_language == language_cplus)) + fprintf_filtered (stream, "void"); fprintf_filtered (stream, ")"); } @@ -536,63 +559,46 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, fprintf_filtered (stream, ")"); fprintf_filtered (stream, "["); - if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 + if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED) fprintf_filtered (stream, "%d", (TYPE_LENGTH (type) / TYPE_LENGTH (TYPE_TARGET_TYPE (type)))); fprintf_filtered (stream, "]"); - c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, + 0, 0); break; - case TYPE_CODE_MEMBER: - if (passed_a_ptr) - fprintf_filtered (stream, ")"); - c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); + case TYPE_CODE_MEMBERPTR: + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, + 0, 0); break; - case TYPE_CODE_METHOD: - if (passed_a_ptr) - fprintf_filtered (stream, ")"); - c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); - if (passed_a_ptr) - { - c_type_print_args (type, stream); - } + case TYPE_CODE_METHODPTR: + fprintf_filtered (stream, ")"); + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, + 0, 0); break; case TYPE_CODE_PTR: case TYPE_CODE_REF: - c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0); + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, + 1, 0); break; + case TYPE_CODE_METHOD: case TYPE_CODE_FUNC: if (passed_a_ptr) fprintf_filtered (stream, ")"); if (!demangled_args) - { - int i, len = TYPE_NFIELDS (type); - fprintf_filtered (stream, "("); - if (len == 0 - && (TYPE_PROTOTYPED (type) - || current_language->la_language == language_cplus)) - { - fprintf_filtered (stream, "void"); - } - else - for (i = 0; i < len; i++) - { - if (i > 0) - { - fputs_filtered (", ", stream); - wrap_here (" "); - } - c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0); - } - fprintf_filtered (stream, ")"); - } - c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + c_type_print_args (type, stream); + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, + passed_a_ptr, 0); + break; + + case TYPE_CODE_TYPEDEF: + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, show, passed_a_ptr, 0); break; @@ -611,13 +617,14 @@ c_type_print_varspec_suffix (struct type *type, struct ui_file *stream, case TYPE_CODE_STRING: case TYPE_CODE_BITSTRING: case TYPE_CODE_COMPLEX: - case TYPE_CODE_TYPEDEF: case TYPE_CODE_TEMPLATE: + case TYPE_CODE_NAMESPACE: + case TYPE_CODE_DECFLOAT: /* These types do not need a suffix. They are listed so that gcc -Wall will report types that may not have been considered. */ break; default: - error ("type not handled in c_type_print_varspec_suffix()"); + error (_("type not handled in c_type_print_varspec_suffix()")); break; } } @@ -661,7 +668,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, wrap_here (" "); if (type == NULL) { - fputs_filtered ("", stream); + fputs_filtered (_(""), stream); return; } @@ -686,10 +693,11 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, case TYPE_CODE_TYPEDEF: case TYPE_CODE_ARRAY: case TYPE_CODE_PTR: - case TYPE_CODE_MEMBER: + case TYPE_CODE_MEMBERPTR: case TYPE_CODE_REF: case TYPE_CODE_FUNC: case TYPE_CODE_METHOD: + case TYPE_CODE_METHODPTR: c_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); break; @@ -760,9 +768,9 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0)) { if (TYPE_STUB (type)) - fprintfi_filtered (level + 4, stream, "\n"); + fprintfi_filtered (level + 4, stream, _("\n")); else - fprintfi_filtered (level + 4, stream, "\n"); + fprintfi_filtered (level + 4, stream, _("\n")); } /* Start off with no specific section type, so we can print @@ -845,11 +853,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, { QUIT; /* Don't print out virtual function table. */ - /* HP ANSI C++ case */ - if (TYPE_HAS_VTABLE (type) && (STREQN (TYPE_FIELD_NAME (type, i), "__vfp", 5))) - continue; - /* Other compilers */ - if (STREQN (TYPE_FIELD_NAME (type, i), "_vptr", 5) + if (strncmp (TYPE_FIELD_NAME (type, i), "_vptr", 5) == 0 && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5])) continue; @@ -931,7 +935,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i); char *method_name = TYPE_FN_FIELDLIST_NAME (type, i); char *name = type_name_no_tag (type); - int is_constructor = name && STREQ (method_name, name); + int is_constructor = name && strcmp (method_name, name) == 0; for (j = 0; j < len2; j++) { char *physname = TYPE_FN_FIELD_PHYSNAME (f, j); @@ -979,7 +983,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0) { /* Keep GDB from crashing here. */ - fprintf_filtered (stream, " %s;\n", + fprintf_filtered (stream, _(" %s;\n"), TYPE_FN_FIELD_PHYSNAME (f, j)); break; } @@ -1018,7 +1022,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, stream); } else - fprintf_filtered (stream, "", + fprintf_filtered (stream, _(""), mangled_name); } else @@ -1053,29 +1057,14 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, fprintfi_filtered (level, stream, "}"); if (TYPE_LOCALTYPE_PTR (type) && show >= 0) - fprintfi_filtered (level, stream, " (Local at %s:%d)\n", + fprintfi_filtered (level, stream, _(" (Local at %s:%d)\n"), TYPE_LOCALTYPE_FILE (type), TYPE_LOCALTYPE_LINE (type)); } - if (TYPE_CODE (type) == TYPE_CODE_TEMPLATE) - goto go_back; break; case TYPE_CODE_ENUM: c_type_print_modifier (type, stream, 0, 1); - /* HP C supports sized enums */ - if (hp_som_som_object_present) - switch (TYPE_LENGTH (type)) - { - case 1: - fputs_filtered ("char ", stream); - break; - case 2: - fputs_filtered ("short ", stream); - break; - default: - break; - } fprintf_filtered (stream, "enum "); /* Print the tag name if it exists. The aCC compiler emits a spurious @@ -1125,16 +1114,16 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_UNDEF: - fprintf_filtered (stream, "struct "); + fprintf_filtered (stream, _("struct ")); break; case TYPE_CODE_ERROR: - fprintf_filtered (stream, ""); + fprintf_filtered (stream, _("")); break; case TYPE_CODE_RANGE: /* This should not occur */ - fprintf_filtered (stream, ""); + fprintf_filtered (stream, _("")); break; case TYPE_CODE_TEMPLATE: @@ -1154,21 +1143,11 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, fprintf_filtered (stream, ", "); } fprintf_filtered (stream, "> class "); - /* Yuck, factor this out to a subroutine so we can call - it and return to the point marked with the "goback:" label... - RT */ goto struct_union; - go_back: - if (TYPE_NINSTANTIATIONS (type) > 0) - { - fprintf_filtered (stream, "\ntemplate instantiations:\n"); - for (i = 0; i < TYPE_NINSTANTIATIONS (type); i++) - { - fprintf_filtered (stream, " "); - c_type_print_base (TYPE_INSTANTIATION (type, i), stream, 0, level); - if (i < TYPE_NINSTANTIATIONS (type) - 1) - fprintf_filtered (stream, "\n"); - } - } + + case TYPE_CODE_NAMESPACE: + fputs_filtered ("namespace ", stream); + fputs_filtered (TYPE_TAG_NAME (type), stream); break; default: @@ -1185,7 +1164,7 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, { /* At least for dump_symtab, it is important that this not be an error (). */ - fprintf_filtered (stream, "", + fprintf_filtered (stream, _(""), TYPE_CODE (type)); } break;