| // Copyright 2016 The Go 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 sys |
| |
| import "encoding/binary" |
| |
| // ArchFamily represents a family of one or more related architectures. |
| // For example, amd64 and amd64p32 are both members of the AMD64 family, |
| // and ppc64 and ppc64le are both members of the PPC64 family. |
| type ArchFamily byte |
| |
| const ( |
| NoArch ArchFamily = iota |
| AMD64 |
| ARM |
| ARM64 |
| I386 |
| MIPS |
| MIPS64 |
| PPC64 |
| S390X |
| ) |
| |
| // Arch represents an individual architecture. |
| type Arch struct { |
| Name string |
| Family ArchFamily |
| |
| ByteOrder binary.ByteOrder |
| |
| // PtrSize is the size in bytes of pointers and the |
| // predeclared "int", "uint", and "uintptr" types. |
| PtrSize int |
| |
| // RegSize is the size in bytes of general purpose registers. |
| RegSize int |
| |
| // MinLC is the minimum length of an instruction code. |
| MinLC int |
| } |
| |
| // InFamily reports whether a is a member of any of the specified |
| // architecture families. |
| func (a *Arch) InFamily(xs ...ArchFamily) bool { |
| for _, x := range xs { |
| if a.Family == x { |
| return true |
| } |
| } |
| return false |
| } |
| |
| var Arch386 = &Arch{ |
| Name: "386", |
| Family: I386, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 4, |
| RegSize: 4, |
| MinLC: 1, |
| } |
| |
| var ArchAMD64 = &Arch{ |
| Name: "amd64", |
| Family: AMD64, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 1, |
| } |
| |
| var ArchAMD64P32 = &Arch{ |
| Name: "amd64p32", |
| Family: AMD64, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 4, |
| RegSize: 8, |
| MinLC: 1, |
| } |
| |
| var ArchARM = &Arch{ |
| Name: "arm", |
| Family: ARM, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 4, |
| RegSize: 4, |
| MinLC: 4, |
| } |
| |
| var ArchARM64 = &Arch{ |
| Name: "arm64", |
| Family: ARM64, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 4, |
| } |
| |
| var ArchMIPS = &Arch{ |
| Name: "mips", |
| Family: MIPS, |
| ByteOrder: binary.BigEndian, |
| PtrSize: 4, |
| RegSize: 4, |
| MinLC: 4, |
| } |
| |
| var ArchMIPSLE = &Arch{ |
| Name: "mipsle", |
| Family: MIPS, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 4, |
| RegSize: 4, |
| MinLC: 4, |
| } |
| |
| var ArchMIPS64 = &Arch{ |
| Name: "mips64", |
| Family: MIPS64, |
| ByteOrder: binary.BigEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 4, |
| } |
| |
| var ArchMIPS64LE = &Arch{ |
| Name: "mips64le", |
| Family: MIPS64, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 4, |
| } |
| |
| var ArchPPC64 = &Arch{ |
| Name: "ppc64", |
| Family: PPC64, |
| ByteOrder: binary.BigEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 4, |
| } |
| |
| var ArchPPC64LE = &Arch{ |
| Name: "ppc64le", |
| Family: PPC64, |
| ByteOrder: binary.LittleEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 4, |
| } |
| |
| var ArchS390X = &Arch{ |
| Name: "s390x", |
| Family: S390X, |
| ByteOrder: binary.BigEndian, |
| PtrSize: 8, |
| RegSize: 8, |
| MinLC: 2, |
| } |
| |
| var Archs = [...]*Arch{ |
| Arch386, |
| ArchAMD64, |
| ArchAMD64P32, |
| ArchARM, |
| ArchARM64, |
| ArchMIPS, |
| ArchMIPSLE, |
| ArchMIPS64, |
| ArchMIPS64LE, |
| ArchPPC64, |
| ArchPPC64LE, |
| ArchS390X, |
| } |