about summary refs log tree commit diff
path: root/vendor/modernc.org/gc/v3/abi.go
diff options
context:
space:
mode:
authorEmile <git@emile.space>2024-08-16 19:50:26 +0200
committerEmile <git@emile.space>2024-08-16 19:50:26 +0200
commit1a57267a17c2fc17fb6e104846fabc3e363c326c (patch)
tree1e574e3a80622086dc3c81ff9cba65ef7049b1a9 /vendor/modernc.org/gc/v3/abi.go
initial commit
Diffstat (limited to 'vendor/modernc.org/gc/v3/abi.go')
-rw-r--r--vendor/modernc.org/gc/v3/abi.go682
1 files changed, 682 insertions, 0 deletions
diff --git a/vendor/modernc.org/gc/v3/abi.go b/vendor/modernc.org/gc/v3/abi.go
new file mode 100644
index 0000000..2f0964a
--- /dev/null
+++ b/vendor/modernc.org/gc/v3/abi.go
@@ -0,0 +1,682 @@
+// Copyright 2022 The Gc Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gc // import "modernc.org/gc/v3"
+
+import (
+	"encoding/binary"
+	"fmt"
+)
+
+var (
+	byteOrders = map[string]binary.ByteOrder{
+		"386":     binary.LittleEndian,
+		"amd64":   binary.LittleEndian,
+		"arm":     binary.LittleEndian,
+		"arm64":   binary.LittleEndian,
+		"ppc64le": binary.LittleEndian,
+		"riscv64": binary.LittleEndian,
+		"s390x":   binary.BigEndian,
+	}
+
+	abiTypes = map[[2]string]map[Kind]ABIType{
+		// go1.19.1
+		{"freebsd", "386"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19.1
+		{"freebsd", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.18.5
+		{"freebsd", "arm"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19
+		{"freebsd", "arm64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"darwin", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"darwin", "arm64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"linux", "386"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19.1
+		{"linux", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"linux", "arm"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19.1
+		{"linux", "arm64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"linux", "s390x"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"linux", "ppc64le"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"linux", "riscv64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.18.3
+		{"netbsd", "386"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.18.3
+		{"netbsd", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.18.3
+		{"netbsd", "arm"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19
+		{"openbsd", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19
+		{"openbsd", "arm64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19
+		{"openbsd", "386"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19.1
+		{"windows", "386"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {4, 4, 4},
+			Complex128:    {16, 4, 4},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 4, 4},
+			Function:      {4, 4, 4},
+			Int:           {4, 4, 4},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 4, 4},
+			Int8:          {1, 1, 1},
+			Interface:     {8, 4, 4},
+			Map:           {4, 4, 4},
+			Pointer:       {4, 4, 4},
+			Slice:         {12, 4, 4},
+			String:        {8, 4, 4},
+			Uint:          {4, 4, 4},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 4, 4},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {4, 4, 4},
+			UnsafePointer: {4, 4, 4},
+		},
+		// go1.19.1
+		{"windows", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.1
+		{"windows", "arm64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+		// go1.19.3
+		{"illumos", "amd64"}: {
+			Bool:          {1, 1, 1},
+			Chan:          {8, 8, 8},
+			Complex128:    {16, 8, 8},
+			Complex64:     {8, 4, 4},
+			Float32:       {4, 4, 4},
+			Float64:       {8, 8, 8},
+			Function:      {8, 8, 8},
+			Int:           {8, 8, 8},
+			Int16:         {2, 2, 2},
+			Int32:         {4, 4, 4},
+			Int64:         {8, 8, 8},
+			Int8:          {1, 1, 1},
+			Interface:     {16, 8, 8},
+			Map:           {8, 8, 8},
+			Pointer:       {8, 8, 8},
+			Slice:         {24, 8, 8},
+			String:        {16, 8, 8},
+			Uint:          {8, 8, 8},
+			Uint16:        {2, 2, 2},
+			Uint32:        {4, 4, 4},
+			Uint64:        {8, 8, 8},
+			Uint8:         {1, 1, 1},
+			Uintptr:       {8, 8, 8},
+			UnsafePointer: {8, 8, 8},
+		},
+	}
+)
+
+// ABI describes selected parts of the Application Binary Interface.
+type ABI struct {
+	ByteOrder binary.ByteOrder
+	goarch    string
+	goos      string
+	Types     map[Kind]ABIType
+}
+
+type ABIType struct {
+	Size       int64
+	Align      int64
+	FieldAlign int64
+}
+
+// NewABI creates an ABI based on the os+arch pair.
+func NewABI(os, arch string) (*ABI, error) {
+	byteOrder, ok := byteOrders[arch]
+	if !ok {
+		return nil, fmt.Errorf("unsupported arch: %s", arch)
+	}
+
+	types0, ok := abiTypes[[2]string{os, arch}]
+	if !ok {
+		return nil, fmt.Errorf("unsupported os/arch: %s/%s", os, arch)
+	}
+
+	types := make(map[Kind]ABIType, len(types0))
+	for k, v := range types0 {
+		types[k] = v
+	}
+	return &ABI{
+		ByteOrder: byteOrder,
+		Types:     types,
+	}, nil
+}