[dev.regabi] cmd/compile: add ssa.Aux tag interface for Value.Aux

It's currently hard to automate refactorings around the Value.Aux
field, because we don't have any static typing information for it.
Adding a tag interface will make subsequent CLs easier and safer.

Passes buildall w/ toolstash -cmp.

Updates #42982.

Change-Id: I41ae8e411a66bda3195a0957b60c2fe8a8002893
Reviewed-on: https://go-review.googlesource.com/c/go/+/275756
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Matthew Dempsky 2020-12-07 17:15:44 -08:00
parent 63722da46b
commit 1a98ab0e2d
20 changed files with 80 additions and 57 deletions

View file

@ -678,43 +678,53 @@ func opToAuxInt(o Op) int64 {
return int64(o)
}
func auxToString(i interface{}) string {
return i.(string)
// Aux is an interface to hold miscellaneous data in Blocks and Values.
type Aux interface {
CanBeAnSSAAux()
}
func auxToSym(i interface{}) Sym {
// stringAux wraps string values for use in Aux.
type stringAux string
func (stringAux) CanBeAnSSAAux() {}
func auxToString(i Aux) string {
return string(i.(stringAux))
}
func auxToSym(i Aux) Sym {
// TODO: kind of a hack - allows nil interface through
s, _ := i.(Sym)
return s
}
func auxToType(i interface{}) *types.Type {
func auxToType(i Aux) *types.Type {
return i.(*types.Type)
}
func auxToCall(i interface{}) *AuxCall {
func auxToCall(i Aux) *AuxCall {
return i.(*AuxCall)
}
func auxToS390xCCMask(i interface{}) s390x.CCMask {
func auxToS390xCCMask(i Aux) s390x.CCMask {
return i.(s390x.CCMask)
}
func auxToS390xRotateParams(i interface{}) s390x.RotateParams {
func auxToS390xRotateParams(i Aux) s390x.RotateParams {
return i.(s390x.RotateParams)
}
func stringToAux(s string) interface{} {
func StringToAux(s string) Aux {
return stringAux(s)
}
func symToAux(s Sym) Aux {
return s
}
func symToAux(s Sym) interface{} {
func callToAux(s *AuxCall) Aux {
return s
}
func callToAux(s *AuxCall) interface{} {
return s
}
func typeToAux(t *types.Type) interface{} {
func typeToAux(t *types.Type) Aux {
return t
}
func s390xCCMaskToAux(c s390x.CCMask) interface{} {
func s390xCCMaskToAux(c s390x.CCMask) Aux {
return c
}
func s390xRotateParamsToAux(r s390x.RotateParams) interface{} {
func s390xRotateParamsToAux(r s390x.RotateParams) Aux {
return r
}
@ -725,7 +735,7 @@ func uaddOvf(a, b int64) bool {
// de-virtualize an InterCall
// 'sym' is the symbol for the itab
func devirt(v *Value, aux interface{}, sym Sym, offset int64) *AuxCall {
func devirt(v *Value, aux Aux, sym Sym, offset int64) *AuxCall {
f := v.Block.Func
n, ok := sym.(*obj.LSym)
if !ok {
@ -748,7 +758,7 @@ func devirt(v *Value, aux interface{}, sym Sym, offset int64) *AuxCall {
// de-virtualize an InterLECall
// 'sym' is the symbol for the itab
func devirtLESym(v *Value, aux interface{}, sym Sym, offset int64) *obj.LSym {
func devirtLESym(v *Value, aux Aux, sym Sym, offset int64) *obj.LSym {
n, ok := sym.(*obj.LSym)
if !ok {
return nil