This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 4/5] Fortran: Change subrange enum to bit field.
- From: Tim Wiederhake <tim dot wiederhake at intel dot com>
- To: gdb-patches at sourceware dot org
- Cc: Christoph Weinmann <christoph dot t dot weinmann at intel dot com>
- Date: Mon, 11 Sep 2017 14:57:42 +0200
- Subject: [PATCH 4/5] Fortran: Change subrange enum to bit field.
- Authentication-results: sourceware.org; auth=none
- References: <1505134663-29374-1-git-send-email-tim.wiederhake@intel.com>
From: Christoph Weinmann <christoph.t.weinmann@intel.com>
Change Fortran subrange enum for subrange expressions to represent a bitfield
for easier manipulation. Consequently also change occurences and evaluation
of said enum. The behaviour of GDB is unchanged.
xxxx-yy-zz Christoph Weinmann <christoph.t.weinmann@intel.com>
Tim Wiederhake <tim.wiederhake@intel.com>
* expprint.c (print_subexp_standard): Use bitfield instead of enum.
(dump_subexp_body_standard): Same.
* f-exp.y (subrange): Same.
* f-lang.c (f90_value_subarray): Same.
* parse.c (operator_length_standard): Same.
* rust-exp.y: Same.
* rust-lang.c (rust_range, rust_compute_range, rust_subscript): Same.
* expression.h (enum range_type): Turn into a bitfield.
---
gdb/expprint.c | 20 ++++++++------------
gdb/expression.h | 15 ++++++---------
gdb/f-exp.y | 11 ++++++-----
gdb/f-lang.c | 8 ++++----
gdb/parse.c | 21 ++++++++-------------
gdb/rust-exp.y | 12 +++---------
gdb/rust-lang.c | 17 ++++++++---------
7 files changed, 43 insertions(+), 61 deletions(-)
diff --git a/gdb/expprint.c b/gdb/expprint.c
index 9e04f24..19d1c88 100644
--- a/gdb/expprint.c
+++ b/gdb/expprint.c
@@ -581,12 +581,10 @@ print_subexp_standard (struct expression *exp, int *pos,
*pos += 2;
fputs_filtered ("RANGE(", stream);
- if (range_type == HIGH_BOUND_DEFAULT
- || range_type == NONE_BOUND_DEFAULT)
+ if ((range_type & SUBARRAY_LOW_BOUND) != 0)
print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
fputs_filtered ("..", stream);
- if (range_type == LOW_BOUND_DEFAULT
- || range_type == NONE_BOUND_DEFAULT)
+ if ((range_type & SUBARRAY_HIGH_BOUND) != 0)
print_subexp (exp, pos, stream, PREC_ABOVE_COMMA);
fputs_filtered (")", stream);
return;
@@ -1093,16 +1091,16 @@ dump_subexp_body_standard (struct expression *exp,
switch (range_type)
{
- case BOTH_BOUND_DEFAULT:
+ case SUBARRAY_NO_BOUND:
fputs_filtered ("Range '..'", stream);
break;
- case LOW_BOUND_DEFAULT:
+ case SUBARRAY_HIGH_BOUND:
fputs_filtered ("Range '..EXP'", stream);
break;
- case HIGH_BOUND_DEFAULT:
+ case SUBARRAY_LOW_BOUND:
fputs_filtered ("Range 'EXP..'", stream);
break;
- case NONE_BOUND_DEFAULT:
+ case (SUBARRAY_LOW_BOUND | SUBARRAY_HIGH_BOUND):
fputs_filtered ("Range 'EXP..EXP'", stream);
break;
default:
@@ -1110,11 +1108,9 @@ dump_subexp_body_standard (struct expression *exp,
break;
}
- if (range_type == HIGH_BOUND_DEFAULT
- || range_type == NONE_BOUND_DEFAULT)
+ if ((range_type & SUBARRAY_LOW_BOUND) != 0)
elt = dump_subexp (exp, stream, elt);
- if (range_type == LOW_BOUND_DEFAULT
- || range_type == NONE_BOUND_DEFAULT)
+ if ((range_type & SUBARRAY_HIGH_BOUND) != 0)
elt = dump_subexp (exp, stream, elt);
}
break;
diff --git a/gdb/expression.h b/gdb/expression.h
index 9e4ddf5..c794198 100644
--- a/gdb/expression.h
+++ b/gdb/expression.h
@@ -155,17 +155,14 @@ extern void dump_raw_expression (struct expression *,
struct ui_file *, const char *);
extern void dump_prefix_expression (struct expression *, struct ui_file *);
-/* In an OP_RANGE expression, either bound could be empty, indicating
- that its value is by default that of the corresponding bound of the
- array or string. So we have four sorts of subrange. This
- enumeration type is to identify this. */
-
+/* Flags to indicate which boundarys are set in an OP_RANGE expression. Values
+ can be or'ed together. */
+
enum range_type
{
- BOTH_BOUND_DEFAULT, /* "(:)" */
- LOW_BOUND_DEFAULT, /* "(:high)" */
- HIGH_BOUND_DEFAULT, /* "(low:)" */
- NONE_BOUND_DEFAULT /* "(low:high)" */
+ SUBARRAY_NO_BOUND = 0x0, /* "( : )" */
+ SUBARRAY_LOW_BOUND = 0x1, /* "(low:)" */
+ SUBARRAY_HIGH_BOUND = 0x2 /* "(:high)" */
};
#endif /* !defined (EXPRESSION_H) */
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index bfa9d09..96b9b05 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -261,26 +261,27 @@ arglist : arglist ',' exp %prec ABOVE_COMMA
/* There are four sorts of subrange types in F90. */
subrange: exp ':' exp %prec ABOVE_COMMA
- { write_exp_elt_opcode (pstate, OP_RANGE);
- write_exp_elt_longcst (pstate, NONE_BOUND_DEFAULT);
+ { write_exp_elt_opcode (pstate, OP_RANGE);
+ write_exp_elt_longcst (pstate,
+ SUBARRAY_LOW_BOUND | SUBARRAY_HIGH_BOUND);
write_exp_elt_opcode (pstate, OP_RANGE); }
;
subrange: exp ':' %prec ABOVE_COMMA
{ write_exp_elt_opcode (pstate, OP_RANGE);
- write_exp_elt_longcst (pstate, HIGH_BOUND_DEFAULT);
+ write_exp_elt_longcst (pstate, SUBARRAY_LOW_BOUND);
write_exp_elt_opcode (pstate, OP_RANGE); }
;
subrange: ':' exp %prec ABOVE_COMMA
{ write_exp_elt_opcode (pstate, OP_RANGE);
- write_exp_elt_longcst (pstate, LOW_BOUND_DEFAULT);
+ write_exp_elt_longcst (pstate, SUBARRAY_HIGH_BOUND);
write_exp_elt_opcode (pstate, OP_RANGE); }
;
subrange: ':' %prec ABOVE_COMMA
{ write_exp_elt_opcode (pstate, OP_RANGE);
- write_exp_elt_longcst (pstate, BOTH_BOUND_DEFAULT);
+ write_exp_elt_longcst (pstate, SUBARRAY_NO_BOUND);
write_exp_elt_opcode (pstate, OP_RANGE); }
;
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index 25bb758..832a3e7 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -503,9 +503,9 @@ f90_value_subarray (struct value *array, struct expression *exp, int *pos,
*pos += 3;
- if (type == HIGH_BOUND_DEFAULT || type == NONE_BOUND_DEFAULT)
+ if ((type & SUBARRAY_LOW_BOUND) != 0)
lo = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
- if (type == LOW_BOUND_DEFAULT || type == NONE_BOUND_DEFAULT)
+ if ((type & SUBARRAY_HIGH_BOUND) != 0)
hi = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
subscript_array.emplace_back (type, lo, hi);
@@ -533,9 +533,9 @@ f90_value_subarray (struct value *array, struct expression *exp, int *pos,
if (it->kind == subscript::SUBSCRIPT_RANGE)
{
- if (it->type == LOW_BOUND_DEFAULT || it->type == BOTH_BOUND_DEFAULT)
+ if ((it->type & SUBARRAY_LOW_BOUND) == 0)
it->low = lo;
- if (it->type == HIGH_BOUND_DEFAULT || it->type == BOTH_BOUND_DEFAULT)
+ if ((it->type & SUBARRAY_HIGH_BOUND) == 0)
it->high = hi;
if (it->low < lo || it->low > hi || it->high < lo || it->high > hi)
diff --git a/gdb/parse.c b/gdb/parse.c
index fb0dff2..dcf1b31 100644
--- a/gdb/parse.c
+++ b/gdb/parse.c
@@ -1001,22 +1001,17 @@ operator_length_standard (const struct expression *expr, int endpos,
case OP_RANGE:
oplen = 3;
+ args = 0;
range_type = (enum range_type)
longest_to_int (expr->elts[endpos - 2].longconst);
- switch (range_type)
- {
- case LOW_BOUND_DEFAULT:
- case HIGH_BOUND_DEFAULT:
- args = 1;
- break;
- case BOTH_BOUND_DEFAULT:
- args = 0;
- break;
- case NONE_BOUND_DEFAULT:
- args = 2;
- break;
- }
+ /* Increment the argument counter for each argument
+ provided by the user. */
+ if ((range_type & SUBARRAY_LOW_BOUND) != 0)
+ args++;
+
+ if ((range_type & SUBARRAY_HIGH_BOUND) != 0)
+ args++;
break;
diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y
index 4cb3aa2..9adcae5 100644
--- a/gdb/rust-exp.y
+++ b/gdb/rust-exp.y
@@ -2460,23 +2460,17 @@ convert_ast_to_expression (struct parser_state *state,
case OP_RANGE:
{
- enum range_type kind = BOTH_BOUND_DEFAULT;
+ enum range_type kind = SUBARRAY_NO_BOUND;
if (operation->left.op != NULL)
{
convert_ast_to_expression (state, operation->left.op, top);
- kind = HIGH_BOUND_DEFAULT;
+ kind = (range_type) (kind | SUBARRAY_LOW_BOUND);
}
if (operation->right.op != NULL)
{
convert_ast_to_expression (state, operation->right.op, top);
- if (kind == BOTH_BOUND_DEFAULT)
- kind = LOW_BOUND_DEFAULT;
- else
- {
- gdb_assert (kind == HIGH_BOUND_DEFAULT);
- kind = NONE_BOUND_DEFAULT;
- }
+ kind = (range_type) (kind | SUBARRAY_HIGH_BOUND);
}
write_exp_elt_opcode (state, OP_RANGE);
write_exp_elt_longcst (state, kind);
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
index c5764bf..45005fd5 100644
--- a/gdb/rust-lang.c
+++ b/gdb/rust-lang.c
@@ -1311,9 +1311,9 @@ rust_range (struct expression *exp, int *pos, enum noside noside)
kind = (enum range_type) longest_to_int (exp->elts[*pos + 1].longconst);
*pos += 3;
- if (kind == HIGH_BOUND_DEFAULT || kind == NONE_BOUND_DEFAULT)
+ if ((kind & SUBARRAY_LOW_BOUND) != 0)
low = evaluate_subexp (NULL_TYPE, exp, pos, noside);
- if (kind == LOW_BOUND_DEFAULT || kind == NONE_BOUND_DEFAULT)
+ if ((kind & SUBARRAY_HIGH_BOUND) != 0)
high = evaluate_subexp (NULL_TYPE, exp, pos, noside);
if (noside == EVAL_SKIP)
@@ -1402,7 +1402,7 @@ rust_compute_range (struct type *type, struct value *range,
*low = 0;
*high = 0;
- *kind = BOTH_BOUND_DEFAULT;
+ *kind = SUBARRAY_NO_BOUND;
if (TYPE_NFIELDS (type) == 0)
return;
@@ -1410,15 +1410,14 @@ rust_compute_range (struct type *type, struct value *range,
i = 0;
if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
{
- *kind = HIGH_BOUND_DEFAULT;
+ *kind = SUBARRAY_LOW_BOUND;
*low = value_as_long (value_field (range, 0));
++i;
}
if (TYPE_NFIELDS (type) > i
&& strcmp (TYPE_FIELD_NAME (type, i), "end") == 0)
{
- *kind = (*kind == BOTH_BOUND_DEFAULT
- ? LOW_BOUND_DEFAULT : NONE_BOUND_DEFAULT);
+ *kind = (range_type) (*kind | SUBARRAY_HIGH_BOUND);
*high = value_as_long (value_field (range, i));
}
}
@@ -1433,7 +1432,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside,
struct type *rhstype;
LONGEST low, high_bound;
/* Initialized to appease the compiler. */
- enum range_type kind = BOTH_BOUND_DEFAULT;
+ enum range_type kind = SUBARRAY_NO_BOUND;
LONGEST high = 0;
int want_slice = 0;
@@ -1495,7 +1494,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside,
error (_("Cannot subscript non-array type"));
if (want_slice
- && (kind == BOTH_BOUND_DEFAULT || kind == LOW_BOUND_DEFAULT))
+ && ((kind & SUBARRAY_LOW_BOUND) == 0))
low = low_bound;
if (low < 0)
error (_("Index less than zero"));
@@ -1513,7 +1512,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside,
CORE_ADDR addr;
struct value *addrval, *tem;
- if (kind == BOTH_BOUND_DEFAULT || kind == HIGH_BOUND_DEFAULT)
+ if ((kind & SUBARRAY_HIGH_BOUND) == 0)
high = high_bound;
if (high < 0)
error (_("High index less than zero"));
--
2.7.4