aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-01-11 14:14:02 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-01-12 09:40:55 +0000
commit7c654b719d2c186bd645a560525dd3e9c86d15cd (patch)
treeca0796d3a81e868c0c293de82474d3ae50af5792
parente998918e9890d5efc0270ad6f140e098eaf0081f (diff)
downloadgdb-7c654b719d2c186bd645a560525dd3e9c86d15cd.zip
gdb-7c654b719d2c186bd645a560525dd3e9c86d15cd.tar.gz
gdb-7c654b719d2c186bd645a560525dd3e9c86d15cd.tar.bz2
gdb/fortran: add symbol base comparison operators
Fortran supports symbol based comparison operators as well as the classic text based comparison operators, so we have: Text | Symbol Operator | Operator ---------|--------- .eq. | == .ne. | /= .le. | <= .ge. | >= .gt. | > .lt. | < This commit adds the symbol based operators as well as some tests. gdb/ChangeLog: * f-exp.y (dot_ops): Rename to... (fortran_operators): ...this. Add a header comment. Add symbol based operators. (yylex): Update to use fortran_operators not dot_ops. Remove special handling for '**', this is now included in fortran_operators. gdb/testsuite/ChangeLog: * gdb.fortran/dot-ops.exp: Add new tests.
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/f-exp.y36
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.fortran/dot-ops.exp30
4 files changed, 61 insertions, 18 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c33b1d4..720d3b2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2021-01-12 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * f-exp.y (dot_ops): Rename to...
+ (fortran_operators): ...this. Add a header comment. Add symbol
+ based operators.
+ (yylex): Update to use fortran_operators not dot_ops. Remove
+ special handling for '**', this is now included in
+ fortran_operators.
+
2021-01-11 Simon Marchi <simon.marchi@polymtl.ca>
* arch/aarch64-insn.h (aarch64_debug_printf): New.
diff --git a/gdb/f-exp.y b/gdb/f-exp.y
index e0f1b1f..3b0f23d 100644
--- a/gdb/f-exp.y
+++ b/gdb/f-exp.y
@@ -979,7 +979,9 @@ struct token
bool case_sensitive;
};
-static const struct token dot_ops[] =
+/* List of Fortran operators. */
+
+static const struct token fortran_operators[] =
{
{ ".and.", BOOL_AND, BINOP_END, false },
{ ".or.", BOOL_OR, BINOP_END, false },
@@ -987,11 +989,18 @@ static const struct token dot_ops[] =
{ ".eq.", EQUAL, BINOP_END, false },
{ ".eqv.", EQUAL, BINOP_END, false },
{ ".neqv.", NOTEQUAL, BINOP_END, false },
+ { "==", EQUAL, BINOP_END, false },
{ ".ne.", NOTEQUAL, BINOP_END, false },
+ { "/=", NOTEQUAL, BINOP_END, false },
{ ".le.", LEQ, BINOP_END, false },
+ { "<=", LEQ, BINOP_END, false },
{ ".ge.", GEQ, BINOP_END, false },
+ { ">=", GEQ, BINOP_END, false },
{ ".gt.", GREATERTHAN, BINOP_END, false },
+ { ">", GREATERTHAN, BINOP_END, false },
{ ".lt.", LESSTHAN, BINOP_END, false },
+ { "<", LESSTHAN, BINOP_END, false },
+ { "**", STARSTAR, BINOP_EXP, false },
};
/* Holds the Fortran representation of a boolean, and the integer value we
@@ -1163,26 +1172,17 @@ yylex (void)
}
}
- /* See if it is a special .foo. operator. */
- for (int i = 0; i < ARRAY_SIZE (dot_ops); i++)
- if (strncasecmp (tokstart, dot_ops[i].oper,
- strlen (dot_ops[i].oper)) == 0)
+ /* See if it is a Fortran operator. */
+ for (int i = 0; i < ARRAY_SIZE (fortran_operators); i++)
+ if (strncasecmp (tokstart, fortran_operators[i].oper,
+ strlen (fortran_operators[i].oper)) == 0)
{
- gdb_assert (!dot_ops[i].case_sensitive);
- pstate->lexptr += strlen (dot_ops[i].oper);
- yylval.opcode = dot_ops[i].opcode;
- return dot_ops[i].token;
+ gdb_assert (!fortran_operators[i].case_sensitive);
+ pstate->lexptr += strlen (fortran_operators[i].oper);
+ yylval.opcode = fortran_operators[i].opcode;
+ return fortran_operators[i].token;
}
- /* See if it is an exponentiation operator. */
-
- if (strncmp (tokstart, "**", 2) == 0)
- {
- pstate->lexptr += 2;
- yylval.opcode = BINOP_EXP;
- return STARSTAR;
- }
-
switch (c = *tokstart)
{
case 0:
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 65bbebf..e31b712 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2021-01-12 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.fortran/dot-ops.exp: Add new tests.
+
2021-01-11 Tom de Vries <tdevries@suse.de>
PR testsuite/26968
diff --git a/gdb/testsuite/gdb.fortran/dot-ops.exp b/gdb/testsuite/gdb.fortran/dot-ops.exp
index 8454f7e..cc9adf3 100644
--- a/gdb/testsuite/gdb.fortran/dot-ops.exp
+++ b/gdb/testsuite/gdb.fortran/dot-ops.exp
@@ -109,6 +109,36 @@ proc test_dot_operations {} {
gdb_test "p 4 $gt 4" " = .FALSE."
gdb_test "p 3 $gt 4" " = .FALSE."
}
+
+ # Now test the symbol based comparison operators.
+
+ # Arithmetic EQ
+ gdb_test "p 5 == 4" " = .FALSE."
+ gdb_test "p 4 == 4" " = .TRUE."
+
+ # Arithmetic NE
+ gdb_test "p 5 /= 4" " = .TRUE."
+ gdb_test "p 4 /= 4" " = .FALSE."
+
+ # Arithmetic LE
+ gdb_test "p 5 <= 4" " = .FALSE."
+ gdb_test "p 4 <= 4" " = .TRUE."
+ gdb_test "p 3 <= 4" " = .TRUE."
+
+ # Arithmetic LT
+ gdb_test "p 5 < 4" " = .FALSE."
+ gdb_test "p 4 < 4" " = .FALSE."
+ gdb_test "p 3 < 4" " = .TRUE."
+
+ # Arithmetic GE
+ gdb_test "p 5 >= 4" " = .TRUE."
+ gdb_test "p 4 >= 4" " = .TRUE."
+ gdb_test "p 3 >= 4" " = .FALSE."
+
+ # Arithmetic GT
+ gdb_test "p 5 > 4" " = .TRUE."
+ gdb_test "p 4 > 4" " = .FALSE."
+ gdb_test "p 3 > 4" " = .FALSE."
}
# Start of test script.