mirror of
https://github.com/golang/go
synced 2024-11-26 07:38:00 -07:00
cmd/compile: don't modify underlying type when creating bitmap for bodyless function
This fixes the build crash for GOEXPERIMENT=regabi,regabiargs GOOS=windows go build syscall Updates #40724. Change-Id: I4400f6ff2e83e7e7e93ad5e58c6063b327532504 Reviewed-on: https://go-review.googlesource.com/c/go/+/309110 Trust: David Chase <drchase@google.com> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
efaf75a216
commit
b4881d930a
@ -5,6 +5,7 @@
|
|||||||
package abi
|
package abi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"cmd/compile/internal/base"
|
||||||
"cmd/compile/internal/ir"
|
"cmd/compile/internal/ir"
|
||||||
"cmd/compile/internal/types"
|
"cmd/compile/internal/types"
|
||||||
"cmd/internal/src"
|
"cmd/internal/src"
|
||||||
@ -104,7 +105,7 @@ type ABIParamAssignment struct {
|
|||||||
// This will panic if "a" describes a register-allocated parameter.
|
// This will panic if "a" describes a register-allocated parameter.
|
||||||
func (a *ABIParamAssignment) Offset() int32 {
|
func (a *ABIParamAssignment) Offset() int32 {
|
||||||
if len(a.Registers) > 0 {
|
if len(a.Registers) > 0 {
|
||||||
panic("Register allocated parameters have no offset")
|
base.Fatalf("register allocated parameters have no offset")
|
||||||
}
|
}
|
||||||
return a.offset
|
return a.offset
|
||||||
}
|
}
|
||||||
@ -238,7 +239,7 @@ func appendParamOffsets(offsets []int64, at int64, t *types.Type) ([]int64, int6
|
|||||||
// spill area to help reduce stack sizes.)
|
// spill area to help reduce stack sizes.)
|
||||||
func (a *ABIParamAssignment) FrameOffset(i *ABIParamResultInfo) int64 {
|
func (a *ABIParamAssignment) FrameOffset(i *ABIParamResultInfo) int64 {
|
||||||
if a.offset == -1 {
|
if a.offset == -1 {
|
||||||
panic("Function parameter has no ABI-defined frame-pointer offset")
|
base.Fatalf("function parameter has no ABI-defined frame-pointer offset")
|
||||||
}
|
}
|
||||||
if len(a.Registers) == 0 { // passed on stack
|
if len(a.Registers) == 0 { // passed on stack
|
||||||
return int64(a.offset) - i.config.LocalsOffset()
|
return int64(a.offset) - i.config.LocalsOffset()
|
||||||
@ -429,6 +430,7 @@ func (config *ABIConfig) ABIAnalyzeFuncType(ft *types.Func) *ABIParamResultInfo
|
|||||||
func (config *ABIConfig) ABIAnalyze(t *types.Type, setNname bool) *ABIParamResultInfo {
|
func (config *ABIConfig) ABIAnalyze(t *types.Type, setNname bool) *ABIParamResultInfo {
|
||||||
ft := t.FuncType()
|
ft := t.FuncType()
|
||||||
result := config.ABIAnalyzeFuncType(ft)
|
result := config.ABIAnalyzeFuncType(ft)
|
||||||
|
|
||||||
// Fill in the frame offsets for receiver, inputs, results
|
// Fill in the frame offsets for receiver, inputs, results
|
||||||
k := 0
|
k := 0
|
||||||
if t.NumRecvs() != 0 {
|
if t.NumRecvs() != 0 {
|
||||||
@ -472,7 +474,7 @@ func (config *ABIConfig) updateOffset(result *ABIParamResultInfo, f *types.Field
|
|||||||
f.Nname.(*ir.Name).SetIsOutputParamInRegisters(false)
|
f.Nname.(*ir.Name).SetIsOutputParamInRegisters(false)
|
||||||
}
|
}
|
||||||
} else if fOffset != off {
|
} else if fOffset != off {
|
||||||
panic(fmt.Errorf("Offset changed from %d to %d", fOffset, off))
|
base.Fatalf("offset for %s at %s changed from %d to %d", f.Sym.Name, base.FmtPos(f.Pos), fOffset, off)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if setNname && f.Nname != nil {
|
if setNname && f.Nname != nil {
|
||||||
@ -610,7 +612,8 @@ func (state *assignState) allocateRegs(regs []RegIndex, t *types.Type) []RegInde
|
|||||||
return state.allocateRegs(regs, synthIface)
|
return state.allocateRegs(regs, synthIface)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
panic(fmt.Errorf("Was not expecting type %s", t))
|
base.Fatalf("was not expecting type %s", t)
|
||||||
|
panic("unreachable")
|
||||||
}
|
}
|
||||||
|
|
||||||
// regAllocate creates a register ABIParamAssignment object for a param
|
// regAllocate creates a register ABIParamAssignment object for a param
|
||||||
@ -765,7 +768,8 @@ func (state *assignState) regassign(pt *types.Type) bool {
|
|||||||
case types.TINTER:
|
case types.TINTER:
|
||||||
return state.regassignStruct(synthIface)
|
return state.regassignStruct(synthIface)
|
||||||
default:
|
default:
|
||||||
panic("not expected")
|
base.Fatalf("not expected")
|
||||||
|
panic("unreachable")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -776,7 +780,8 @@ func (state *assignState) regassign(pt *types.Type) bool {
|
|||||||
func (state *assignState) assignParamOrReturn(pt *types.Type, n types.Object, isReturn bool) ABIParamAssignment {
|
func (state *assignState) assignParamOrReturn(pt *types.Type, n types.Object, isReturn bool) ABIParamAssignment {
|
||||||
state.pUsed = RegAmounts{}
|
state.pUsed = RegAmounts{}
|
||||||
if pt.Width == types.BADWIDTH {
|
if pt.Width == types.BADWIDTH {
|
||||||
panic("should never happen")
|
base.Fatalf("should never happen")
|
||||||
|
panic("unreachable")
|
||||||
} else if pt.Width == 0 {
|
} else if pt.Width == 0 {
|
||||||
return state.stackAllocate(pt, n)
|
return state.stackAllocate(pt, n)
|
||||||
} else if state.regassign(pt) {
|
} else if state.regassign(pt) {
|
||||||
|
@ -43,9 +43,9 @@ func enqueueFunc(fn *ir.Func) {
|
|||||||
if len(fn.Body) == 0 {
|
if len(fn.Body) == 0 {
|
||||||
// Initialize ABI wrappers if necessary.
|
// Initialize ABI wrappers if necessary.
|
||||||
ssagen.InitLSym(fn, false)
|
ssagen.InitLSym(fn, false)
|
||||||
types.CalcSize(fn.Type()) // TODO register args; remove this once all is done by abiutils
|
types.CalcSize(fn.Type())
|
||||||
a := ssagen.AbiForBodylessFuncStackMap(fn)
|
a := ssagen.AbiForBodylessFuncStackMap(fn)
|
||||||
abiInfo := a.ABIAnalyze(fn.Type(), true) // will set parameter spill/home locations correctly
|
abiInfo := a.ABIAnalyzeFuncType(fn.Type().FuncType()) // abiInfo has spill/home locations for wrapper
|
||||||
liveness.WriteFuncMap(fn, abiInfo)
|
liveness.WriteFuncMap(fn, abiInfo)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1457,7 +1457,6 @@ func WriteFuncMap(fn *ir.Func, abiInfo *abi.ABIParamResultInfo) {
|
|||||||
if ir.FuncName(fn) == "_" || fn.Sym().Linkname != "" {
|
if ir.FuncName(fn) == "_" || fn.Sym().Linkname != "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
types.CalcSize(fn.Type())
|
|
||||||
nptr := int(abiInfo.ArgWidth() / int64(types.PtrSize))
|
nptr := int(abiInfo.ArgWidth() / int64(types.PtrSize))
|
||||||
bv := bitvec.New(int32(nptr) * 2)
|
bv := bitvec.New(int32(nptr) * 2)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user