mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 18:39:34 +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>
|
2021-01-11 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
* arch/aarch64-insn.h (aarch64_debug_printf): New.
|
* 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;
|
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 },
|
{ ".and.", BOOL_AND, BINOP_END, false },
|
||||||
{ ".or.", BOOL_OR, BINOP_END, false },
|
{ ".or.", BOOL_OR, BINOP_END, false },
|
||||||
@ -987,11 +989,18 @@ static const struct token dot_ops[] =
|
|||||||
{ ".eq.", EQUAL, BINOP_END, false },
|
{ ".eq.", EQUAL, BINOP_END, false },
|
||||||
{ ".eqv.", EQUAL, BINOP_END, false },
|
{ ".eqv.", EQUAL, BINOP_END, false },
|
||||||
{ ".neqv.", NOTEQUAL, BINOP_END, false },
|
{ ".neqv.", NOTEQUAL, BINOP_END, false },
|
||||||
|
{ "==", EQUAL, BINOP_END, false },
|
||||||
{ ".ne.", NOTEQUAL, BINOP_END, false },
|
{ ".ne.", NOTEQUAL, BINOP_END, false },
|
||||||
|
{ "/=", NOTEQUAL, BINOP_END, false },
|
||||||
{ ".le.", LEQ, BINOP_END, false },
|
{ ".le.", LEQ, BINOP_END, false },
|
||||||
|
{ "<=", LEQ, BINOP_END, false },
|
||||||
{ ".ge.", GEQ, BINOP_END, false },
|
{ ".ge.", GEQ, BINOP_END, false },
|
||||||
|
{ ">=", GEQ, BINOP_END, false },
|
||||||
{ ".gt.", GREATERTHAN, BINOP_END, false },
|
{ ".gt.", GREATERTHAN, BINOP_END, false },
|
||||||
|
{ ">", GREATERTHAN, BINOP_END, false },
|
||||||
{ ".lt.", LESSTHAN, 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
|
/* Holds the Fortran representation of a boolean, and the integer value we
|
||||||
@ -1163,24 +1172,15 @@ yylex (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See if it is a special .foo. operator. */
|
/* See if it is a Fortran operator. */
|
||||||
for (int i = 0; i < ARRAY_SIZE (dot_ops); i++)
|
for (int i = 0; i < ARRAY_SIZE (fortran_operators); i++)
|
||||||
if (strncasecmp (tokstart, dot_ops[i].oper,
|
if (strncasecmp (tokstart, fortran_operators[i].oper,
|
||||||
strlen (dot_ops[i].oper)) == 0)
|
strlen (fortran_operators[i].oper)) == 0)
|
||||||
{
|
{
|
||||||
gdb_assert (!dot_ops[i].case_sensitive);
|
gdb_assert (!fortran_operators[i].case_sensitive);
|
||||||
pstate->lexptr += strlen (dot_ops[i].oper);
|
pstate->lexptr += strlen (fortran_operators[i].oper);
|
||||||
yylval.opcode = dot_ops[i].opcode;
|
yylval.opcode = fortran_operators[i].opcode;
|
||||||
return dot_ops[i].token;
|
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)
|
switch (c = *tokstart)
|
||||||
|
@ -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>
|
2021-01-11 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
PR testsuite/26968
|
PR testsuite/26968
|
||||||
|
@ -109,6 +109,36 @@ proc test_dot_operations {} {
|
|||||||
gdb_test "p 4 $gt 4" " = .FALSE."
|
gdb_test "p 4 $gt 4" " = .FALSE."
|
||||||
gdb_test "p 3 $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.
|
# Start of test script.
|
||||||
|
Reference in New Issue
Block a user