func()

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
}