arch.go raw

   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  }
 188