[PATCH v2] MIPS/GAS: LUI operand handling bug fixes

Maciej W. Rozycki macro@codesourcery.com
Wed Nov 7 15:06:00 GMT 2012


On Mon, 5 Nov 2012, Richard Sandiford wrote:

> >  Well, not quite from 20yrs ago, the lack of an error with the former 
> > example is an unfortunate side effect of the recent %hi/%lo fix -- exactly 
> > where I noted the need for better overflow handling.  I get this:
> >
> > addiu.s: Assembler messages:
> > addiu.s:1: Error: relocation overflow
> >
> > with arbitrarily picked version 2.20.1, so I think first we can (and 
> > should) bring it back and second enforce it for LUI as well (well, with 
> > what I have in mind that'll be automatic).  Do you still think we have to 
> > avoid such checks?
> 
> Nope, thanks for correcting me.

 OK, I'll propose a separate change sometime then.

 Here's an updated version of the LUI fix that has now interestingly 
enough reduced to a one-liner.  I have adjusted the test cases accordingly 
and added some extra checks based on the case you've been concerned about.  

 While doing that I noticed my original change wasn't exactly right for 
bignums, the wrong unrelated value would be reported in the error message 
and, according to my investigation, we have no helper implemented for 
printing values of bignums in diagnostic output at all.  They are however 
caught and reported elsewhere and therefore require no special handling 
here.  I have updated one of the test cases to cover them though.

 Finally, I have added an invalid expression using symbols in an 
arbitrarily chosen division operation -- expressions of such kind are 
currently silently accepted as a LUI argument.  Interestingly enough and 
unfortunately -- as seen in the diagnostic output pattern -- the errors 
are not reported in the sequence matching the order of lines, which I find 
rather confusing and counterintuitive, but obviously this is not an issue 
related to the bug being addressed here.

 No regressions in testing across the usual MIPS targets.  OK to apply?

2012-11-07  Maciej W. Rozycki  <macro@codesourcery.com>

	gas/
	* config/tc-mips.c (mips_ip) <'u'>: Default to BFD_RELOC_LO16.

	gas/testsuite/
	* gas/mips/lui.d: New test.
	* gas/mips/micromips@lui.d: New test.
	* gas/mips/lui-1.l: New list test.
	* gas/mips/lui-2.l: New list test.
	* gas/mips/lui.s: New test source.
	* gas/mips/lui-1.s: New test source.
	* gas/mips/lui-2.s: New test source.
	* gas/mips/mips.exp: Run the new tests.

  Maciej

binutils-mips-gas-lui-err.diff
Index: binutils-fsf-trunk-quilt/gas/config/tc-mips.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/config/tc-mips.c	2012-11-06 15:37:08.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/config/tc-mips.c	2012-11-06 22:27:34.781533749 +0000
@@ -12413,6 +12413,7 @@ mips_ip (char *str, struct mips_cl_insn 
 	      continue;
 
 	    case 'u':		/* Upper 16 bits.  */
+	      *imm_reloc = BFD_RELOC_LO16;
 	      if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
 		  && imm_expr.X_op == O_constant
 		  && (imm_expr.X_add_number < 0
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-1.l
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-1.l	2012-11-07 11:29:29.081063232 +0000
@@ -0,0 +1,5 @@
+.*\.s: Assembler messages:
+.*\.s:5: Error: lui expression \((18446744073709551615|4294967295)\) not in range 0\.\.65535
+.*\.s:6: Error: lui expression \(65536\) not in range 0\.\.65535
+.*\.s:7: Error: bignum invalid
+.*\.s:8: Error: register value used as expression
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-1.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-1.s	2012-11-07 11:29:11.020952285 +0000
@@ -0,0 +1,8 @@
+# Source code used to test error diagnostics with the LUI instruction.
+
+	.text
+foo:
+	lui	$2, -1
+	lui	$2, 65536
+	lui	$2, 0x10000000000000000
+	lui	$2, $3
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-2.l
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-2.l	2012-11-07 13:30:42.861186973 +0000
@@ -0,0 +1,5 @@
+.*\.s: Assembler messages:
+.*\.s:10: Error: invalid operands \(\*UND\* and \*UND\* sections\) for `/'
+.*\.s:7: Error: can't resolve `bar' {\*UND\* section} - `foo' {\.text section}
+.*\.s:8: Error: can't resolve `baz' {\*UND\* section} - `bar' {\*UND\* section}
+.*\.s:9: Error: can't resolve `\.text' {\.text section} - `baz' {\*UND\* section}
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-2.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui-2.s	2012-11-07 11:28:01.280861148 +0000
@@ -0,0 +1,10 @@
+# Source code used to test error diagnostics with the LUI instruction.
+# These need to be separate from lui-1.s as they are reported at a later
+# stage in assembly.
+
+	.text
+foo:
+	lui	$2, bar - foo
+	lui	$2, baz - bar
+	lui	$2, foo - baz
+	lui	$2, bar / baz
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui.d	2012-11-07 11:07:45.460717851 +0000
@@ -0,0 +1,25 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS lui
+#as: -32
+#source: lui.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 3c020000 	lui	v0,0x0
+[0-9a-f]+ <[^>]*> 3c02ffff 	lui	v0,0xffff
+[0-9a-f]+ <[^>]*> 3c020008 	lui	v0,0x8
+[0-9a-f]+ <[^>]*> 3c020008 	lui	v0,0x8
+[0-9a-f]+ <[^>]*> 3c02000c 	lui	v0,0xc
+[0-9a-f]+ <[^>]*> 3c02000c 	lui	v0,0xc
+[0-9a-f]+ <[^>]*> 3c02000c 	lui	v0,0xc
+[ 	]*[0-9a-f]+: R_MIPS_LO16	\.text
+[0-9a-f]+ <[^>]*> 3c020000 	lui	v0,0x0
+[ 	]*[0-9a-f]+: R_MIPS_LO16	ext
+[0-9a-f]+ <[^>]*> 3c020020 	lui	v0,0x20
+[ 	]*[0-9a-f]+: R_MIPS_LO16	\.text
+[0-9a-f]+ <[^>]*> 3c020028 	lui	v0,0x28
+[ 	]*[0-9a-f]+: R_MIPS_LO16	\.text
+[0-9a-f]+ <[^>]*> 3c020000 	lui	v0,0x0
+[0-9a-f]+ <[^>]*> 3c02ffff 	lui	v0,0xffff
+	\.\.\.
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/lui.s	2012-11-07 11:02:33.251200722 +0000
@@ -0,0 +1,29 @@
+# Source code used to test the LUI instruction with some expressions.
+
+	.text
+foo:
+0:
+	lui	$2, 0
+	lui	$2, 65535
+1:
+	lui	$2, 1b - 0b
+bar:
+	lui	$2, 2f - 1b
+2:
+	lui	$2, bar - foo
+	lui	$2, baz - bar
+baz:
+	lui	$2, bar
+	lui	$2, ext
+3:
+	lui	$2, 3b
+	lui	$2, 4f
+4:
+	lui	$2, min + 1
+	lui	$2, max - 1
+	.eqv	min, -1
+	.eqv	max, 65536
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+	.align	4, 0
+	.space	16
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/micromips@lui.d
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/micromips@lui.d	2012-11-07 11:11:48.670715210 +0000
@@ -0,0 +1,25 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS lui
+#as: -32
+#source: lui.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 41a2 0000 	lui	v0,0x0
+[0-9a-f]+ <[^>]*> 41a2 ffff 	lui	v0,0xffff
+[0-9a-f]+ <[^>]*> 41a2 0008 	lui	v0,0x8
+[0-9a-f]+ <[^>]*> 41a2 0008 	lui	v0,0x8
+[0-9a-f]+ <[^>]*> 41a2 000c 	lui	v0,0xc
+[0-9a-f]+ <[^>]*> 41a2 000c 	lui	v0,0xc
+[0-9a-f]+ <[^>]*> 41a2 000d 	lui	v0,0xd
+[ 	]*[0-9a-f]+: R_MICROMIPS_LO16	\.text
+[0-9a-f]+ <[^>]*> 41a2 0000 	lui	v0,0x0
+[ 	]*[0-9a-f]+: R_MICROMIPS_LO16	ext
+[0-9a-f]+ <[^>]*> 41a2 0021 	lui	v0,0x21
+[ 	]*[0-9a-f]+: R_MICROMIPS_LO16	\.text
+[0-9a-f]+ <[^>]*> 41a2 0029 	lui	v0,0x29
+[ 	]*[0-9a-f]+: R_MICROMIPS_LO16	\.text
+[0-9a-f]+ <[^>]*> 41a2 0000 	lui	v0,0x0
+[0-9a-f]+ <[^>]*> 41a2 ffff 	lui	v0,0xffff
+	\.\.\.
Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips.exp
===================================================================
--- binutils-fsf-trunk-quilt.orig/gas/testsuite/gas/mips/mips.exp	2012-11-06 15:37:08.000000000 +0000
+++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips.exp	2012-11-06 15:37:15.000000000 +0000
@@ -1128,4 +1128,7 @@ if { [istarget mips*-*-vxworks*] } {
 	run_dump_test_arches "hilo-diff-eb-n64" [mips_arch_list_matching mips3]
 	run_dump_test_arches "hilo-diff-el-n64" [mips_arch_list_matching mips3]
     }
+    run_dump_test_arches "lui"		[mips_arch_list_matching mips1]
+    run_list_test_arches "lui-1" "-32"	[mips_arch_list_matching mips1]
+    run_list_test_arches "lui-2" "-32"	[mips_arch_list_matching mips1]
 }



More information about the Binutils mailing list