mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
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.
This commit is contained in:
@ -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.
|
||||
|
36
gdb/f-exp.y
36
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:
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
Reference in New Issue
Block a user