package cc import "encoding/binary" // abiByteOrders contains byte order information for known architectures. var ( abiByteOrders = 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, } abiSignedChar = map[[2]string]bool{ {"freebsd", "arm"}: false, {"linux", "arm"}: false, {"linux", "arm64"}: false, {"linux", "ppc64le"}: false, {"linux", "riscv64"}: false, {"linux", "s390x"}: false, {"netbsd", "arm"}: false, {"darwin", "amd64"}: true, {"darwin", "arm64"}: true, {"freebsd", "amd64"}: true, {"freebsd", "386"}: true, {"linux", "386"}: true, {"linux", "amd64"}: true, {"netbsd", "amd64"}: true, {"openbsd", "amd64"}: true, {"openbsd", "arm64"}: true, {"windows", "386"}: true, {"windows", "amd64"}: true, {"windows", "arm64"}: true, } ) // abiTypes contains size and alignment information for known OS/arch pairs. // // The content is generated by ./cmd/cabi/main.c. var abiTypes = map[[2]string]map[Kind]ABIType{ // Linux, generated by GCC 8.3.0 {"linux", "amd64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {16, 16, 16}, Float128: {16, 16, 16}, Decimal32: {4, 4, 4}, Decimal64: {8, 8, 8}, Decimal128: {16, 16, 16}, }, {"linux", "386"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 4, 4}, ULongLong: {8, 4, 4}, Ptr: {4, 4, 4}, Function: {4, 4, 4}, Float: {4, 4, 4}, Double: {8, 4, 4}, LongDouble: {12, 4, 4}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 4, 4}, UInt64: {8, 4, 4}, Float32: {4, 4, 4}, Float32x: {8, 4, 4}, Float64: {8, 4, 4}, Float64x: {12, 4, 4}, Float128: {16, 16, 16}, Decimal32: {4, 4, 4}, Decimal64: {8, 8, 8}, Decimal128: {16, 16, 16}, }, {"linux", "arm"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {4, 4, 4}, Function: {4, 4, 4}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {8, 8, 8}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, }, {"linux", "arm64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, }, // $ x86_64-w64-mingw32-gcc main.c && wine a.exe {"windows", "amd64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {16, 16, 16}, Float128: {16, 16, 16}, Decimal32: {4, 4, 4}, Decimal64: {8, 8, 8}, Decimal128: {16, 16, 16}, }, // clang version 14.0.0 (https://github.com/llvm/llvm-project.git 329fda39c507e8740978d10458451dcdb21563be) // Target: aarch64-w64-windows-gnu {"windows", "arm64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {8, 8, 8}, }, // $ i686-w64-mingw32-gcc main.c && wine a.exe {"windows", "386"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {4, 4, 4}, Function: {4, 4, 4}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {12, 4, 4}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {12, 4, 4}, Float128: {16, 16, 16}, Decimal32: {4, 4, 4}, Decimal64: {8, 8, 8}, Decimal128: {16, 16, 16}, }, {"darwin", "amd64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, }, {"darwin", "arm64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {8, 8, 8}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, }, // gcc (SUSE Linux) 7.5.0 {"linux", "s390x"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 8, 8}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 8, 8}, UInt128: {16, 8, 8}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {16, 8, 8}, Float128: {16, 8, 8}, Decimal32: {4, 4, 4}, Decimal64: {8, 8, 8}, Decimal128: {16, 8, 8}, }, // gcc (FreeBSD Ports Collection) 10.3.0 {"freebsd", "amd64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, }, // gcc (FreeBSD Ports Collection) 10.3.0 {"freebsd", "386"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 4, 4}, ULongLong: {8, 4, 4}, Ptr: {4, 4, 4}, Function: {4, 4, 4}, Float: {4, 4, 4}, Double: {8, 4, 4}, LongDouble: {12, 4, 4}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 4, 4}, UInt64: {8, 4, 4}, Float32: {4, 4, 4}, Float32x: {8, 4, 4}, Float64: {8, 4, 4}, Float64x: {16, 16, 16}, Float128: {16, 16, 16}, }, // gcc (FreeBSD Ports Collection) 11.3.0 {"freebsd", "arm"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {4, 4, 4}, Function: {4, 4, 4}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {8, 8, 8}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, }, // gcc (GCC) 8.4.0 {"openbsd", "amd64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {16, 16, 16}, Float128: {16, 16, 16}, }, // OpenBSD clang version 13.0.0 {"openbsd", "arm64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, }, // gcc (GCC) 10.3.0 {"netbsd", "amd64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, }, // gcc (nb4 20200810) 7.5.0 {"netbsd", "arm"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {4, 4, 4}, ULong: {4, 4, 4}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {4, 4, 4}, Function: {4, 4, 4}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {8, 8, 8}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, }, // gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0 {"linux", "riscv64"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {16, 16, 16}, Float128: {16, 16, 16}, }, // gcc (Debian 10.2.1-6) 10.2.1 20210110 {"linux", "ppc64le"}: { Void: {1, 1, 1}, Bool: {1, 1, 1}, Char: {1, 1, 1}, SChar: {1, 1, 1}, UChar: {1, 1, 1}, Short: {2, 2, 2}, UShort: {2, 2, 2}, Enum: {4, 4, 4}, Int: {4, 4, 4}, UInt: {4, 4, 4}, Long: {8, 8, 8}, ULong: {8, 8, 8}, LongLong: {8, 8, 8}, ULongLong: {8, 8, 8}, Ptr: {8, 8, 8}, Function: {8, 8, 8}, Float: {4, 4, 4}, Double: {8, 8, 8}, LongDouble: {16, 16, 16}, Int8: {1, 1, 1}, UInt8: {1, 1, 1}, Int16: {2, 2, 2}, UInt16: {2, 2, 2}, Int32: {4, 4, 4}, UInt32: {4, 4, 4}, Int64: {8, 8, 8}, UInt64: {8, 8, 8}, Int128: {16, 16, 16}, UInt128: {16, 16, 16}, Float32: {4, 4, 4}, Float32x: {8, 8, 8}, Float64: {8, 8, 8}, Float64x: {16, 16, 16}, Float128: {16, 16, 16}, Decimal32: {4, 4, 4}, Decimal64: {8, 8, 8}, Decimal128: {16, 16, 16}, }, }