in pkg/tools/elf/abi.go [81:122]
func (g *GolangRegisterLocator) GetLocation(typeClass TypeClass, typeSize, alignmentSize uint64, primitivesCount int,
isRetArg bool) (*ArgLocation, error) {
var registers []RegisterName
var offset *uint64
if typeClass == TypeClassInteger {
if isRetArg {
registers = g.intRetArgRegisters
offset = &g.curIntRetArgOffset
} else {
registers = g.intArgRegisters
offset = &g.curIntArgOffset
}
} else if typeClass == TypeClassFloat {
if isRetArg {
registers = g.floatRetArgRegisters
offset = &g.curFloatRetArgOffset
} else {
registers = g.floatArgRegisters
offset = &g.curFloatArgOffset
}
} else {
return nil, fmt.Errorf("unsupport type classs for getting location, type class: %d", typeClass)
}
result := &ArgLocation{}
if primitivesCount <= len(registers) {
if typeClass == TypeClassInteger {
result.Type = ArgLocationTypeRegister
} else {
result.Type = ArgLocationTypeRegisterFP
}
result.Offset = *offset
*offset += uint64(primitivesCount * 8)
} else {
g.curStackOffset = snapUpToMultiple(g.curStackOffset, alignmentSize)
result.Type = ArgLocationTypeStack
result.Offset = g.curStackOffset
g.curStackOffset += typeSize
}
return result, nil
}