aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao@codesourcery.com>2012-11-02 00:14:39 +0000
committerYao Qi <yao@codesourcery.com>2012-11-02 00:14:39 +0000
commitf0559fff600165f5cbdf546737217e1da3f737b8 (patch)
tree1489559436bf24a052db270aba603d65763d5bcc
parent9ad9e68c611405111d62bb68d2b24ebbfcc307bd (diff)
downloadgdb-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/ChangeLog14
-rw-r--r--gdb/eval.c193
-rw-r--r--gdb/expprint.c16
-rw-r--r--gdb/parse.c1
-rw-r--r--gdb/std-operator.def13
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/setvar.c7
-rw-r--r--gdb/testsuite/gdb.base/setvar.exp8
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.
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 <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.