blob: c63cbbaa76b4d55d1007696303900e4443f9bb60 [file] [log] [blame]
#!/bin/sh
# Copyright 2018 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.
# Code in Makefile.am will invoke this script with two arguments.
# The first is a GOARCH value. The second is a keyword.
# The script will print the value of that keyword for that GOARCH.
# Keywords:
# - bigendian: true or false
# - cachelinesize: the cache line size in bytes
# (for performance only; it's not essential to get this right)
# - defaultphyspagesize: the default physical page size in bytes
# (not currently used, but maybe some day)
# - family: the processor family, from ALLGOARCHFAMILY in configure.ac
# - hugepagesize: size of a huge page in bytes
# (used only to decide when to use madvise with MADV_[NO]HUGEPAGE)
# (set to 0 if there are no huge pages)
# - int64align: alignment of int64 type in bytes
# - maxalign: maximum alignment of values of Go types in bytes
# - minframesize: size of smallest possible function frame in bytes
# (not currently used, may never be used)
# - pcquantum: minimum size of a single instruction in bytes
# - ptrsize: size of a pointer in bytes
if test $# -ne 2; then
echo 1>&2 "usage: goarch <goarch> <keyword>"
exit 1
fi
goarch=$1
keyword=$2
# Default values
bigendian=false
cachelinesize=64
defaultphyspagesize=4096
family=unknown
hugepagesize=0
int64align=8
maxalign=8
minframesize=0
pcquantum=1
ptrsize=8
case $goarch in
386)
family=I386
hugepagesize="1 << 21"
int64align=4
maxalign=4
ptrsize=4
;;
alpha)
family=ALPHA
defaultphyspagesize=8192
pcquantum=4
;;
amd64 | amd64p32)
family=AMD64
hugepagesize="1 << 21"
;;
arm | armbe)
family=ARM
cachelinesize=32
minframesize=4
pcquantum=4
ptrsize=4
case $goarch in
*be)
bigendian=true
;;
esac
;;
arm64 | arm64be)
family=ARM64
cachelinesize=32
defaultphyspagesize=65536
minframesize=8
pcquantum=4
case $goarch in
*be)
bigendian=true
;;
esac
;;
ia64)
family=IA64
cachelinesize=128
defaultphyspagesize=65536
;;
m68k)
family=M68K
bigendian=true
cachelinesize=16
int64align=2
maxalign=2
pcquantum=4
ptrsize=4
;;
mips | mipsle | mips64p32 | mips64p32le)
family=MIPS
bigendian=true
cachelinesize=32
defaultphyspagesize=16384
minframesize=4
pcquantum=4
ptrsize=4
case $goarch in
*le)
bigendian=false
;;
esac
;;
mips64 | mips64le)
family=MIPS64
bigendian=true
cachelinesize=32
defaultphyspagesize=16384
minframesize=8
pcquantum=4
case $goarch in
*le)
bigendian=false
;;
esac
;;
ppc)
family=PPC
bigendian=true
defaultphyspagesize=65536
minframesize=32
pcquantum=4
ptrsize=4
;;
ppc64 | ppc64le)
family=PPC64
bigendian=true
defaultphyspagesize=65536
minframesize=32
pcquantum=4
case $goarch in
*le)
bigendian=false
;;
esac
;;
riscv64)
family=RISCV64
pcquantum=2
;;
s390)
family=S390
bigendian=true
cachelinesize=256
minframesize=4
pcquantum=2
ptrsize=4
;;
s390x)
family=S390X
bigendian=true
cachelinesize=256
minframesize=8
pcquantum=2
;;
sh | shbe)
family=SH
cachelinesize=16
int64align=4
minframesize=4
pcquantum=2
ptrsize=4
case $goarch in
*be)
bigendian=true
;;
esac
;;
sparc)
family=SPARC
bigendian=true
defaultphyspagesize=8192
pcquantum=4
ptrsize=4
;;
sparc64)
family=SPARC64
bigendian=true
defaultphyspagesize=8192
pcquantum=4
;;
*)
echo 1>&2 "unrecognized goarch value \"$goarch\""
exit 1
;;
esac
if test "$family" = "unknown"; then
echo 1>&2 "internal error: no family for goarch value \"$goarch\""
exit 1
fi
case $keyword in
bigendian)
echo $bigendian
;;
cachelinesize)
echo $cachelinesize
;;
defaultphyspagesize)
echo $defaultphyspagesize
;;
family)
echo $family
;;
hugepagesize)
echo $hugepagesize
;;
int64align)
echo $int64align
;;
maxalign)
echo $maxalign
;;
minframesize)
echo $minframesize
;;
pcquantum)
echo $pcquantum
;;
ptrsize)
echo $ptrsize
;;
*)
echo 1>&2 "unrecognized keyword \"$keyword\""
exit 1
;;
esac
exit 0