From 0cbbe1b85eef405c0ddb22389f85a65d8a8bf28c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 8 Jul 2013 08:39:32 +0000 Subject: [PATCH] gas/ * config/tc-mips.c (mips_ip): Unconditionally parse an expression for 'A' and assume that the constant has been elided if the result is an O_register. gas/testsuite/ * gas/mips/la.s, gas/mips/la.d, gas/mips/la-svr4pic.d, gas/mips/la-xgot.d: Add tests for bracketed addresses. --- gas/ChangeLog | 6 ++++++ gas/config/tc-mips.c | 10 +++++----- gas/testsuite/ChangeLog | 5 +++++ gas/testsuite/gas/mips/la-svr4pic.d | 12 ++++++++++++ gas/testsuite/gas/mips/la-xgot.d | 18 ++++++++++++++++++ gas/testsuite/gas/mips/la.d | 15 +++++++++++++++ gas/testsuite/gas/mips/la.s | 5 +++++ 7 files changed, 66 insertions(+), 5 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 48b382e47ba..65f13cf8a5e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2013-07-08 Richard Sandiford + + * config/tc-mips.c (mips_ip): Unconditionally parse an expression + for 'A' and assume that the constant has been elided if the result + is an O_register. + 2013-07-07 Richard Sandiford * config/tc-mips.c (gprel16_reloc_p): New function. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 5c6424e9f11..22ba44adedd 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -12702,17 +12702,17 @@ mips_ip (char *str, struct mips_cl_insn *ip) continue; case 'A': - /* If we expect a base register, check whether there is only - a single bracketed expression left. If so, it must be the - base register and the constant must be zero. */ - if (args[1] == '(' && *s == '(' && strchr (s + 1, '(') == 0) + my_getSmallExpression (&offset_expr, offset_reloc, s); + if (offset_expr.X_op == O_register) { + /* Assume that the offset has been elided and that what + we saw was a base register. The match will fail later + if that assumption turns out to be wrong. */ offset_expr.X_op = O_constant; offset_expr.X_add_number = 0; } else { - my_getSmallExpression (&offset_expr, offset_reloc, s); normalize_address_expr (&offset_expr); s = expr_end; } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 196e23822b1..e1e968998f3 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-07-08 Richard Sandiford + + * gas/mips/la.s, gas/mips/la.d, gas/mips/la-svr4pic.d, + gas/mips/la-xgot.d: Add tests for bracketed addresses. + 2013-07-07 Richard Sandiford * gas/mips/ldstla-32.d: Avoid "lui at,0x0" sequences for diff --git a/gas/testsuite/gas/mips/la-svr4pic.d b/gas/testsuite/gas/mips/la-svr4pic.d index d53580faeb1..686db0321c9 100644 --- a/gas/testsuite/gas/mips/la-svr4pic.d +++ b/gas/testsuite/gas/mips/la-svr4pic.d @@ -452,5 +452,17 @@ Disassembly of section .text: [0-9a-f]+ <[^>]*> addiu at,at,-22131 [ ]*[0-9a-f]+: R_MIPS_LO16 .bss [0-9a-f]+ <[^>]*> addu a0,a0,at +[0-9a-f]+ <[^>]*> addu a0,a0,a1 +[0-9a-f]+ <[^>]*> addiu a0,a1,0 +[0-9a-f]+ <[^>]*> lui a0,0x12 +[0-9a-f]+ <[^>]*> ori a0,a0,0x3456 +[0-9a-f]+ <[^>]*> lui a0,0x12 +[0-9a-f]+ <[^>]*> ori a0,a0,0x3456 +[0-9a-f]+ <[^>]*> addu a0,a0,a1 +[0-9a-f]+ <[^>]*> lw a0,0\(gp\) +[ ]*[0-9a-f]+: R_MIPS_GOT16 big_external_data_label +[0-9a-f]+ <[^>]*> lw a0,0\(gp\) +[ ]*[0-9a-f]+: R_MIPS_GOT16 big_external_data_label +[0-9a-f]+ <[^>]*> nop [0-9a-f]+ <[^>]*> addu a0,a0,a1 ... diff --git a/gas/testsuite/gas/mips/la-xgot.d b/gas/testsuite/gas/mips/la-xgot.d index 50cc37c8353..168a72d1086 100644 --- a/gas/testsuite/gas/mips/la-xgot.d +++ b/gas/testsuite/gas/mips/la-xgot.d @@ -596,5 +596,23 @@ Disassembly of section .text: [0-9a-f]+ <[^>]*> addiu at,at,-22131 [ ]*[0-9a-f]+: R_MIPS_LO16 .bss [0-9a-f]+ <[^>]*> addu a0,a0,at +[0-9a-f]+ <[^>]*> addu a0,a0,a1 +[0-9a-f]+ <[^>]*> addiu a0,a1,0 +[0-9a-f]+ <[^>]*> lui a0,0x12 +[0-9a-f]+ <[^>]*> ori a0,a0,0x3456 +[0-9a-f]+ <[^>]*> lui a0,0x12 +[0-9a-f]+ <[^>]*> ori a0,a0,0x3456 +[0-9a-f]+ <[^>]*> addu a0,a0,a1 +[0-9a-f]+ <[^>]*> lui a0,0x0 +[ ]*[0-9a-f]+: R_MIPS_GOT_HI16 big_external_data_label +[0-9a-f]+ <[^>]*> addu a0,a0,gp +[0-9a-f]+ <[^>]*> lw a0,0\(a0\) +[ ]*[0-9a-f]+: R_MIPS_GOT_LO16 big_external_data_label +[0-9a-f]+ <[^>]*> lui a0,0x0 +[ ]*[0-9a-f]+: R_MIPS_GOT_HI16 big_external_data_label +[0-9a-f]+ <[^>]*> addu a0,a0,gp +[0-9a-f]+ <[^>]*> lw a0,0\(a0\) +[ ]*[0-9a-f]+: R_MIPS_GOT_LO16 big_external_data_label +[0-9a-f]+ <[^>]*> nop [0-9a-f]+ <[^>]*> addu a0,a0,a1 ... diff --git a/gas/testsuite/gas/mips/la.d b/gas/testsuite/gas/mips/la.d index 449c6a2715a..7395014fdf3 100644 --- a/gas/testsuite/gas/mips/la.d +++ b/gas/testsuite/gas/mips/la.d @@ -377,5 +377,20 @@ Disassembly of section .text: [ ]*[0-9a-f]+: [A-Z0-9_]*HI[A-Z0-9_]* .sbss.* [0-9a-f]+ <[^>]*> addiu a0,a0,[-0-9]+ [ ]*[0-9a-f]+: [A-Z0-9_]*LO[A-Z0-9_]* .sbss.* +[0-9a-f]+ <[^>]*> addu a0,a0,a1 +[0-9a-f]+ <[^>]*> addiu a0,a1,0 +[0-9a-f]+ <[^>]*> lui a0,0x12 +[0-9a-f]+ <[^>]*> ori a0,a0,0x3456 +[0-9a-f]+ <[^>]*> lui a0,0x12 +[0-9a-f]+ <[^>]*> ori a0,a0,0x3456 +[0-9a-f]+ <[^>]*> addu a0,a0,a1 +[0-9a-f]+ <[^>]*> lui a0,0x0 +[ ]*[0-9a-f]+: [A-Z0-9_]*HI[A-Z0-9_]* big_external_data_label +[0-9a-f]+ <[^>]*> addiu a0,a0,0 +[ ]*[0-9a-f]+: [A-Z0-9_]*LO[A-Z0-9_]* big_external_data_label +[0-9a-f]+ <[^>]*> lui a0,0x0 +[ ]*[0-9a-f]+: [A-Z0-9_]*HI[A-Z0-9_]* big_external_data_label +[0-9a-f]+ <[^>]*> addiu a0,a0,0 +[ ]*[0-9a-f]+: [A-Z0-9_]*LO[A-Z0-9_]* big_external_data_label [0-9a-f]+ <[^>]*> addu a0,a0,a1 ... diff --git a/gas/testsuite/gas/mips/la.s b/gas/testsuite/gas/mips/la.s index dd0bff6ae66..2a6f99c59b5 100644 --- a/gas/testsuite/gas/mips/la.s +++ b/gas/testsuite/gas/mips/la.s @@ -106,6 +106,11 @@ data_label: la $4,small_external_common+0x1a5a5($5) la $4,big_local_common+0x1a5a5($5) la $4,small_local_common+0x1a5a5($5) + la $4,($5) + la $4,(0x123456) + la $4,(0x123456)($5) + la $4,(big_external_data_label) + la $4,(big_external_data_label)($5) # Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ... .space 8 -- 2.30.2