package target import ( "runtime" "strings" ) func EffectiveTriple(triple string) string { if triple != "" { return triple } return runtime.GOARCH + "-" + runtime.GOOS } func Arch(triple string) string { triple = strings.ToLower(EffectiveTriple(triple)) if arch, _, ok := strings.Cut(triple, "-"); ok { return arch } return triple } func PointerBits(triple string) (int, bool) { switch Arch(triple) { case "386", "i386", "i486", "i586", "i686", "x86", "arm", "armv6", "armv7", "armv7a", "armv7l", "thumb", "thumbv7", "thumbv7a", "mips", "mipsel", "powerpc", "ppc", "riscv32", "wasm32": return 32, true case "x86_64", "amd64", "aarch64", "arm64", "mips64", "mips64el", "powerpc64", "powerpc64le", "ppc64", "ppc64le", "riscv64", "s390x", "sparcv9", "wasm64": return 64, true default: return 0, false } } // CCharSigned reports whether plain C char uses the signed representation for // the target ABI. ARM ABIs default to unsigned char, except for the Apple and // Windows variants, which define plain char as signed. func CCharSigned(triple string) bool { target := strings.ToLower(EffectiveTriple(triple)) switch Arch(target) { case "arm", "armv6", "armv7", "armv7a", "armv7l", "thumb", "thumbv7", "thumbv7a", "aarch64", "arm64": return strings.Contains(target, "apple") || strings.Contains(target, "darwin") || strings.Contains(target, "macos") || strings.Contains(target, "windows") || strings.Contains(target, "mingw") || strings.Contains(target, "msvc") || strings.Contains(target, "win32") default: return true } }