[binutils-gdb] RISC-V: Fix lui argument parsing.
Jim Wilson
wilson@sourceware.org
Thu May 30 22:23:00 GMT 2019
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4288405d5ec2c68c7e9d8d68a090c6c9ff3825d1
commit 4288405d5ec2c68c7e9d8d68a090c6c9ff3825d1
Author: Jim Wilson <jimw@sifive.com>
Date: Thu May 30 15:23:10 2019 -0700
RISC-V: Fix lui argument parsing.
This fixes a bug reported on the riscv.org sw-dev mailing list. This
rejects "lui x1,symbol", as a symbol should only be accepted here when
used inside %hi(). Without the fix, this gets assembled as "lui x1,0"
with no relocation which is clearly wrong.
gas/
* config/tc-riscv.c (riscv_ip) <'u'>: Move O_constant check inside if
statement. Delete O_symbol and O_constant check after if statement.
* testsuite/gas/riscv/auipc-parsing.s: Test lui with missing %hi.
* testsuite/gas/riscv/auipc-parsing.l: Update.
Diff:
---
gas/ChangeLog | 7 +++++++
gas/config/tc-riscv.c | 9 ++++-----
gas/testsuite/gas/riscv/auipc-parsing.l | 2 ++
gas/testsuite/gas/riscv/auipc-parsing.s | 3 +++
4 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 7de5247..d460265 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2019-05-30 Jim Wilson <jimw@sifive.com>
+
+ * config/tc-riscv.c (riscv_ip) <'u'>: Move O_constant check inside if
+ statement. Delete O_symbol and O_constant check after if statement.
+ * testsuite/gas/riscv/auipc-parsing.s: Test lui with missing %hi.
+ * testsuite/gas/riscv/auipc-parsing.l: Update.
+
2019-05-28 H.J. Lu <hongjiu.lu@intel.com>
PR gas/24625
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 99b007f..f0c1f4c 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -1952,9 +1952,11 @@ branch:
case 'u': /* Upper 20 bits. */
p = percent_op_utype;
- if (!my_getSmallExpression (imm_expr, imm_reloc, s, p)
- && imm_expr->X_op == O_constant)
+ if (!my_getSmallExpression (imm_expr, imm_reloc, s, p))
{
+ if (imm_expr->X_op != O_constant)
+ break;
+
if (imm_expr->X_add_number < 0
|| imm_expr->X_add_number >= (signed)RISCV_BIGIMM_REACH)
as_bad (_("lui expression not in range 0..1048575"));
@@ -1962,9 +1964,6 @@ branch:
*imm_reloc = BFD_RELOC_RISCV_HI20;
imm_expr->X_add_number <<= RISCV_IMM_BITS;
}
- /* The 'u' format specifier must be a symbol or a constant. */
- if (imm_expr->X_op != O_symbol && imm_expr->X_op != O_constant)
- break;
s = expr_end;
continue;
diff --git a/gas/testsuite/gas/riscv/auipc-parsing.l b/gas/testsuite/gas/riscv/auipc-parsing.l
index df41e0e..54eedcb 100644
--- a/gas/testsuite/gas/riscv/auipc-parsing.l
+++ b/gas/testsuite/gas/riscv/auipc-parsing.l
@@ -1,3 +1,5 @@
.*: Assembler messages:
.*: Error: illegal operands `auipc x8,x9'
.*: Error: illegal operands `lui x10,x11'
+.*: Error: illegal operands `auipc x12,symbol'
+.*: Error: illegal operands `lui x13,symbol'
diff --git a/gas/testsuite/gas/riscv/auipc-parsing.s b/gas/testsuite/gas/riscv/auipc-parsing.s
index f580869..7af4df9 100644
--- a/gas/testsuite/gas/riscv/auipc-parsing.s
+++ b/gas/testsuite/gas/riscv/auipc-parsing.s
@@ -1,3 +1,6 @@
# Don't accept a register for 'u' operands.
auipc x8,x9
lui x10,x11
+# Don't accept a symbol without %hi() for 'u' operands.
+ auipc x12,symbol
+ lui x13,symbol
More information about the Binutils-cvs
mailing list