]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/ppc64: don't remove NOP in assembler
authorLynn Boger <laboger@linux.vnet.ibm.com>
Tue, 11 Aug 2020 16:04:25 +0000 (12:04 -0400)
committerLynn Boger <laboger@linux.vnet.ibm.com>
Thu, 13 Aug 2020 15:22:41 +0000 (15:22 +0000)
Previously, the assembler removed NOPs from the Prog list in
obj9.go. NOPs shouldn't be removed if they were added as
an inline mark, as described in the issue below.

Fixes #40689

Once the NOPs were left in the Prog list, some instructions
were flagged as invalid because they had an operand which was
not represented in optab. In order to preserve the previous
assembler behavior, entries were added to optab for those
operand cases. They were not flagged as errors before because
the NOP instructions were removed before the code to check the
valid opcode/operand combinations.

Change-Id: Iae5145f94459027cf458e914d7c5d6089807ccf8
Reviewed-on: https://go-review.googlesource.com/c/go/+/247842
Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Paul Murphy <murp@ibm.com>
Reviewed-by: Michael Munday <mike.munday@ibm.com>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/internal/obj/ppc64/asm9.go
src/cmd/internal/obj/ppc64/obj9.go

index 0fd0744a42df9bb3ca88f46f63259f2a1ea184a5..238ca8f0b7eb68d573c77962a0ae0f595f0a774d 100644 (file)
@@ -613,6 +613,9 @@ var optab = []Optab{
        {obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0},
        {obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0},
        {obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0},
+       {obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // NOP operand variations added for #40689
+       {obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0},  // to preserve previous behavior
+       {obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, 0, 0, 0},
        {obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
        {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
        {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0},   // align code
index 16881c634b85250effe6ba4e6b4bd30b6918f70e..749f7066de7e36daa37f61bd668a74a30ac157ef 100644 (file)
@@ -429,7 +429,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
 
        /*
         * find leaf subroutines
-        * strip NOPs
         * expand RET
         * expand BECOME pseudo
         */
@@ -559,10 +558,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                        q = p
                        q1 = p.Pcond
                        if q1 != nil {
-                               for q1.As == obj.ANOP {
-                                       q1 = q1.Link
-                                       p.Pcond = q1
-                               }
+                               // NOPs are not removed due to #40689.
 
                                if q1.Mark&LEAF == 0 {
                                        q1.Mark |= LABEL
@@ -589,9 +585,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
                        continue
 
                case obj.ANOP:
-                       q1 = p.Link
-                       q.Link = q1 /* q is non-nop */
-                       q1.Mark |= p.Mark
+                       // NOPs are not removed due to
+                       // #40689
                        continue
 
                default: