diff options
author | Yao Qi <yao@codesourcery.com> | 2012-11-02 00:14:39 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2012-11-02 00:14:39 +0000 |
commit | f0559fff600165f5cbdf546737217e1da3f737b8 (patch) | |
tree | 1489559436bf24a052db270aba603d65763d5bcc | |
parent | 9ad9e68c611405111d62bb68d2b24ebbfcc307bd (diff) | |
download | gdb-f0559fff600165f5cbdf546737217e1da3f737b8.zip gdb-f0559fff600165f5cbdf546737217e1da3f737b8.tar.gz gdb-f0559fff600165f5cbdf546737217e1da3f737b8.tar.bz2 |
gdb:
2012-11-02 Yao Qi <yao@codesourcery.com>
* 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 <yao@codesourcery.com>
* gdb.base/setvar.exp: Test setting nested struct.
* gdb.base/setvar.c (v_struct3): New.
-rw-r--r-- | gdb/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/eval.c | 193 | ||||
-rw-r--r-- | gdb/expprint.c | 16 | ||||
-rw-r--r-- | gdb/parse.c | 1 | ||||
-rw-r--r-- | gdb/std-operator.def | 13 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/setvar.c | 7 | ||||
-rw-r--r-- | 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 <yao@codesourcery.com> + + * 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 <muller@ics.u-strasbg.fr> Incorporate ARI web page generator into GDB sources. @@ -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 <yao@codesourcery.com> + + * gdb.base/setvar.exp: Test setting nested struct. + * gdb.base/setvar.c (v_struct3): New. + 2012-11-01 Doug Evans <dje@google.com> * 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. |