github.com/wasilibs/wazerox@v0.0.0-20240124024944-4923be63ab5f/internal/engine/wazevo/backend/abi.go (about)

     1  package backend
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/wasilibs/wazerox/internal/engine/wazevo/backend/regalloc"
     7  	"github.com/wasilibs/wazerox/internal/engine/wazevo/ssa"
     8  )
     9  
    10  // FunctionABI represents an ABI for the specific target combined with the function signature.
    11  type FunctionABI interface {
    12  	// CalleeGenFunctionArgsToVRegs generates instructions to move arguments to virtual registers.
    13  	CalleeGenFunctionArgsToVRegs(regs []ssa.Value)
    14  	// CalleeGenVRegsToFunctionReturns generates instructions to move virtual registers to a return value locations.
    15  	CalleeGenVRegsToFunctionReturns(regs []ssa.Value)
    16  }
    17  
    18  type (
    19  	// ABIArg represents either argument or return value's location.
    20  	ABIArg struct {
    21  		// Index is the index of the argument.
    22  		Index int
    23  		// Kind is the kind of the argument.
    24  		Kind ABIArgKind
    25  		// Reg is valid if Kind == ABIArgKindReg.
    26  		// This VReg must be based on RealReg.
    27  		Reg regalloc.VReg
    28  		// Offset is valid if Kind == ABIArgKindStack.
    29  		// This is the offset from the beginning of either arg or ret stack slot.
    30  		Offset int64
    31  		// Type is the type of the argument.
    32  		Type ssa.Type
    33  	}
    34  
    35  	// ABIArgKind is the kind of ABI argument.
    36  	ABIArgKind byte
    37  )
    38  
    39  const (
    40  	// ABIArgKindReg represents an argument passed in a register.
    41  	ABIArgKindReg = iota
    42  	// ABIArgKindStack represents an argument passed in the stack.
    43  	ABIArgKindStack
    44  )
    45  
    46  // String implements fmt.Stringer.
    47  func (a *ABIArg) String() string {
    48  	return fmt.Sprintf("args[%d]: %s", a.Index, a.Kind)
    49  }
    50  
    51  // String implements fmt.Stringer.
    52  func (a ABIArgKind) String() string {
    53  	switch a {
    54  	case ABIArgKindReg:
    55  		return "reg"
    56  	case ABIArgKindStack:
    57  		return "stack"
    58  	default:
    59  		panic("BUG")
    60  	}
    61  }