// (as described above), not architected registers.
type ABIParamAssignment struct {
Type *types.Type
- Name types.Object // should always be *ir.Name, used to match with a particular ssa.OpArg.
+ Name *ir.Name
Registers []RegIndex
offset int32
}
assignParams := func(params []*types.Field, isResult bool) []ABIParamAssignment {
res := make([]ABIParamAssignment, len(params))
for i, param := range params {
- res[i] = s.assignParam(param.Type, param.Nname, isResult)
+ var name *ir.Name
+ if param.Nname != nil {
+ name = param.Nname.(*ir.Name)
+ }
+ res[i] = s.assignParam(param.Type, name, isResult)
}
return res
}
// of field f to determine whether it can be register assigned.
// The result of the analysis is recorded in the result
// ABIParamResultInfo held in 'state'.
-func (state *assignState) assignParam(typ *types.Type, name types.Object, isResult bool) ABIParamAssignment {
+func (state *assignState) assignParam(typ *types.Type, name *ir.Name, isResult bool) ABIParamAssignment {
registers := state.tryAllocRegs(typ)
var offset int64 = -1
}
// Gather all register arg spill slots.
for _, a := range f.OwnAux.ABIInfo().InParams() {
- n, ok := a.Name.(*ir.Name)
- if !ok || len(a.Registers) == 0 {
+ n := a.Name
+ if n == nil || len(a.Registers) == 0 {
continue
}
_, offs := a.RegisterTypesAndOffsets()
if !isNamedRegParam(inp) {
continue
}
- n := inp.Name.(*ir.Name)
+ n := inp.Name
// Param is spread across one or more registers. Walk through
// each piece to see whether we've seen an arg reg op for it.
if p.Name == nil {
return false
}
- n := p.Name.(*ir.Name)
+ n := p.Name
if n.Sym() == nil || n.Sym().IsBlank() {
return false
}
continue
}
- n := inp.Name.(*ir.Name)
+ n := inp.Name
sl := LocalSlot{N: n, Type: inp.Type, Off: 0}
rval.Vars = append(rval.Vars, n)
rval.Slots = append(rval.Slots, sl)
// NameOfResult returns the type of result which (indexed 0, 1, etc).
func (a *AuxCall) NameOfResult(which int64) *ir.Name {
- name := a.abiInfo.OutParam(int(which)).Name
- if name == nil {
- return nil
- }
- return name.(*ir.Name)
+ return a.abiInfo.OutParam(int(which)).Name
}
// TypeOfResult returns the type of result which (indexed 0, 1, etc).
// The results are already in memory, because they are not SSA'd
// when the function has defers (see canSSAName).
for _, o := range f.OwnAux.ABIInfo().OutParams() {
- n := o.Name.(*ir.Name)
+ n := o.Name
rts, offs := o.RegisterTypesAndOffsets()
for i := range o.Registers {
Arch.LoadRegResult(&s, f, rts[i], ssa.ObjRegForAbiReg(o.Registers[i], f.Config), n, offs[i])
// Then, insert code to spill registers if not already.
for _, a := range f.OwnAux.ABIInfo().InParams() {
- n, ok := a.Name.(*ir.Name)
- if !ok || n.Addrtaken() || !ssa.CanSSA(n.Type()) || !s.partLiveArgs[n] || len(a.Registers) <= 1 {
+ n := a.Name
+ if n == nil || n.Addrtaken() || !ssa.CanSSA(n.Type()) || !s.partLiveArgs[n] || len(a.Registers) <= 1 {
continue
}
rts, offs := a.RegisterTypesAndOffsets()