This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Correct the parsing of derferred register addressing in the PDP11 assembler.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8f9ea98bebb629f0e6993be015f042bf45dcdd18

commit 8f9ea98bebb629f0e6993be015f042bf45dcdd18
Author: James Patrick Conlon <cptjustice@gmail.com>
Date:   Tue Aug 7 08:34:08 2018 +0100

    Correct the parsing of derferred register addressing in the PDP11 assembler.
    
    	PR 23481
    	* config/tc-pdp11.c (parse_op_noreg): Check for deferred register
    	addressing before assuming non-deferred addressing.
    	* testsuite/gas/pdp11/pr23481.s: New test source file.
    	* testsuite/gas/pdp11/pr23481.d: New test driver file.
    	* testsuite/gas/pdp11/pdp11.exp: Run the new test.

Diff:
---
 gas/ChangeLog                     | 12 +++++++++++-
 gas/config/tc-pdp11.c             | 18 +++++++++++++-----
 gas/testsuite/gas/pdp11/pdp11.exp |  1 +
 gas/testsuite/gas/pdp11/pr23481.d | 14 ++++++++++++++
 gas/testsuite/gas/pdp11/pr23481.s | 10 ++++++++++
 5 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 4467bb2..7874132 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2018-08-07  James Patrick Conlon  <cptjustice@gmail.com>
+	    Nick Clifton  <nickc@redhat.com>
+
+	PR 23481
+	* config/tc-pdp11.c (parse_op_noreg): Check for deferred register
+	addressing before assuming non-deferred addressing.
+	* testsuite/gas/pdp11/pr23481.s: New test source file.
+	* testsuite/gas/pdp11/pr23481.d: New test driver file.
+	* testsuite/gas/pdp11/pdp11.exp: Run the new test.
+
 2018-08-06  Claudiu Zissulescu  <claziss@synopsys.com>
 
 	* config/tc-arc.c (rf16_only): New static variable.
@@ -93,7 +103,7 @@
 	(swap_2_operands): Also swap flags fields.
 	* config/tc-i386-intel.c (i386_intel_operand): Likewise.
 
-2018-08-01  James Patrick Conlon <cptjustice@gmail.com>
+2018-08-01  James Patrick Conlon  <cptjustice@gmail.com>
 	    Nick Clifton  <nickc@redhat.com>
 
 	PR 14480
diff --git a/gas/config/tc-pdp11.c b/gas/config/tc-pdp11.c
index e151b27..1ebd461 100644
--- a/gas/config/tc-pdp11.c
+++ b/gas/config/tc-pdp11.c
@@ -350,10 +350,7 @@ parse_reg (char *str, struct pdp11_code *operand)
       str += 2;
     }
   else
-    {
-      operand->error = _("Bad register name");
-      return str;
-    }
+    operand->error = _("Bad register name");
 
   return str;
 }
@@ -594,10 +591,21 @@ parse_op_noreg (char *str, struct pdp11_code *operand)
           str = parse_op_no_deferred (str, operand);
         }
       else
-        str = parse_op_no_deferred (str + 1, operand);
+        {
+          /* @Rn == (Rn): Register deferred.  */
+          str = parse_reg (str + 1, operand);
+	  
+          /* Not @Rn */
+          if (operand->error)
+	    {
+	      operand->error = NULL;
+	      str = parse_op_no_deferred (str, operand);
+	    }
+        }
 
       if (operand->error)
 	return str;
+
       operand->code |= 010;
     }
   else
diff --git a/gas/testsuite/gas/pdp11/pdp11.exp b/gas/testsuite/gas/pdp11/pdp11.exp
index b3609f9..0c78566 100644
--- a/gas/testsuite/gas/pdp11/pdp11.exp
+++ b/gas/testsuite/gas/pdp11/pdp11.exp
@@ -22,4 +22,5 @@ if [expr [istarget "pdp11-*-*"]]  then {
     run_dump_test "opcode"
     run_dump_test "absreloc"
     run_dump_test "pr14480"
+    run_dump_test "pr23481"
 }
diff --git a/gas/testsuite/gas/pdp11/pr23481.d b/gas/testsuite/gas/pdp11/pr23481.d
new file mode 100644
index 0000000..fb40785
--- /dev/null
+++ b/gas/testsuite/gas/pdp11/pr23481.d
@@ -0,0 +1,14 @@
+#name: PR 23481 - correct assembly of '@rN' and '(rN)'
+#objdump: -dw
+
+dump.o: +file format .*
+
+Disassembly of section .text:
+
+0+00 <start>:
+[ 	]+0:[ 	]+2009[ 	]+cmp[ 	]+r0, \(r1\)
+[ 	]+2:[ 	]+2009[ 	]+cmp[ 	]+r0, \(r1\)
+[ 	]+4:[ 	]+2240[ 	]+cmp[ 	]+\(r1\), r0
+[ 	]+6:[ 	]+2240[ 	]+cmp[ 	]+\(r1\), r0
+[ 	]+8:[ 	]+2249[ 	]+cmp[ 	]+\(r1\), \(r1\)
+#pass
diff --git a/gas/testsuite/gas/pdp11/pr23481.s b/gas/testsuite/gas/pdp11/pr23481.s
new file mode 100644
index 0000000..5a61b98
--- /dev/null
+++ b/gas/testsuite/gas/pdp11/pr23481.s
@@ -0,0 +1,10 @@
+start:
+        cmp     r0,(r1)
+        cmp     r0,@r1
+        cmp     (r1),r0
+        cmp     @r1,r0
+        cmp     (r1),@r1
+
+        halt
+
+        .END


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]