diff -ur 7.4_orig/gdb/ada-lang.c 7.4_ptypeMixed/gdb/ada-lang.c --- 7.4_orig/gdb/ada-lang.c 2012-01-06 04:34:45.000000000 +0100 +++ 7.4_ptypeMixed/gdb/ada-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -12337,6 +12337,7 @@ ada_printstr, /* Function to print string constant */ emit_char, /* Function to print single char (not used) */ ada_print_type, /* Print a type using appropriate syntax */ + ada_print_type_through_value, /* Print a type using appropriate syntax */ ada_print_typedef, /* Print a typedef using appropriate syntax */ ada_val_print, /* Print a value using appropriate syntax */ ada_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/ada-lang.h 7.4_ptypeMixed/gdb/ada-lang.h --- 7.4_orig/gdb/ada-lang.h 2012-01-04 09:16:55.000000000 +0100 +++ 7.4_ptypeMixed/gdb/ada-lang.h 2012-01-25 22:16:53.000000000 +0100 @@ -160,6 +160,8 @@ /* Defined in ada-typeprint.c */ extern void ada_print_type (struct type *, const char *, struct ui_file *, int, int); +extern void ada_print_type_through_value (struct value *, const char *, struct ui_file *, int, + int); extern void ada_print_typedef (struct type *type, struct symbol *new_symbol, struct ui_file *stream); diff -ur 7.4_orig/gdb/ada-typeprint.c 7.4_ptypeMixed/gdb/ada-typeprint.c --- 7.4_orig/gdb/ada-typeprint.c 2012-01-04 09:16:55.000000000 +0100 +++ 7.4_ptypeMixed/gdb/ada-typeprint.c 2012-01-25 22:16:53.000000000 +0100 @@ -871,3 +871,25 @@ ada_print_type (type, "", stream, 0, 0); fprintf_filtered (stream, "\n"); } + + +/* Print a description of a value value_p. + Output goes to STREAM (via stdio). + If VARSTRING is a non-empty string, print as an Ada variable/field + declaration. + SHOW+1 is the maximum number of levels of internal type structure + to show (this applies to record types, enumerated types, and + array types). + SHOW is the number of levels of internal type structure to show + when there is a type name for the SHOWth deepest level (0th is + outer level). + When SHOW<0, no inner structure is shown. + LEVEL indicates level of recursion (for nested definitions). */ + +void +ada_print_type_through_value (struct value *value_p, const char *varstring, struct ui_file *stream, + int show, int level) +{ + struct type *type_p = value_type(value_p); + ada_print_type(type_p, varstring, stream, show, level); +} diff -ur 7.4_orig/gdb/c-lang.c 7.4_ptypeMixed/gdb/c-lang.c --- 7.4_orig/gdb/c-lang.c 2012-01-04 09:16:59.000000000 +0100 +++ 7.4_ptypeMixed/gdb/c-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -844,6 +844,7 @@ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ c_print_type, /* Print a type using appropriate syntax */ + c_print_type_through_value, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ @@ -967,6 +968,7 @@ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ c_print_type, /* Print a type using appropriate syntax */ + c_print_type_through_value, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ @@ -1008,6 +1010,7 @@ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ c_print_type, /* Print a type using appropriate syntax */ + c_print_type_through_value, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ @@ -1054,6 +1057,7 @@ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ c_print_type, /* Print a type using appropriate syntax */ + c_print_type_through_value, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/c-lang.h 7.4_ptypeMixed/gdb/c-lang.h --- 7.4_orig/gdb/c-lang.h 2012-01-04 09:17:00.000000000 +0100 +++ 7.4_ptypeMixed/gdb/c-lang.h 2012-01-25 22:16:53.000000000 +0100 @@ -66,6 +66,8 @@ /* Defined in c-typeprint.c */ extern void c_print_type (struct type *, const char *, struct ui_file *, int, int); +extern void c_print_type_through_value (struct value *, + const char *, struct ui_file *, int, int); extern void c_print_typedef (struct type *, struct symbol *, @@ -111,6 +113,8 @@ extern void c_type_print_base (struct type *, struct ui_file *, int, int); +extern void c_type_print_base_through_value (struct value *, + struct ui_file *, int, int); /* These are in cp-valprint.c */ diff -ur 7.4_orig/gdb/c-typeprint.c 7.4_ptypeMixed/gdb/c-typeprint.c --- 7.4_orig/gdb/c-typeprint.c 2012-01-04 09:17:00.000000000 +0100 +++ 7.4_ptypeMixed/gdb/c-typeprint.c 2012-02-13 20:08:01.000000000 +0100 @@ -35,23 +35,52 @@ #include "gdb_string.h" #include +static void c_print_type_common( struct value *value, + struct type *type, + const char *varstring, + struct ui_file *stream, + int show, int level ); + static void c_type_print_varspec_prefix (struct type *, struct ui_file *, int, int, int); +/* Print the name of the type */ +static void c_type_print_base_common (struct value *value, struct type *type, struct ui_file *stream, int show, + int level); + /* Print "const", "volatile", or address space modifiers. */ static void c_type_print_modifier (struct type *, struct ui_file *, int, int); - -/* LEVEL is the depth to indent lines by. */ + + +/* \param[in] level The depth to indent lines by. */ void c_print_type (struct type *type, const char *varstring, struct ui_file *stream, int show, int level) { + c_print_type_common(0, type, varstring, stream, show, level); +} + + +/* + \param[in] value Pointer to the value object. \b 0, if the value object is unknown. + + \param[in] type Pointer to the type object. If value object is know it can be determined through: value_type (value) + + \param[in] level The depth to indent lines by. +*/ +static void +c_print_type_common( struct value *value, + struct type *type, + const char *varstring, + struct ui_file *stream, + int show, int level ) +{ enum type_code code; int demangled_args; int need_post_space; @@ -59,7 +88,7 @@ if (show > 0) CHECK_TYPEDEF (type); - c_type_print_base (type, stream, show, level); + c_type_print_base_common (value, type, stream, show, level); code = TYPE_CODE (type); if ((varstring != NULL && *varstring != '\0') /* Need a space if going to print stars or brackets; @@ -88,6 +117,17 @@ } } + +/* \param[in] level The depth to indent lines by. +*/ +void +c_print_type_through_value (struct value *value, const char *varstring, struct ui_file *stream, + int show, int level) +{ + c_print_type_common(value, value_type(value), varstring, stream, show, level); +} + + /* 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. */ @@ -715,6 +755,42 @@ c_type_print_base (struct type *type, struct ui_file *stream, int show, int level) { + c_type_print_base_common(0, type, stream, show, level); +} + + +/* Print the name of the type (or the ultimate pointer target, + function value or array element), or the description of a structure + or union. + + SHOW positive means print details about the type (e.g. enum + values), and print structure elements passing SHOW - 1 for show. + + SHOW negative means just print the type name or struct tag if there + is one. If there is no name, print something sensible but concise + like "struct {...}". + + SHOW zero means just print the type name or struct tag if there is + one. If there is no name, print something sensible but not as + concise like "struct {int x; int y;}". + + LEVEL is the number of spaces to indent by. + We increase it for some recursive calls. + + \param[in] value Pointer to the value object. \b 0, if the value object is unknown. + + \param[in] type Pointer to the type object. If value object is know it can be determined through: value_type (value) + + \remarks Like c_type_print_base but if it is a bitfield variable, the + position and size will be shown if is not equal to 0. +*/ +static void +c_type_print_base_common (struct value *value, + struct type *type, + struct ui_file *stream, + int show, + int level ) +{ int i; int len, real_len; int lastval; @@ -1247,6 +1323,24 @@ { c_type_print_modifier (type, stream, 0, 1); fputs_filtered (TYPE_NAME (type), stream); + + if ( value != 0 ) + { /* Function is called with value pointer. */ + { /* show the bit position of this value, if it is not equal to 0 */ + int bitpos_i = value_bitpos(value); + if (bitpos_i != 0) + { + fprintf_filtered (stream, ", bitpos = %d", bitpos_i); + } + } + { /* show the bit size of this value, if it is not equal to 0 */ + int bitsize_i = value_bitsize(value); + if (bitsize_i != 0) + { + fprintf_filtered (stream, ", bitsize = %d", bitsize_i); + } + } + } } else { @@ -1258,3 +1352,31 @@ break; } } + + +/* Print the name of the type (or the ultimate pointer target, + function value or array element), or the description of a + structure or union. + + SHOW positive means print details about the type (e.g. enum values), + and print structure elements passing SHOW - 1 for show. + SHOW negative means just print the type name or struct tag if there is one. + If there is no name, print something sensible but concise like + "struct {...}". + SHOW zero means just print the type name or struct tag if there is one. + If there is no name, print something sensible but not as concise like + "struct {int x; int y;}". + + LEVEL is the number of spaces to indent by. + We increase it for some recursive calls. + + \remarks Like c_type_print_base but if it is a bitfield variable, the + position and size will be shown if is not equal to 0. +*/ +void +c_type_print_base_through_value (struct value *value, struct ui_file *stream, int show, + int level) +{ + c_type_print_base_common(value, value_type(value), stream, show, level); +} + diff -ur 7.4_orig/gdb/d-lang.c 7.4_ptypeMixed/gdb/d-lang.c --- 7.4_orig/gdb/d-lang.c 2012-01-04 09:17:00.000000000 +0100 +++ 7.4_ptypeMixed/gdb/d-lang.c 2012-02-10 21:34:32.000000000 +0100 @@ -252,6 +252,8 @@ c_printstr, /* Function to print string constant. */ c_emit_char, /* Print a single char. */ c_print_type, /* Print a type using appropriate syntax. */ + c_print_type_through_value, /* Print a type using appropriate + syntax */ c_print_typedef, /* Print a typedef using appropriate syntax. */ d_val_print, /* Print a value using appropriate syntax. */ diff -ur 7.4_orig/gdb/eval.c 7.4_ptypeMixed/gdb/eval.c --- 7.4_orig/gdb/eval.c 2012-01-09 21:27:48.000000000 +0100 +++ 7.4_ptypeMixed/gdb/eval.c 2012-02-07 19:24:13.000000000 +0100 @@ -1945,12 +1945,6 @@ arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); if (noside == EVAL_SKIP) goto nosideret; - if (noside == EVAL_AVOID_SIDE_EFFECTS) - return value_zero (lookup_struct_elt_type (value_type (arg1), - &exp->elts[pc + 2].string, - 0), - lval_memory); - else { struct value *temp = arg1; diff -ur 7.4_orig/gdb/f-lang.c 7.4_ptypeMixed/gdb/f-lang.c --- 7.4_orig/gdb/f-lang.c 2012-01-04 09:17:02.000000000 +0100 +++ 7.4_ptypeMixed/gdb/f-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -290,6 +290,7 @@ f_printstr, /* function to print string constant */ f_emit_char, /* Function to print a single character */ f_print_type, /* Print a type using appropriate syntax */ + f_print_type_through_value, /* Print a type using appropriate syntax */ default_print_typedef, /* Print a typedef using appropriate syntax */ f_val_print, /* Print a value using appropriate syntax */ c_value_print, /* FIXME */ diff -ur 7.4_orig/gdb/f-lang.h 7.4_ptypeMixed/gdb/f-lang.h --- 7.4_orig/gdb/f-lang.h 2012-01-04 09:17:02.000000000 +0100 +++ 7.4_ptypeMixed/gdb/f-lang.h 2012-01-25 22:16:53.000000000 +0100 @@ -27,6 +27,8 @@ extern void f_print_type (struct type *, const char *, struct ui_file *, int, int); +extern void f_print_type_through_value (struct value *, const char *, struct ui_file *, int, + int); extern int f_val_print (struct type *, const gdb_byte *, int, CORE_ADDR, struct ui_file *, int, diff -ur 7.4_orig/gdb/f-typeprint.c 7.4_ptypeMixed/gdb/f-typeprint.c --- 7.4_orig/gdb/f-typeprint.c 2012-01-04 09:17:02.000000000 +0100 +++ 7.4_ptypeMixed/gdb/f-typeprint.c 2012-01-25 22:16:53.000000000 +0100 @@ -82,6 +82,18 @@ } } + +/* LEVEL is the depth to indent lines by. */ + +void +f_print_type_through_value (struct value *value_p, const char *varstring, struct ui_file *stream, + int show, int level) +{ + struct type *type_p = value_type(value_p); + f_print_type (type_p, varstring, stream, show, level); +} + + /* Print any asterisks or open-parentheses needed before the variable name (to describe its type). diff -ur 7.4_orig/gdb/jv-lang.c 7.4_ptypeMixed/gdb/jv-lang.c --- 7.4_orig/gdb/jv-lang.c 2012-01-08 22:02:45.000000000 +0100 +++ 7.4_ptypeMixed/gdb/jv-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -1178,6 +1178,7 @@ java_printstr, /* Function to print string constant */ java_emit_char, /* Function to print a single character */ java_print_type, /* Print a type using appropriate syntax */ + java_print_type_through_value, /* Print a type using appropriate syntax */ default_print_typedef, /* Print a typedef using appropriate syntax */ java_val_print, /* Print a value using appropriate syntax */ java_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/jv-lang.h 7.4_ptypeMixed/gdb/jv-lang.h --- 7.4_orig/gdb/jv-lang.h 2012-01-04 09:17:05.000000000 +0100 +++ 7.4_ptypeMixed/gdb/jv-lang.h 2012-01-25 22:16:53.000000000 +0100 @@ -71,6 +71,8 @@ /* Defined in jv-typeprint.c */ extern void java_print_type (struct type *, const char *, struct ui_file *, int, int); +extern void java_print_type_through_value (struct value *, const char *, + struct ui_file *, int, int); extern char *java_demangle_type_signature (char *); diff -ur 7.4_orig/gdb/jv-typeprint.c 7.4_ptypeMixed/gdb/jv-typeprint.c --- 7.4_orig/gdb/jv-typeprint.c 2012-01-04 09:17:05.000000000 +0100 +++ 7.4_ptypeMixed/gdb/jv-typeprint.c 2012-01-25 22:16:53.000000000 +0100 @@ -352,3 +352,12 @@ demangled_args = varstring != NULL && strchr (varstring, '(') != NULL; c_type_print_varspec_suffix (type, stream, show, 0, demangled_args); } + + +void +java_print_type_through_value (struct value *value_p, const char *varstring, struct ui_file *stream, + int show, int level) +{ + struct type *type_p = value_type(value_p); + java_print_type (type_p, varstring, stream, show, level); +} diff -ur 7.4_orig/gdb/language.c 7.4_ptypeMixed/gdb/language.c --- 7.4_orig/gdb/language.c 2012-01-04 19:57:01.000000000 +0100 +++ 7.4_ptypeMixed/gdb/language.c 2012-01-25 22:16:53.000000000 +0100 @@ -847,6 +847,13 @@ "function unk_lang_print_type called.")); } +static void +unk_lang_print_type_through_value (struct value *value, const char *varstring, struct ui_file *stream, + int show, int level) +{ + error (_("internal error - unimplemented function unk_lang_print_type_through_value called.")); +} + static int unk_lang_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR address, @@ -914,6 +921,7 @@ unk_lang_printstr, unk_lang_emit_char, unk_lang_print_type, /* Print a type using appropriate syntax */ + unk_lang_print_type_through_value, /* Print a type using appropriate syntax */ default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ @@ -957,6 +965,7 @@ unk_lang_printstr, unk_lang_emit_char, unk_lang_print_type, /* Print a type using appropriate syntax */ + unk_lang_print_type_through_value, /* Print a type using appropriate syntax */ default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ @@ -998,6 +1007,7 @@ unk_lang_printstr, unk_lang_emit_char, unk_lang_print_type, /* Print a type using appropriate syntax */ + unk_lang_print_type_through_value, /* Print a type using appropriate syntax */ default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/language.h 7.4_ptypeMixed/gdb/language.h --- 7.4_orig/gdb/language.h 2012-01-04 19:57:01.000000000 +0100 +++ 7.4_ptypeMixed/gdb/language.h 2012-01-25 22:16:53.000000000 +0100 @@ -202,6 +202,12 @@ void (*la_print_type) (struct type *, const char *, struct ui_file *, int, int); + /* Print a type (through value structure) using syntax appropriate for + this language. */ + + void (*la_print_type_through_value) (struct value *, const char *, struct ui_file *, int, + int); + /* Print a typedef using syntax appropriate for this language. TYPE is the underlying type. NEW_SYMBOL is the symbol naming the type. STREAM is the output stream on which to print. */ @@ -433,6 +439,8 @@ #define LA_PRINT_TYPE(type,varstring,stream,show,level) \ (current_language->la_print_type(type,varstring,stream,show,level)) +#define LA_PRINT_TYPE_THROUGH_VALUE(value,varstring,stream,show,level) \ + (current_language->la_print_type_through_value(value,varstring,stream,show,level)) #define LA_PRINT_TYPEDEF(type,new_symbol,stream) \ (current_language->la_print_typedef(type,new_symbol,stream)) diff -ur 7.4_orig/gdb/m2-lang.c 7.4_ptypeMixed/gdb/m2-lang.c --- 7.4_orig/gdb/m2-lang.c 2012-01-04 09:17:05.000000000 +0100 +++ 7.4_ptypeMixed/gdb/m2-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -382,6 +382,7 @@ m2_printstr, /* function to print string constant */ m2_emit_char, /* Function to print a single character */ m2_print_type, /* Print a type using appropriate syntax */ + m2_print_type_through_value, /* Print a type using appropriate syntax */ m2_print_typedef, /* Print a typedef using appropriate syntax */ m2_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/m2-lang.h 7.4_ptypeMixed/gdb/m2-lang.h --- 7.4_orig/gdb/m2-lang.h 2012-01-04 09:17:05.000000000 +0100 +++ 7.4_ptypeMixed/gdb/m2-lang.h 2012-01-25 22:16:53.000000000 +0100 @@ -25,6 +25,8 @@ /* Defined in m2-typeprint.c */ extern void m2_print_type (struct type *, const char *, struct ui_file *, int, int); +extern void m2_print_type_through_value (struct value *, const char *, struct ui_file *, int, + int); extern void m2_print_typedef (struct type *, struct symbol *, struct ui_file *); diff -ur 7.4_orig/gdb/m2-typeprint.c 7.4_ptypeMixed/gdb/m2-typeprint.c --- 7.4_orig/gdb/m2-typeprint.c 2012-01-04 09:17:05.000000000 +0100 +++ 7.4_ptypeMixed/gdb/m2-typeprint.c 2012-01-25 22:16:53.000000000 +0100 @@ -151,6 +151,16 @@ } } + +void +m2_print_type_through_value (struct value *value_p, const char *varstring, struct ui_file *stream, + int show, int level) +{ + struct type *type_p = value_type(value_p); + m2_print_type (type_p, varstring, stream, show, level); +} + + /* 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. */ diff -ur 7.4_orig/gdb/objc-lang.c 7.4_ptypeMixed/gdb/objc-lang.c --- 7.4_orig/gdb/objc-lang.c 2012-01-04 09:17:08.000000000 +0100 +++ 7.4_ptypeMixed/gdb/objc-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -521,6 +521,7 @@ objc_printstr, /* Function to print string constant */ objc_emit_char, c_print_type, /* Print a type using appropriate syntax */ + c_print_type_through_value, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/opencl-lang.c 7.4_ptypeMixed/gdb/opencl-lang.c --- 7.4_orig/gdb/opencl-lang.c 2012-01-04 09:17:09.000000000 +0100 +++ 7.4_ptypeMixed/gdb/opencl-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -1005,6 +1005,7 @@ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ c_print_type, /* Print a type using appropriate syntax */ + c_print_type_through_value, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ c_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/p-lang.c 7.4_ptypeMixed/gdb/p-lang.c --- 7.4_orig/gdb/p-lang.c 2012-01-04 09:17:09.000000000 +0100 +++ 7.4_ptypeMixed/gdb/p-lang.c 2012-01-25 22:16:53.000000000 +0100 @@ -441,6 +441,7 @@ pascal_printstr, /* Function to print string constant */ pascal_emit_char, /* Print a single char */ pascal_print_type, /* Print a type using appropriate syntax */ + pascal_print_type_through_value, /* Print a type using appropriate syntax */ pascal_print_typedef, /* Print a typedef using appropriate syntax */ pascal_val_print, /* Print a value using appropriate syntax */ pascal_value_print, /* Print a top-level value */ diff -ur 7.4_orig/gdb/p-lang.h 7.4_ptypeMixed/gdb/p-lang.h --- 7.4_orig/gdb/p-lang.h 2012-01-04 09:17:09.000000000 +0100 +++ 7.4_ptypeMixed/gdb/p-lang.h 2012-01-25 22:16:53.000000000 +0100 @@ -32,6 +32,9 @@ extern void pascal_print_type (struct type *, const char *, struct ui_file *, int, int); +extern void pascal_print_type_through_value (struct value *, const char *, + struct ui_file *, int, int); + extern void pascal_print_typedef (struct type *, struct symbol *, struct ui_file *); diff -ur 7.4_orig/gdb/p-typeprint.c 7.4_ptypeMixed/gdb/p-typeprint.c --- 7.4_orig/gdb/p-typeprint.c 2012-01-04 09:17:09.000000000 +0100 +++ 7.4_ptypeMixed/gdb/p-typeprint.c 2012-01-25 22:16:53.000000000 +0100 @@ -89,6 +89,18 @@ } + +/* LEVEL is the depth to indent lines by. */ + +void +pascal_print_type_through_value (struct value *value_p, const char *varstring, struct ui_file *stream, + int show, int level) +{ + struct type *type_p = value_type(value_p); + pascal_print_type (type_p, varstring, stream, show, level); +} + + /* Print a typedef using Pascal syntax. TYPE is the underlying type. NEW_SYMBOL is the symbol naming the type. STREAM is the stream on which to print. */ diff -ur 7.4_orig/gdb/testsuite/gdb.base/bitfields2.exp 7.4_ptypeMixed/gdb/testsuite/gdb.base/bitfields2.exp --- 7.4_orig/gdb/testsuite/gdb.base/bitfields2.exp 2012-01-16 17:21:44.000000000 +0100 +++ 7.4_ptypeMixed/gdb/testsuite/gdb.base/bitfields2.exp 2012-02-10 21:42:17.000000000 +0100 @@ -62,7 +62,39 @@ } continue_test $function "#0" } - + + +# +# Test bitfield member bit position and bit size +# + +proc bitfield_ptype {} { + global decimal + global hex + global gdb_prompt + global srcfile + + # \r\n for new line; " *" for white spaces + if [gdb_test "ptype flags" "type = struct fields {\r\n *long long unsigned int u1 : 15;\r\n *long long unsigned int u2 : 33;\r\n *long long unsigned int u3 : 16;\r\n *long long int s1 : 15;\r\n *long long int s2 : 33;\r\n *long long int s3 : 16;\r\n}"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.u1" "type = long long unsigned int, bitsize = 15"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.u2" "type = long long unsigned int, bitpos = 15, bitsize = 33"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.s1" "type = long long int, bitsize = 15"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.s2" "type = long long int, bitpos = 15, bitsize = 33"] { + gdb_suppress_tests; + } +} # # Test bitfield locating and uniqueness. @@ -287,6 +319,7 @@ gdb_test_no_output "set print sevenbit-strings" runto_main +bitfield_ptype bitfield_uniqueness bitfield_containment bitfield_unsignedness diff -ur 7.4_orig/gdb/testsuite/gdb.base/bitfields.exp 7.4_ptypeMixed/gdb/testsuite/gdb.base/bitfields.exp --- 7.4_orig/gdb/testsuite/gdb.base/bitfields.exp 2012-01-16 17:21:44.000000000 +0100 +++ 7.4_ptypeMixed/gdb/testsuite/gdb.base/bitfields.exp 2012-02-10 21:25:06.000000000 +0100 @@ -26,6 +26,34 @@ } # +# Test bitfield member bit position and bit size +# + +proc bitfield_ptype {} { + global decimal + global hex + global gdb_prompt + global srcfile + + # \r\n for new line; " *" for white spaces + if [gdb_test "ptype flags" "type = struct fields {\r\n *unsigned char uc;\r\n *int s1 : 1;\r\n *unsigned int u1 : 1;\r\n *int s2 : 2;\r\n *unsigned int u2 : 2;\r\n *int s3 : 3;\r\n *unsigned int u3 : 3;\r\n *int s9 : 9;\r\n *unsigned int u9 : 9;\r\n *signed char sc;\r\n}"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.s9" "type = int, bitpos = 20, bitsize = 9"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.u9" "type = unsigned int, bitsize = 9"] { + gdb_suppress_tests; + } + + if [gdb_test "ptype flags.sc" "type = signed char"] { + gdb_suppress_tests; + } +} + +# # Test bitfield locating and uniqueness. # For each member, set that member to 1 and verify that the member (and only # that member) is 1, then reset it back to 0. @@ -252,6 +280,7 @@ gdb_test_no_output "set print sevenbit-strings" +bitfield_ptype bitfield_uniqueness if [istarget "mips-idt-*"] then { # Restart because IDT/SIM runs out of file descriptors. diff -ur 7.4_orig/gdb/typeprint.c 7.4_ptypeMixed/gdb/typeprint.c --- 7.4_orig/gdb/typeprint.c 2012-01-04 09:27:57.000000000 +0100 +++ 7.4_ptypeMixed/gdb/typeprint.c 2012-02-07 19:25:57.000000000 +0100 @@ -79,6 +79,20 @@ LA_PRINT_TYPE (type, varstring, stream, show, 0); } +/* Print a description of a type TYPE in the form of a declaration of a + variable named VARSTRING. (VARSTRING is demangled if necessary.) + Output goes to STREAM (via stdio). + If SHOW is positive, we show the contents of the outermost level + of structure even if there is a type name that could be used instead. + If SHOW is negative, we never show the details of elements' types. */ + +void +type_print_through_value (struct value *value, char *varstring, struct ui_file *stream, + int show) +{ + LA_PRINT_TYPE_THROUGH_VALUE (value, varstring, stream, show, 0); +} + /* Print TYPE to a string, returning it. The caller is responsible for freeing the string. */ @@ -164,7 +178,10 @@ printf_filtered (" */\n"); } - type_print (type, "", gdb_stdout, show); + /* To see the positon and size of bitfields changed from + type_print (type, "", gdb_stdout, show); + to: */ + type_print_through_value (val, "", gdb_stdout, show); printf_filtered ("\n"); if (exp) diff -ur 7.4_orig/gdb/value.h 7.4_ptypeMixed/gdb/value.h --- 7.4_orig/gdb/value.h 2012-01-04 09:27:58.000000000 +0100 +++ 7.4_ptypeMixed/gdb/value.h 2012-01-25 22:16:53.000000000 +0100 @@ -779,6 +779,8 @@ extern void type_print (struct type *type, char *varstring, struct ui_file *stream, int show); +extern void type_print_through_value (struct value *value, char *varstring, + struct ui_file *stream, int show); extern char *type_to_string (struct type *type);