MIPS/GAS: Sanitize `.option picX' pseudo-op
authorMaciej W. Rozycki <macro@imgtec.com>
Sat, 9 Apr 2016 20:35:50 +0000 (21:35 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Sat, 9 Apr 2016 20:35:50 +0000 (21:35 +0100)
gas/
* config/tc-mips.c (s_option): Sanitize `.option picX'
pseudo-op.
* testsuite/gas/mips/option-pic-1.d: New test.
* testsuite/gas/mips/option-pic-2.l: New list test.
* testsuite/gas/mips/option-pic-1.s: New test source.
* testsuite/gas/mips/option-pic-2.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new tests.

gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/option-pic-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/option-pic-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/option-pic-2.l [new file with mode: 0644]
gas/testsuite/gas/mips/option-pic-2.s [new file with mode: 0644]

index da02325fd5e228738c3832eef08e926eb23ac412..eefeb2fc9b7856b05de56625fcfdde29363178ee 100644 (file)
@@ -1,3 +1,13 @@
+2016-04-09  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * config/tc-mips.c (s_option): Sanitize `.option picX'
+       pseudo-op.
+       * testsuite/gas/mips/option-pic-1.d: New test.
+       * testsuite/gas/mips/option-pic-2.l: New list test.
+       * testsuite/gas/mips/option-pic-1.s: New test source.
+       * testsuite/gas/mips/option-pic-2.s: New test source.
+       * testsuite/gas/mips/mips.exp: Run the new tests.
+
 2016-04-09  Maciej W. Rozycki  <macro@imgtec.com>
 
        * config/tc-mips.c (s_option): Reject `.option picX' if VxWorks
index 701744476f5f2895da400b52a668c08222ffcd2a..db3ec6775e2a3b3913c58fe5817bb95cb81beca7 100644 (file)
@@ -15472,7 +15472,7 @@ s_option (int x ATTRIBUTE_UNUSED)
     {
       /* FIXME: What does this mean?  */
     }
-  else if (strncmp (opt, "pic", 3) == 0)
+  else if (strncmp (opt, "pic", 3) == 0 && ISDIGIT (opt[3]) && opt[4] == '\0')
     {
       int i;
 
index 02f76cc09cdcd515cb143b985796937ec2ae071c..4d770cb70000ee4538c5ee596dc238a6ba102ff3 100644 (file)
@@ -1474,6 +1474,9 @@ if { [istarget mips*-*-vxworks*] } {
 
     run_dump_test "li-d"
 
+    run_dump_test "option-pic-1"
+    run_list_test "option-pic-2" "" \
+       "MIPS invalid PIC option"
     run_list_test "option-pic-vxworks-1" "-mvxworks-pic" \
        "MIPS invalid PIC option in VxWorks PIC"
     run_list_test "option-pic-vxworks-2" "-mvxworks-pic" \
diff --git a/gas/testsuite/gas/mips/option-pic-1.d b/gas/testsuite/gas/mips/option-pic-1.d
new file mode 100644 (file)
index 0000000..da32af6
--- /dev/null
@@ -0,0 +1,18 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS PIC option
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <[^>]*> 8f820000     lw      v0,0\(gp\)
+[      ]*[0-9a-f]+: R_MIPS_GOT16       bar
+[0-9a-f]+ <[^>]*> 3c020000     lui     v0,0x0
+[      ]*[0-9a-f]+: R_MIPS_HI16        bar
+[0-9a-f]+ <[^>]*> 24420000     addiu   v0,v0,0
+[      ]*[0-9a-f]+: R_MIPS_LO16        bar
+[0-9a-f]+ <[^>]*> 8f820000     lw      v0,0\(gp\)
+[      ]*[0-9a-f]+: R_MIPS_GOT16       bar
+[0-9a-f]+ <[^>]*> 03e00008     jr      ra
+[0-9a-f]+ <[^>]*> 00000000     nop
+       \.\.\.
diff --git a/gas/testsuite/gas/mips/option-pic-1.s b/gas/testsuite/gas/mips/option-pic-1.s
new file mode 100644 (file)
index 0000000..6907049
--- /dev/null
@@ -0,0 +1,16 @@
+       .abicalls
+       .text
+       .globl  foo
+       .ent    foo
+foo:
+       la      $2, bar
+       .option pic0            # Switch off!
+       la      $2, bar
+       .option pic2            # Switch on!
+       la      $2, bar
+       jr      $ra
+       .end    foo
+
+# Force some (non-delay-slot) zero bytes, to make 'objdump' print ...
+       .align  4, 0
+       .space  16
diff --git a/gas/testsuite/gas/mips/option-pic-2.l b/gas/testsuite/gas/mips/option-pic-2.l
new file mode 100644 (file)
index 0000000..c6c5994
--- /dev/null
@@ -0,0 +1,4 @@
+.*: Assembler messages:
+.*:2: Warning: unrecognized option "picfoo"
+.*:3: Warning: unrecognized option "pic0foo"
+.*:4: Error: junk at end of line, first unrecognized character is `f'
diff --git a/gas/testsuite/gas/mips/option-pic-2.s b/gas/testsuite/gas/mips/option-pic-2.s
new file mode 100644 (file)
index 0000000..9d3a5ea
--- /dev/null
@@ -0,0 +1,4 @@
+       .abicalls
+       .option picfoo
+       .option pic0foo
+       .option pic0 foo