From e4b8a1c839b88c345b82c37c90814a89c7f0c3c2 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 20 Apr 2016 08:14:16 -0600 Subject: [PATCH] Make gdb expression debugging handle OP_F90_RANGE print_subexp_standard and dump_subexp_body_standard did not handle OP_F90_RANGE. Attempting to dump an expression using this opcode would fail. This patch adds support for this opcode to these functions. 2016-05-17 Tom Tromey * expprint.c: Include f-lang.h. (print_subexp_standard, dump_subexp_body_standard): Handle OP_F90_RANGE. --- gdb/ChangeLog | 6 ++++++ gdb/expprint.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4b0c44b..6bed450 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2016-05-17 Tom Tromey + * expprint.c: Include f-lang.h. + (print_subexp_standard, dump_subexp_body_standard): Handle + OP_F90_RANGE. + +2016-05-17 Tom Tromey + * Makefile.in (init.c): Search .y files for initialization functions. diff --git a/gdb/expprint.c b/gdb/expprint.c index b3337cd..db196a1 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -29,6 +29,7 @@ #include "block.h" #include "objfiles.h" #include "valprint.h" +#include "f-lang.h" #include @@ -559,6 +560,26 @@ print_subexp_standard (struct expression *exp, int *pos, return; } + case OP_F90_RANGE: + { + enum f90_range_type range_type; + + range_type = (enum f90_range_type) + longest_to_int (exp->elts[pc + 1].longconst); + *pos += 2; + + fputs_filtered ("RANGE(", stream); + if (range_type == HIGH_BOUND_DEFAULT + || range_type == NONE_BOUND_DEFAULT) + print_subexp (exp, pos, stream, PREC_ABOVE_COMMA); + fputs_filtered ("..", stream); + if (range_type == LOW_BOUND_DEFAULT + || range_type == NONE_BOUND_DEFAULT) + print_subexp (exp, pos, stream, PREC_ABOVE_COMMA); + fputs_filtered (")", stream); + return; + } + /* Default ops */ default: @@ -1025,6 +1046,42 @@ dump_subexp_body_standard (struct expression *exp, elt += 2; } break; + case OP_F90_RANGE: + { + enum f90_range_type range_type; + + range_type = (enum f90_range_type) + longest_to_int (exp->elts[elt].longconst); + elt += 2; + + switch (range_type) + { + case BOTH_BOUND_DEFAULT: + fputs_filtered ("Range '..'", stream); + break; + case LOW_BOUND_DEFAULT: + fputs_filtered ("Range '..EXP'", stream); + break; + case HIGH_BOUND_DEFAULT: + fputs_filtered ("Range 'EXP..'", stream); + break; + case NONE_BOUND_DEFAULT: + fputs_filtered ("Range 'EXP..EXP'", stream); + break; + default: + fputs_filtered ("Invalid Range!", stream); + break; + } + + if (range_type == HIGH_BOUND_DEFAULT + || range_type == NONE_BOUND_DEFAULT) + elt = dump_subexp (exp, stream, elt); + if (range_type == LOW_BOUND_DEFAULT + || range_type == NONE_BOUND_DEFAULT) + elt = dump_subexp (exp, stream, elt); + } + break; + default: case OP_NULL: case MULTI_SUBSCRIPT: -- 2.7.4