X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fm2-typeprint.c;h=46a35bbd211fc56cb6d5feb25d174ae1270be5b9;hb=1180b2c86e7162bbe500802b3c16ea7ab26c6ab6;hp=1f26438b90221c1aa398bff5cd39dce52a806c49;hpb=d5d6fca504d03e4fa016dc91935e7dbc6d1df20e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/m2-typeprint.c b/gdb/m2-typeprint.c index 1f26438b90..46a35bbd21 100644 --- a/gdb/m2-typeprint.c +++ b/gdb/m2-typeprint.c @@ -1,13 +1,13 @@ /* Support for printing Modula 2 types for GDB, the GNU debugger. - Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001, - 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001, 2002, 2003, + 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdb_obstack.h" @@ -56,6 +54,8 @@ static void m2_short_set (struct type *type, struct ui_file *stream, int show, int level); static int m2_long_set (struct type *type, struct ui_file *stream, int show, int level); +static int m2_unbounded_array (struct type *type, struct ui_file *stream, + int show, int level); static void m2_record_fields (struct type *type, struct ui_file *stream, int show, int level); static void m2_unknown (const char *s, struct type *type, @@ -63,6 +63,7 @@ static void m2_unknown (const char *s, struct type *type, int m2_is_long_set (struct type *type); int m2_is_long_set_of_type (struct type *type, struct type **of_type); +int m2_is_unbounded_array (struct type *type); void @@ -73,7 +74,6 @@ m2_print_type (struct type *type, char *varstring, struct ui_file *stream, int demangled_args; CHECK_TYPEDEF (type); - code = TYPE_CODE (type); QUIT; @@ -84,6 +84,7 @@ m2_print_type (struct type *type, char *varstring, struct ui_file *stream, return; } + code = TYPE_CODE (type); switch (TYPE_CODE (type)) { case TYPE_CODE_SET: @@ -91,7 +92,8 @@ m2_print_type (struct type *type, char *varstring, struct ui_file *stream, break; case TYPE_CODE_STRUCT: - if (m2_long_set (type, stream, show, level)) + if (m2_long_set (type, stream, show, level) + || m2_unbounded_array (type, stream, show, level)) break; m2_record_fields (type, stream, show, level); break; @@ -153,9 +155,27 @@ m2_print_type (struct type *type, char *varstring, struct ui_file *stream, } } -/* - * m2_type_name - if a, type, has a name then print it. - */ +/* Print a typedef using M2 syntax. TYPE is the underlying type. + NEW_SYMBOL is the symbol naming the type. STREAM is the stream on + which to print. */ + +void +m2_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + CHECK_TYPEDEF (type); + fprintf_filtered (stream, "TYPE "); + if (!TYPE_NAME (SYMBOL_TYPE (new_symbol)) + || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))), + SYMBOL_LINKAGE_NAME (new_symbol)) != 0) + fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol)); + else + fprintf_filtered (stream, " = "); + type_print (type, "", stream, 0); + fprintf_filtered (stream, ";\n"); +} + +/* m2_type_name - if a, type, has a name then print it. */ void m2_type_name (struct type *type, struct ui_file *stream) @@ -164,9 +184,7 @@ m2_type_name (struct type *type, struct ui_file *stream) fputs_filtered (TYPE_NAME (type), stream); } -/* - * m2_range - displays a Modula-2 subrange type. - */ +/* m2_range - displays a Modula-2 subrange type. */ void m2_range (struct type *type, struct ui_file *stream, int show, @@ -198,16 +216,14 @@ m2_typedef (struct type *type, struct ui_file *stream, int show, m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level); } -/* - * m2_array - prints out a Modula-2 ARRAY ... OF type - */ +/* m2_array - prints out a Modula-2 ARRAY ... OF type. */ static void m2_array (struct type *type, struct ui_file *stream, int show, int level) { fprintf_filtered (stream, "ARRAY ["); if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0 - && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED) + && !TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) { if (TYPE_INDEX_TYPE (type) != 0) { @@ -291,9 +307,6 @@ m2_print_bounds (struct type *type, { struct type *target = TYPE_TARGET_TYPE (type); - if (target == NULL) - target = builtin_type_int; - if (TYPE_NFIELDS(type) == 0) return; @@ -327,9 +340,8 @@ m2_is_long_set (struct type *type) if (TYPE_CODE (type) == TYPE_CODE_STRUCT) { - /* - * check if all fields of the RECORD are consecutive sets - */ + /* check if all fields of the RECORD are consecutive sets. */ + len = TYPE_NFIELDS (type); for (i = TYPE_N_BASECLASSES (type); i < len; i++) { @@ -351,14 +363,12 @@ m2_is_long_set (struct type *type) return 0; } -/* - * m2_get_discrete_bounds - a wrapper for get_discrete_bounds which - * understands that CHARs might be signed. - * This should be integrated into gdbtypes.c - * inside get_discrete_bounds. - */ +/* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which + understands that CHARs might be signed. + This should be integrated into gdbtypes.c + inside get_discrete_bounds. */ -int +static int m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp) { CHECK_TYPEDEF (type); @@ -380,11 +390,9 @@ m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp) } } -/* - * m2_is_long_set_of_type - returns TRUE if the long set was declared as - * SET OF of_type is assigned to the - * subtype. - */ +/* m2_is_long_set_of_type - returns TRUE if the long set was declared as + SET OF of_type is assigned to the + subtype. */ int m2_is_long_set_of_type (struct type *type, struct type **of_type) @@ -403,8 +411,6 @@ m2_is_long_set_of_type (struct type *type, struct type **of_type) return 0; range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)); target = TYPE_TARGET_TYPE (range); - if (target == NULL) - target = builtin_type_int; l1 = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i))); h1 = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1))); @@ -475,12 +481,60 @@ m2_long_set (struct type *type, struct ui_file *stream, int show, int level) return 0; } +/* m2_is_unbounded_array - returns TRUE if, type, should be regarded + as a Modula-2 unbounded ARRAY type. */ + +int +m2_is_unbounded_array (struct type *type) +{ + if (TYPE_CODE (type) == TYPE_CODE_STRUCT) + { + /* + * check if we have a structure with exactly two fields named + * _m2_contents and _m2_high. It also checks to see if the + * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE + * of the pointer determines the unbounded ARRAY OF type. + */ + if (TYPE_NFIELDS (type) != 2) + return 0; + if (strcmp (TYPE_FIELD_NAME (type, 0), "_m2_contents") != 0) + return 0; + if (strcmp (TYPE_FIELD_NAME (type, 1), "_m2_high") != 0) + return 0; + if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) != TYPE_CODE_PTR) + return 0; + return 1; + } + return 0; +} + +/* m2_unbounded_array - if the struct type matches a Modula-2 unbounded + parameter type then display the type as an + ARRAY OF type. Returns TRUE if an unbounded + array type was detected. */ + +static int +m2_unbounded_array (struct type *type, struct ui_file *stream, int show, + int level) +{ + if (m2_is_unbounded_array (type)) + { + if (show > 0) + { + fputs_filtered ("ARRAY OF ", stream); + m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)), + "", stream, 0, level); + } + return 1; + } + return 0; +} + void m2_record_fields (struct type *type, struct ui_file *stream, int show, int level) { - /* Print the tag if it exists. - */ + /* Print the tag if it exists. */ if (TYPE_TAG_NAME (type) != NULL) { if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0) @@ -493,9 +547,9 @@ m2_record_fields (struct type *type, struct ui_file *stream, int show, wrap_here (" "); if (show < 0) { - if (TYPE_CODE (type) == DECLARED_TYPE_STRUCT) + if (TYPE_CODE (type) == TYPE_CODE_STRUCT) fprintf_filtered (stream, "RECORD ... END "); - else if (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION) + else if (TYPE_CODE (type) == TYPE_CODE_UNION) fprintf_filtered (stream, "CASE ... END "); } else if (show > 0)