[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