Skip to content

Commit

Permalink
cmd/internal/obj/ppc64: fix rebuilding of optab for asm tests
Browse files Browse the repository at this point in the history
The end-to-end asm tests reinitialize the assembler using different
GOPPC64 values. This caused duplicate entries to amass from the
prefix and generated optab entries. This bug only affects the
asm end-to-end tests.

On reinitialization, optab contains the previous prefixedOptab
and optabGen entries, not just the initial values. Rework the
initialization to avoid the stale optab entries.

Change-Id: I310499915a5272ed0174ed8135d60788e6b4b716
Reviewed-on: https://go-review.googlesource.com/c/go/+/528316
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Lynn Boger <laboger@linux.vnet.ibm.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
  • Loading branch information
pmur committed Sep 29, 2023
1 parent 20944cf commit 9bfaaa1
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 9 deletions.
22 changes: 13 additions & 9 deletions src/cmd/internal/obj/ppc64/asm9.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,11 @@ type Optab struct {
//
// Likewise, each slice of optab is dynamically sorted using the ocmp Sort interface
// to arrange entries to minimize text size of each opcode.
var optab = []Optab{
//
// optab is the sorted result of combining optabBase, optabGen, and prefixableOptab.
var optab []Optab

var optabBase = []Optab{
{as: obj.ATEXT, a1: C_LOREG, a6: C_TEXTSIZE, type_: 0, size: 0},
{as: obj.ATEXT, a1: C_LOREG, a3: C_LCON, a6: C_TEXTSIZE, type_: 0, size: 0},
{as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE, type_: 0, size: 0},
Expand Down Expand Up @@ -1303,10 +1307,6 @@ func buildop(ctxt *obj.Link) {
entry.ispfx = true
entry.size = entry.pfxsize
}
// Use the legacy assembler function if none provided.
if entry.asmout == nil {
entry.asmout = asmout
}
prefixOptab = append(prefixOptab, entry.Optab)

}
Expand All @@ -1318,16 +1318,20 @@ func buildop(ctxt *obj.Link) {
}
}
}

// Append the generated entries, sort, and fill out oprange.
optab = make([]Optab, 0, len(optabBase)+len(optabGen)+len(prefixOptab))
optab = append(optab, optabBase...)
optab = append(optab, optabGen...)
optab = append(optab, prefixOptab...)
sort.Slice(optab, optabLess)

for i := range optab {
// Use the legacy assembler function if none provided.
if optab[i].asmout == nil {
optab[i].asmout = asmout
}
}
// Append the generated entries, sort, and fill out oprange.
optab = append(optab, optabGen...)
optab = append(optab, prefixOptab...)
sort.Slice(optab, optabLess)

for i := 0; i < len(optab); {
r := optab[i].as
Expand Down
16 changes: 16 additions & 0 deletions src/cmd/internal/obj/ppc64/asm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package ppc64
import (
"bytes"
"fmt"
"internal/buildcfg"
"internal/testenv"
"math"
"os"
Expand Down Expand Up @@ -553,3 +554,18 @@ func TestAddrClassifier(t *testing.T) {
}
}
}

// The optab size should remain constant when reinitializing the PPC64 assembler backend.
func TestOptabReinit(t *testing.T) {
buildcfg.GOOS = "linux"
buildcfg.GOARCH = "ppc64le"
buildcfg.GOPPC64 = 8
buildop(nil)
optabLen := len(optab)
buildcfg.GOPPC64 = 9
buildop(nil)
reinitOptabLen := len(optab)
if reinitOptabLen != optabLen {
t.Errorf("rerunning buildop changes optab size from %d to %d", optabLen, reinitOptabLen)
}
}

0 comments on commit 9bfaaa1

Please sign in to comment.