arch.go (3140B)
1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package sys 6 7 import "encoding/binary" 8 9 // ArchFamily represents a family of one or more related architectures. 10 // For example, ppc64 and ppc64le are both members of the PPC64 family. 11 type ArchFamily byte 12 13 const ( 14 NoArch ArchFamily = iota 15 AMD64 16 ARM 17 ARM64 18 I386 19 MIPS 20 MIPS64 21 PPC64 22 RISCV64 23 S390X 24 Wasm 25 ) 26 27 // Arch represents an individual architecture. 28 type Arch struct { 29 Name string 30 Family ArchFamily 31 32 ByteOrder binary.ByteOrder 33 34 // PtrSize is the size in bytes of pointers and the 35 // predeclared "int", "uint", and "uintptr" types. 36 PtrSize int 37 38 // RegSize is the size in bytes of general purpose registers. 39 RegSize int 40 41 // MinLC is the minimum length of an instruction code. 42 MinLC int 43 } 44 45 // InFamily reports whether a is a member of any of the specified 46 // architecture families. 47 func (a *Arch) InFamily(xs ...ArchFamily) bool { 48 for _, x := range xs { 49 if a.Family == x { 50 return true 51 } 52 } 53 return false 54 } 55 56 var Arch386 = &Arch{ 57 Name: "386", 58 Family: I386, 59 ByteOrder: binary.LittleEndian, 60 PtrSize: 4, 61 RegSize: 4, 62 MinLC: 1, 63 } 64 65 var ArchAMD64 = &Arch{ 66 Name: "amd64", 67 Family: AMD64, 68 ByteOrder: binary.LittleEndian, 69 PtrSize: 8, 70 RegSize: 8, 71 MinLC: 1, 72 } 73 74 var ArchARM = &Arch{ 75 Name: "arm", 76 Family: ARM, 77 ByteOrder: binary.LittleEndian, 78 PtrSize: 4, 79 RegSize: 4, 80 MinLC: 4, 81 } 82 83 var ArchARM64 = &Arch{ 84 Name: "arm64", 85 Family: ARM64, 86 ByteOrder: binary.LittleEndian, 87 PtrSize: 8, 88 RegSize: 8, 89 MinLC: 4, 90 } 91 92 var ArchMIPS = &Arch{ 93 Name: "mips", 94 Family: MIPS, 95 ByteOrder: binary.BigEndian, 96 PtrSize: 4, 97 RegSize: 4, 98 MinLC: 4, 99 } 100 101 var ArchMIPSLE = &Arch{ 102 Name: "mipsle", 103 Family: MIPS, 104 ByteOrder: binary.LittleEndian, 105 PtrSize: 4, 106 RegSize: 4, 107 MinLC: 4, 108 } 109 110 var ArchMIPS64 = &Arch{ 111 Name: "mips64", 112 Family: MIPS64, 113 ByteOrder: binary.BigEndian, 114 PtrSize: 8, 115 RegSize: 8, 116 MinLC: 4, 117 } 118 119 var ArchMIPS64LE = &Arch{ 120 Name: "mips64le", 121 Family: MIPS64, 122 ByteOrder: binary.LittleEndian, 123 PtrSize: 8, 124 RegSize: 8, 125 MinLC: 4, 126 } 127 128 var ArchPPC64 = &Arch{ 129 Name: "ppc64", 130 Family: PPC64, 131 ByteOrder: binary.BigEndian, 132 PtrSize: 8, 133 RegSize: 8, 134 MinLC: 4, 135 } 136 137 var ArchPPC64LE = &Arch{ 138 Name: "ppc64le", 139 Family: PPC64, 140 ByteOrder: binary.LittleEndian, 141 PtrSize: 8, 142 RegSize: 8, 143 MinLC: 4, 144 } 145 146 var ArchRISCV64 = &Arch{ 147 Name: "riscv64", 148 Family: RISCV64, 149 ByteOrder: binary.LittleEndian, 150 PtrSize: 8, 151 RegSize: 8, 152 MinLC: 4, 153 } 154 155 var ArchS390X = &Arch{ 156 Name: "s390x", 157 Family: S390X, 158 ByteOrder: binary.BigEndian, 159 PtrSize: 8, 160 RegSize: 8, 161 MinLC: 2, 162 } 163 164 var ArchWasm = &Arch{ 165 Name: "wasm", 166 Family: Wasm, 167 ByteOrder: binary.LittleEndian, 168 PtrSize: 8, 169 RegSize: 8, 170 MinLC: 1, 171 } 172 173 var Archs = [...]*Arch{ 174 Arch386, 175 ArchAMD64, 176 ArchARM, 177 ArchARM64, 178 ArchMIPS, 179 ArchMIPSLE, 180 ArchMIPS64, 181 ArchMIPS64LE, 182 ArchPPC64, 183 ArchPPC64LE, 184 ArchRISCV64, 185 ArchS390X, 186 ArchWasm, 187 }