github.com/tetratelabs/wazero@v1.7.3-0.20240513003603-48f702e154b5/internal/engine/wazevo/backend/go_call.go (about) 1 package backend 2 3 import "github.com/tetratelabs/wazero/internal/engine/wazevo/ssa" 4 5 // GoFunctionCallRequiredStackSize returns the size of the stack required for the Go function call. 6 // argBegin is the index of the first argument in the signature which is not either execution context or module context. 7 func GoFunctionCallRequiredStackSize(sig *ssa.Signature, argBegin int) (ret, retUnaligned int64) { 8 var paramNeededInBytes, resultNeededInBytes int64 9 for _, p := range sig.Params[argBegin:] { 10 s := int64(p.Size()) 11 if s < 8 { 12 s = 8 // We use uint64 for all basic types, except SIMD v128. 13 } 14 paramNeededInBytes += s 15 } 16 for _, r := range sig.Results { 17 s := int64(r.Size()) 18 if s < 8 { 19 s = 8 // We use uint64 for all basic types, except SIMD v128. 20 } 21 resultNeededInBytes += s 22 } 23 24 if paramNeededInBytes > resultNeededInBytes { 25 ret = paramNeededInBytes 26 } else { 27 ret = resultNeededInBytes 28 } 29 retUnaligned = ret 30 // Align to 16 bytes. 31 ret = (ret + 15) &^ 15 32 return 33 }