From f0559fff600165f5cbdf546737217e1da3f737b8 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Fri, 2 Nov 2012 00:14:39 +0000 Subject: [PATCH] gdb: 2012-11-02 Yao Qi * std-operator.def: Remove OP_LABELED. * eval.c: Remove the declaration of 'get_label'. (get_label): Remove. (evaluate_struct_tuple): Remove code handling OP_LABELED. Update comment. Remove local variable 'variantno' and related code. Replace 'substruct_type' with 'struct_type'. Replace 'subfieldno' with 'fieldno'. * expprint.c (print_subexp_standard): Likewise. (dump_subexp_body_standard): Likewise. * parse.c (operator_length_standard): Likewise. gdb/testsuite: 2012-11-02 Yao Qi * gdb.base/setvar.exp: Test setting nested struct. * gdb.base/setvar.c (v_struct3): New. --- gdb/ChangeLog | 14 +++ gdb/eval.c | 193 +++++++++----------------------------- gdb/expprint.c | 16 ---- gdb/parse.c | 1 - gdb/std-operator.def | 13 --- gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.base/setvar.c | 7 ++ gdb/testsuite/gdb.base/setvar.exp | 8 ++ 8 files changed, 77 insertions(+), 180 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 96000de..adcdb97 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2012-11-02 Yao Qi + + * std-operator.def: Remove OP_LABELED. + * eval.c: Remove the declaration of 'get_label'. + (get_label): Remove. + (evaluate_struct_tuple): Remove code handling OP_LABELED. + Update comment. + Remove local variable 'variantno' and related code. + Replace 'substruct_type' with 'struct_type'. Replace 'subfieldno' + with 'fieldno'. + * expprint.c (print_subexp_standard): Likewise. + (dump_subexp_body_standard): Likewise. + * parse.c (operator_length_standard): Likewise. + 2012-11-01 Pierre Muller Incorporate ARI web page generator into GDB sources. diff --git a/gdb/eval.c b/gdb/eval.c index 26e0cc8..f655957 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -56,8 +56,6 @@ static struct value *evaluate_subexp_for_sizeof (struct expression *, int *); static struct value *evaluate_subexp_for_address (struct expression *, int *, enum noside); -static char *get_label (struct expression *, int *); - static struct value *evaluate_struct_tuple (struct value *, struct expression *, int *, enum noside, int); @@ -280,27 +278,8 @@ extract_field_op (struct expression *exp, int *subexp) return result; } -/* If the next expression is an OP_LABELED, skips past it, - returning the label. Otherwise, does nothing and returns NULL. */ - -static char * -get_label (struct expression *exp, int *pos) -{ - if (exp->elts[*pos].opcode == OP_LABELED) - { - int pc = (*pos)++; - char *name = &exp->elts[pc + 2].string; - int tem = longest_to_int (exp->elts[pc + 1].longconst); - - (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); - return name; - } - else - return NULL; -} - -/* This function evaluates tuples (in (the deleted) Chill) or - brace-initializers (in C/C++) for structure types. */ +/* This function evaluates brace-initializers (in C/C++) for + structure types. */ static struct value * evaluate_struct_tuple (struct value *struct_val, @@ -308,143 +287,57 @@ evaluate_struct_tuple (struct value *struct_val, int *pos, enum noside noside, int nargs) { struct type *struct_type = check_typedef (value_type (struct_val)); - struct type *substruct_type = struct_type; struct type *field_type; int fieldno = -1; - int variantno = -1; - int subfieldno = -1; while (--nargs >= 0) { - int pc = *pos; struct value *val = NULL; - int nlabels = 0; int bitpos, bitsize; bfd_byte *addr; - /* Skip past the labels, and count them. */ - while (get_label (exp, pos) != NULL) - nlabels++; - - do - { - char *label = get_label (exp, &pc); - - if (label) - { - for (fieldno = 0; fieldno < TYPE_NFIELDS (struct_type); - fieldno++) - { - const char *field_name = - TYPE_FIELD_NAME (struct_type, fieldno); - - if (field_name != NULL && strcmp (field_name, label) == 0) - { - variantno = -1; - subfieldno = fieldno; - substruct_type = struct_type; - goto found; - } - } - for (fieldno = 0; fieldno < TYPE_NFIELDS (struct_type); - fieldno++) - { - const char *field_name = - TYPE_FIELD_NAME (struct_type, fieldno); - - field_type = TYPE_FIELD_TYPE (struct_type, fieldno); - if ((field_name == 0 || *field_name == '\0') - && TYPE_CODE (field_type) == TYPE_CODE_UNION) - { - variantno = 0; - for (; variantno < TYPE_NFIELDS (field_type); - variantno++) - { - substruct_type - = TYPE_FIELD_TYPE (field_type, variantno); - if (TYPE_CODE (substruct_type) == TYPE_CODE_STRUCT) - { - for (subfieldno = 0; - subfieldno < TYPE_NFIELDS (substruct_type); - subfieldno++) - { - if (strcmp(TYPE_FIELD_NAME (substruct_type, - subfieldno), - label) == 0) - { - goto found; - } - } - } - } - } - } - error (_("there is no field named %s"), label); - found: - ; - } - else - { - /* Unlabelled tuple element - go to next field. */ - if (variantno >= 0) - { - subfieldno++; - if (subfieldno >= TYPE_NFIELDS (substruct_type)) - { - variantno = -1; - substruct_type = struct_type; - } - } - if (variantno < 0) - { - fieldno++; - /* Skip static fields. */ - while (fieldno < TYPE_NFIELDS (struct_type) - && field_is_static (&TYPE_FIELD (struct_type, - fieldno))) - fieldno++; - subfieldno = fieldno; - if (fieldno >= TYPE_NFIELDS (struct_type)) - error (_("too many initializers")); - field_type = TYPE_FIELD_TYPE (struct_type, fieldno); - if (TYPE_CODE (field_type) == TYPE_CODE_UNION - && TYPE_FIELD_NAME (struct_type, fieldno)[0] == '0') - error (_("don't know which variant you want to set")); - } - } + fieldno++; + /* Skip static fields. */ + while (fieldno < TYPE_NFIELDS (struct_type) + && field_is_static (&TYPE_FIELD (struct_type, + fieldno))) + fieldno++; + if (fieldno >= TYPE_NFIELDS (struct_type)) + error (_("too many initializers")); + field_type = TYPE_FIELD_TYPE (struct_type, fieldno); + if (TYPE_CODE (field_type) == TYPE_CODE_UNION + && TYPE_FIELD_NAME (struct_type, fieldno)[0] == '0') + error (_("don't know which variant you want to set")); + + /* Here, struct_type is the type of the inner struct, + while substruct_type is the type of the inner struct. + These are the same for normal structures, but a variant struct + contains anonymous union fields that contain substruct fields. + The value fieldno is the index of the top-level (normal or + anonymous union) field in struct_field, while the value + subfieldno is the index of the actual real (named inner) field + in substruct_type. */ + + field_type = TYPE_FIELD_TYPE (struct_type, fieldno); + if (val == 0) + val = evaluate_subexp (field_type, exp, pos, noside); + + /* Now actually set the field in struct_val. */ + + /* Assign val to field fieldno. */ + if (value_type (val) != field_type) + val = value_cast (field_type, val); + + bitsize = TYPE_FIELD_BITSIZE (struct_type, fieldno); + bitpos = TYPE_FIELD_BITPOS (struct_type, fieldno); + addr = value_contents_writeable (struct_val) + bitpos / 8; + if (bitsize) + modify_field (struct_type, addr, + value_as_long (val), bitpos % 8, bitsize); + else + memcpy (addr, value_contents (val), + TYPE_LENGTH (value_type (val))); - /* Here, struct_type is the type of the inner struct, - while substruct_type is the type of the inner struct. - These are the same for normal structures, but a variant struct - contains anonymous union fields that contain substruct fields. - The value fieldno is the index of the top-level (normal or - anonymous union) field in struct_field, while the value - subfieldno is the index of the actual real (named inner) field - in substruct_type. */ - - field_type = TYPE_FIELD_TYPE (substruct_type, subfieldno); - if (val == 0) - val = evaluate_subexp (field_type, exp, pos, noside); - - /* Now actually set the field in struct_val. */ - - /* Assign val to field fieldno. */ - if (value_type (val) != field_type) - val = value_cast (field_type, val); - - bitsize = TYPE_FIELD_BITSIZE (substruct_type, subfieldno); - bitpos = TYPE_FIELD_BITPOS (struct_type, fieldno); - if (variantno >= 0) - bitpos += TYPE_FIELD_BITPOS (substruct_type, subfieldno); - addr = value_contents_writeable (struct_val) + bitpos / 8; - if (bitsize) - modify_field (struct_type, addr, - value_as_long (val), bitpos % 8, bitsize); - else - memcpy (addr, value_contents (val), - TYPE_LENGTH (value_type (val))); - } - while (--nlabels > 0); } return struct_val; } diff --git a/gdb/expprint.c b/gdb/expprint.c index baaa08a..129dfa7 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -328,21 +328,6 @@ print_subexp_standard (struct expression *exp, int *pos, } return; - case OP_LABELED: - tem = longest_to_int (exp->elts[pc + 1].longconst); - (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1); - /* Gcc support both these syntaxes. Unsure which is preferred. */ -#if 1 - fputs_filtered (&exp->elts[pc + 2].string, stream); - fputs_filtered (": ", stream); -#else - fputs_filtered (".", stream); - fputs_filtered (&exp->elts[pc + 2].string, stream); - fputs_filtered ("=", stream); -#endif - print_subexp (exp, pos, stream, PREC_SUFFIX); - return; - case TERNOP_COND: if ((int) prec > (int) PREC_COMMA) fputs_filtered ("(", stream); @@ -1031,7 +1016,6 @@ dump_subexp_body_standard (struct expression *exp, case OP_BOOL: case OP_M2_STRING: case OP_THIS: - case OP_LABELED: case OP_NAME: fprintf_filtered (stream, "Unknown format"); } diff --git a/gdb/parse.c b/gdb/parse.c index 3ec1e25..afe1c18 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -951,7 +951,6 @@ operator_length_standard (const struct expression *expr, int endpos, oplen++; break; - case OP_LABELED: case STRUCTOP_STRUCT: case STRUCTOP_PTR: args = 1; diff --git a/gdb/std-operator.def b/gdb/std-operator.def index dcba39f..5df0081 100644 --- a/gdb/std-operator.def +++ b/gdb/std-operator.def @@ -286,19 +286,6 @@ OP (OP_OBJC_SELECTOR) a string, which, of course, is variable length. */ OP (OP_SCOPE) -/* Used to represent named structure field values in brace - initializers (or tuples as they are called in (the deleted) - Chill). - - The gcc C syntax is NAME:VALUE or .NAME=VALUE, the (the - deleted) Chill syntax is .NAME:VALUE. Multiple labels (as in - the (the deleted) Chill syntax .NAME1,.NAME2:VALUE) is - represented as if it were .NAME1:(.NAME2:VALUE) (though that is - not valid (the deleted) Chill syntax). - - The NAME is represented as for STRUCTOP_STRUCT; VALUE follows. */ -OP (OP_LABELED) - /* OP_TYPE is for parsing types, and used with the "ptype" command so we can look up types that are qualified by scope, either with the GDB "::" operator, or the Modula-2 '.' operator. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ccd4994..650c193 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-02 Yao Qi + + * gdb.base/setvar.exp: Test setting nested struct. + * gdb.base/setvar.c (v_struct3): New. + 2012-11-01 Doug Evans * gdb.arch/amd64-pseudo.c (main): Mark registers that the testsuite diff --git a/gdb/testsuite/gdb.base/setvar.c b/gdb/testsuite/gdb.base/setvar.c index 83509cd..3a80b22 100644 --- a/gdb/testsuite/gdb.base/setvar.c +++ b/gdb/testsuite/gdb.base/setvar.c @@ -115,6 +115,13 @@ struct { double v_double_member; } v_struct2; +struct +{ + long v_long_member; + struct t_struct t; + char v_char_member; +} v_struct3; + /**** unions *******/ union t_union { diff --git a/gdb/testsuite/gdb.base/setvar.exp b/gdb/testsuite/gdb.base/setvar.exp index 7faa10a..3c5251f 100644 --- a/gdb/testsuite/gdb.base/setvar.exp +++ b/gdb/testsuite/gdb.base/setvar.exp @@ -383,6 +383,14 @@ test_set "set variable v_struct1 = {'h', 1, 2, 3, 4.0, 5.0}" \ v_long_member = 3,.*v_float_member = 4,.*v_double_member = 5.*\\}" \ "set print structure #3" +# +# test "set variable" for nested struct +# +test_set "set variable v_struct3 = {1, {'h', 1, 2, 3, 4.0, 5.0}, 37}" \ + "print v_struct3" \ + ".*.\[0-9\]* = \\{.*v_long_member = 1,.*t = \\{.*v_char_member = 104 \'h\',.*v_short_member = 1,.*v_int_member = 2,.*v_long_member = 3,.*v_float_member = 4,.*v_double_member = 5.*\\},.*v_char_member = 37 \'%\'\\}" \ + "set print structure #4" + set timeout $prev_timeout # Test printing of enumeration bitfields. -- 2.7.4