X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=libgo%2Fmksysinfo.sh;h=a977f56937b24d8584b0ba2065610b6b8e608f1a;hb=2e58ed3087522ab051c23e0c45fb008a6fbef787;hp=ed57ee14b63d54687cdf1809af6c4626b59c459a;hpb=df32732fa8f155d91b88a998e853ca63621ab3a9;p=gcc.git diff --git a/libgo/mksysinfo.sh b/libgo/mksysinfo.sh index ed57ee14b63..a977f56937b 100755 --- a/libgo/mksysinfo.sh +++ b/libgo/mksysinfo.sh @@ -151,12 +151,21 @@ cat > sysinfo.c < #endif +#if defined(HAVE_LINUX_FS_H) +#include +#endif #if defined(HAVE_LINUX_REBOOT_H) #include #endif #if defined(HAVE_SYS_INOTIFY_H) #include #endif +#if defined(HAVE_NETINET_ICMP6_H) +#include +#endif +#if defined(HAVE_SCHED_H) +#include +#endif /* Constants that may only be defined as expressions on some systems, expressions too complex for -fdump-go-spec to handle. These are @@ -165,6 +174,33 @@ enum { #ifdef TIOCGWINSZ TIOCGWINSZ_val = TIOCGWINSZ, #endif +#ifdef TIOCSWINSZ + TIOCSWINSZ_val = TIOCSWINSZ, +#endif +#ifdef TIOCNOTTY + TIOCNOTTY_val = TIOCNOTTY, +#endif +#ifdef TIOCSCTTY + TIOCSCTTY_val = TIOCSCTTY, +#endif +#ifdef TIOCGPTN + TIOCGPTN_val = TIOCGPTN, +#endif +#ifdef TIOCSPTLCK + TIOCSPTLCK_val = TIOCSPTLCK, +#endif +#ifdef TIOCGDEV + TIOCGDEV_val = TIOCGDEV, +#endif +#ifdef TIOCSIG + TIOCSIG_val = TIOCSIG, +#endif +#ifdef TCGETS + TCGETS_val = TCGETS, +#endif +#ifdef TCSETS + TCSETS_val = TCSETS, +#endif }; EOF @@ -208,10 +244,45 @@ if ! grep '^const O_CLOEXEC' ${OUT} >/dev/null 2>&1; then echo "const O_CLOEXEC = 0" >> ${OUT} fi +# The os package requires F_DUPFD_CLOEXEC to be defined. +if ! grep '^const F_DUPFD_CLOEXEC' ${OUT} >/dev/null 2>&1; then + echo "const F_DUPFD_CLOEXEC = 0" >> ${OUT} +fi + +# These flags can be lost on i386 GNU/Linux when using +# -D_FILE_OFFSET_BITS=64, because we see "#define F_SETLK F_SETLK64" +# before we see the definition of F_SETLK64. +for flag in F_GETLK F_SETLK F_SETLKW; do + if ! grep "^const ${flag} " ${OUT} >/dev/null 2>&1 \ + && grep "^const ${flag}64 " ${OUT} >/dev/null 2>&1; then + echo "const ${flag} = ${flag}64" >> ${OUT} + fi +done + +# The Flock_t struct for fcntl. +grep '^type _flock ' gen-sysinfo.go | \ + sed -e 's/type _flock/type Flock_t/' \ + -e 's/l_type/Type/' \ + -e 's/l_whence/Whence/' \ + -e 's/l_start/Start/' \ + -e 's/l_len/Len/' \ + -e 's/l_pid/Pid/' \ + >> ${OUT} + # The signal numbers. grep '^const _SIG[^_]' gen-sysinfo.go | \ grep -v '^const _SIGEV_' | \ sed -e 's/^\(const \)_\(SIG[^= ]*\)\(.*\)$/\1\2 = Signal(_\2)/' >> ${OUT} +if ! grep '^const SIGPOLL ' ${OUT} >/dev/null 2>&1; then + if grep '^const SIGIO ' ${OUT} > /dev/null 2>&1; then + echo "const SIGPOLL = SIGIO" >> ${OUT} + fi +fi +if ! grep '^const SIGCLD ' ${OUT} >/dev/null 2>&1; then + if grep '^const SIGCHLD ' ${OUT} >/dev/null 2>&1; then + echo "const SIGCLD = SIGCHLD" >> ${OUT} + fi +fi # The syscall numbers. We force the names to upper case. grep '^const _SYS_' gen-sysinfo.go | \ @@ -221,6 +292,14 @@ grep '^const _SYS_' gen-sysinfo.go | \ echo "const $sup = _$sys" >> ${OUT} done +# The GNU/Linux support wants to use SYS_GETDENTS64 if available. +if ! grep '^const SYS_GETDENTS ' ${OUT} >/dev/null 2>&1; then + echo "const SYS_GETDENTS = 0" >> ${OUT} +fi +if ! grep '^const SYS_GETDENTS64 ' ${OUT} >/dev/null 2>&1; then + echo "const SYS_GETDENTS64 = 0" >> ${OUT} +fi + # Stat constants. grep '^const _S_' gen-sysinfo.go | \ sed -e 's/^\(const \)_\(S_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} @@ -261,16 +340,33 @@ grep '^const _SHUT_' gen-sysinfo.go | sed -e 's/^\(const \)_\(SHUT[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} # The net package requires some const definitions. -for m in IP_PKTINFO IPV6_V6ONLY IPPROTO_IPV6 IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_TCLASS; do +for m in IP_PKTINFO IPV6_V6ONLY IPPROTO_IPV6 IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_TCLASS SO_REUSEPORT; do if ! grep "^const $m " ${OUT} >/dev/null 2>&1; then echo "const $m = 0" >> ${OUT} fi done +for m in SOCK_CLOEXEC SOCK_NONBLOCK; do + if ! grep "^const $m " ${OUT} >/dev/null 2>&1; then + echo "const $m = -1" >> ${OUT} + fi +done + +# The syscall package requires AF_LOCAL. +if ! grep '^const AF_LOCAL ' ${OUT} >/dev/null 2>&1; then + if grep '^const AF_UNIX ' ${OUT} >/dev/null 2>&1; then + echo "const AF_LOCAL = AF_UNIX" >> ${OUT} + fi +fi # pathconf constants. grep '^const __PC' gen-sysinfo.go | sed -e 's/^\(const \)__\(PC[^= ]*\)\(.*\)$/\1\2 = __\2/' >> ${OUT} +# The PATH_MAX constant. +if grep '^const _PATH_MAX ' gen-sysinfo.go >/dev/null 2>&1; then + echo 'const PathMax = _PATH_MAX' >> ${OUT} +fi + # epoll constants. grep '^const _EPOLL' gen-sysinfo.go | sed -e 's/^\(const \)_\(EPOLL[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} @@ -343,12 +439,50 @@ if ! grep '^const _PTRACE_TRACEME' ${OUT} > /dev/null 2>&1; then echo "const _PTRACE_TRACEME = 0" >> ${OUT} fi +# A helper function that prints a structure from gen-sysinfo.go with the first +# letter of the field names in upper case. $1 is the name of structure. If $2 +# is not empty, the structure or type is renamed to $2. +upcase_fields () { + name="$1" + def=`grep "^type $name" gen-sysinfo.go` + fields=`echo $def | sed -e 's/^[^{]*{\(.*\)}$/\1/'` + prefix=`echo $def | sed -e 's/{.*//'` + if test "$2" != ""; then + prefix=`echo $prefix | sed -e "s/$1/$2/"` + fi + if test "$fields" != ""; then + nfields= + while test -n "$fields"; do + field=`echo $fields | sed -e 's/^\([^;]*\);.*$/\1/'` + fields=`echo $fields | sed -e 's/^[^;]*; *\(.*\)$/\1/'` + # capitalize the next character. + f=`echo $field | sed -e 's/^\(.\).*$/\1/'` + r=`echo $field | sed -e 's/^.\(.*\)$/\1/'` + f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` + field="$f$r" + nfields="$nfields $field;" + done + echo "${prefix} {$nfields }" + fi +} + # The registers returned by PTRACE_GETREGS. This is probably # GNU/Linux specific; it should do no harm if there is no # _user_regs_struct. regs=`grep '^type _user_regs_struct struct' gen-sysinfo.go || true` +if test "$regs" == ""; then + # s390 + regs=`grep '^type __user_regs_struct struct' gen-sysinfo.go || true` + if test "$regs" != ""; then + # Substructures of __user_regs_struct on s390 + upcase_fields "__user_psw_struct" "PtracePsw" >> ${OUT} || true + upcase_fields "__user_fpregs_struct" "PtraceFpregs" >> ${OUT} || true + upcase_fields "__user_per_struct" "PtracePer" >> ${OUT} || true + fi +fi if test "$regs" != ""; then - regs=`echo $regs | sed -e 's/type _user_regs_struct struct //' -e 's/[{}]//g'` + regs=`echo $regs | + sed -e 's/type __*user_regs_struct struct //' -e 's/[{}]//g'` regs=`echo $regs | sed -e s'/^ *//'` nregs= while test -n "$regs"; do @@ -359,6 +493,10 @@ if test "$regs" != ""; then r=`echo $field | sed -e 's/^.\(.*\)$/\1/'` f=`echo $f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` field="$f$r" + field=`echo "$field" | sed \ + -e 's/__user_psw_struct/PtracePsw/' \ + -e 's/__user_fpregs_struct/PtraceFpregs/' \ + -e 's/__user_per_struct/PtracePer/'` nregs="$nregs $field;" done echo "type PtraceRegs struct {$nregs }" >> ${OUT} @@ -378,7 +516,20 @@ echo "type Uid_t _uid_t" >> ${OUT} echo "type Gid_t _gid_t" >> ${OUT} echo "type Socklen_t _socklen_t" >> ${OUT} -# The long type, needed because that is the type that ptrace returns. +# The C int type. +sizeof_int=`grep '^const ___SIZEOF_INT__ = ' gen-sysinfo.go | sed -e 's/.*= //'` +if test "$sizeof_int" = "4"; then + echo "type _C_int int32" >> ${OUT} + echo "type _C_uint uint32" >> ${OUT} +elif test "$sizeof_int" = "8"; then + echo "type _C_int int64" >> ${OUT} + echo "type _C_uint uint64" >> ${OUT} +else + echo 1>&2 "mksysinfo.sh: could not determine size of int (got $sizeof_int)" + exit 1 +fi + +# The C long type, needed because that is the type that ptrace returns. sizeof_long=`grep '^const ___SIZEOF_LONG__ = ' gen-sysinfo.go | sed -e 's/.*= //'` if test "$sizeof_long" = "4"; then echo "type _C_long int32" >> ${OUT} @@ -470,9 +621,9 @@ fi | sed -e 's/type _stat64/type Stat_t/' \ -e 's/st_size/Size/' \ -e 's/st_blksize/Blksize/' \ -e 's/st_blocks/Blocks/' \ - -e 's/st_atim/Atime/' \ - -e 's/st_mtim/Mtime/' \ - -e 's/st_ctim/Ctime/' \ + -e 's/st_atim/Atim/' \ + -e 's/st_mtim/Mtim/' \ + -e 's/st_ctim/Ctim/' \ -e 's/\([^a-zA-Z0-9_]\)_timeval\([^a-zA-Z0-9_]\)/\1Timeval\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_timespec_t\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ -e 's/\([^a-zA-Z0-9_]\)_timespec\([^a-zA-Z0-9_]\)/\1Timespec\2/g' \ @@ -506,6 +657,8 @@ grep '^const _DT_' gen-sysinfo.go | # The rusage struct. rusage=`grep '^type _rusage struct' gen-sysinfo.go` if test "$rusage" != ""; then + # Remove anonymous unions from GNU/Linux . + rusage=`echo $rusage | sed -e 's/Godump_[0-9][0-9]* struct {\([^}]*\)};/\1/g'` rusage=`echo $rusage | sed -e 's/type _rusage struct //' -e 's/[{}]//g'` rusage=`echo $rusage | sed -e 's/^ *//'` nrusage= @@ -593,12 +746,7 @@ grep '^const _SCM_' gen-sysinfo.go | \ sed -e 's/^\(const \)_\(SCM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} # The ucred struct. -grep '^type _ucred ' gen-sysinfo.go | \ - sed -e 's/_ucred/Ucred/' \ - -e 's/pid/Pid/' \ - -e 's/uid/Uid/' \ - -e 's/gid/Gid/' \ - >> ${OUT} +upcase_fields "_ucred" "Ucred" >> ${OUT} || true # The ip_mreq struct. grep '^type _ip_mreq ' gen-sysinfo.go | \ @@ -640,6 +788,18 @@ if ! grep 'type IPMreqn ' ${OUT} >/dev/null 2>&1; then echo 'type IPMreqn struct { Multiaddr [4]byte; Interface [4]byte; Ifindex int32 }' >> ${OUT} fi +# The icmp6_filter struct. +grep '^type _icmp6_filter ' gen-sysinfo.go | \ + sed -e 's/_icmp6_filter/ICMPv6Filter/' \ + -e 's/data/Data/' \ + -e 's/filt/Filt/' \ + >> ${OUT} + +# We need ICMPv6Filter to compile the syscall package. +if ! grep 'type ICMPv6Filter ' ${OUT} > /dev/null 2>&1; then + echo 'type ICMPv6Filter struct { Data [8]uint32 }' >> ${OUT} +fi + # Try to guess the type to use for fd_set. fd_set=`grep '^type _fd_set ' gen-sysinfo.go || true` fds_bits_type="_C_long" @@ -676,10 +836,55 @@ if ! grep '^const TIOCGWINSZ' ${OUT} >/dev/null 2>&1; then echo 'const TIOCGWINSZ = _TIOCGWINSZ_val' >> ${OUT} fi fi +if ! grep '^const TIOCSWINSZ' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCSWINSZ_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCSWINSZ = _TIOCSWINSZ_val' >> ${OUT} + fi +fi +if ! grep '^const TIOCNOTTY' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCNOTTY_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCNOTTY = _TIOCNOTTY_val' >> ${OUT} + fi +fi +if ! grep '^const TIOCSCTTY' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCSCTTY_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCSCTTY = _TIOCSCTTY_val' >> ${OUT} + fi +fi +if ! grep '^const TIOCGPTN' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCGPTN_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCGPTN = _TIOCGPTN_val' >> ${OUT} + fi +fi +if ! grep '^const TIOCSPTLCK' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCSPTLCK_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCSPTLCK = _TIOCSPTLCK_val' >> ${OUT} + fi +fi +if ! grep '^const TIOCGDEV' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCGDEV_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCGDEV = _TIOCGDEV_val' >> ${OUT} + fi +fi +if ! grep '^const TIOCSIG' ${OUT} >/dev/null 2>&1; then + if grep '^const _TIOCSIG_val' ${OUT} >/dev/null 2>&1; then + echo 'const TIOCSIG = _TIOCSIG_val' >> ${OUT} + fi +fi # The ioctl flags for terminal control -grep '^const _TC[GS]ET' gen-sysinfo.go | \ +grep '^const _TC[GS]ET' gen-sysinfo.go | grep -v _val | \ sed -e 's/^\(const \)_\(TC[GS]ET[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} +if ! grep '^const TCGETS' ${OUT} >/dev/null 2>&1; then + if grep '^const _TCGETS_val' ${OUT} >/dev/null 2>&1; then + echo 'const TCGETS = _TCGETS_val' >> ${OUT} + fi +fi +if ! grep '^const TCSETS' ${OUT} >/dev/null 2>&1; then + if grep '^const _TCSETS_val' ${OUT} >/dev/null 2>&1; then + echo 'const TCSETS = _TCSETS_val' >> ${OUT} + fi +fi # ioctl constants. Might fall back to 0 if TIOCNXCL is missing, too, but # needs handling in syscalls.exec.go. @@ -791,6 +996,7 @@ grep '^type _in_pktinfo ' gen-sysinfo.go | \ -e 's/ipi_ifindex/Ifindex/' \ -e 's/ipi_spec_dst/Spec_dst/' \ -e 's/ipi_addr/Addr/' \ + -e 's/_in_addr/[4]byte/g' \ >> ${OUT} # The in6_pktinfo struct. @@ -826,7 +1032,7 @@ for n in IGNBRK BRKINT IGNPAR PARMRK INPCK ISTRIP INLCR IGNCR ICRNL IUCLC \ TCSAFLUSH TCIFLUSH TCOFLUSH TCIOFLUSH TCOOFF TCOON TCIOFF TCION B0 B50 \ B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 \ B38400 B57600 B115200 B230400 B460800 B500000 B576000 B921600 B1000000 \ - B1152000 B1500000 B2000000 B2500000 B3000000 B4000000; do + B1152000 B1500000 B2000000 B2500000 B3000000 B3500000 B4000000; do grep "^const _$n " gen-sysinfo.go | \ sed -e 's/^\(const \)_\([^=]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} @@ -910,6 +1116,8 @@ grep '^type _rlimit ' gen-sysinfo.go | \ # The RLIMIT constants. grep '^const _RLIMIT_' gen-sysinfo.go | sed -e 's/^\(const \)_\(RLIMIT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} +grep '^const _RLIM_' gen-sysinfo.go | + sed -e 's/^\(const \)_\(RLIM_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} # The sysinfo struct. grep '^type _sysinfo ' gen-sysinfo.go | \ @@ -953,6 +1161,10 @@ grep '^type _utimbuf ' gen-sysinfo.go | \ grep '^const _LOCK_' gen-sysinfo.go | sed -e 's/^\(const \)_\(LOCK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} +# The PRIO constants. +grep '^const _PRIO_' gen-sysinfo.go | \ + sed -e 's/^\(const \)_\(PRIO_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} + # The GNU/Linux LINUX_REBOOT flags. grep '^const _LINUX_REBOOT_' gen-sysinfo.go | sed -e 's/^\(const \)_\(LINUX_REBOOT_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} @@ -990,6 +1202,7 @@ grep '^type _nlmsgerr ' gen-sysinfo.go | \ sed -e 's/_nlmsgerr/NlMsgerr/' \ -e 's/error/Error/' \ -e 's/msg/Msg/' \ + -e 's/_nlmsghdr/NlMsghdr/' \ >> ${OUT} # The GNU/Linux rtnexthop struct. @@ -1004,6 +1217,8 @@ grep '^type _rtnexthop ' gen-sysinfo.go | \ # The GNU/Linux netlink flags. grep '^const _NETLINK_' gen-sysinfo.go | \ sed -e 's/^\(const \)_\(NETLINK_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} +grep '^const _NLA_' gen-sysinfo.go | \ + sed -e 's/^\(const \)_\(NLA_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} # The GNU/Linux packet socket flags. grep '^const _PACKET_' gen-sysinfo.go | \ @@ -1018,20 +1233,21 @@ grep '^type _inotify_event ' gen-sysinfo.go | \ -e 's/len/Len/' \ -e 's/name/Name/' \ -e 's/\[\]/[0]/' \ + -e 's/\[0\]byte/[0]int8/' \ >> ${OUT} -# The Solaris 11 Update 1 _zone_net_addr_t struct. -grep '^type _zone_net_addr_t ' gen-sysinfo.go | \ - sed -e 's/_in6_addr/[16]byte/' \ - >> ${OUT} +# The GNU/Linux CLONE flags. +grep '^const _CLONE_' gen-sysinfo.go | \ + sed -e 's/^\(const \)_\(CLONE_[^= ]*\)\(.*\)$/\1\2 = _\2/' >> ${OUT} # Struct sizes. set cmsghdr Cmsghdr ip_mreq IPMreq ip_mreqn IPMreqn ipv6_mreq IPv6Mreq \ ifaddrmsg IfAddrmsg ifinfomsg IfInfomsg in_pktinfo Inet4Pktinfo \ - in6_pktinfo Inet6PktInfo inotify_event InotifyEvent linger Linger \ + in6_pktinfo Inet6Pktinfo inotify_event InotifyEvent linger Linger \ msghdr Msghdr nlattr NlAttr nlmsgerr NlMsgerr nlmsghdr NlMsghdr \ rtattr RtAttr rtgenmsg RtGenmsg rtmsg RtMsg rtnexthop RtNexthop \ - sock_filter SockFilter sock_fprog SockFprog ucred Ucred + sock_filter SockFilter sock_fprog SockFprog ucred Ucred \ + icmp6_filter ICMPv6Filter while test $# != 0; do nc=$1 ngo=$2 @@ -1053,5 +1269,8 @@ fi if ! grep 'const SizeofIPMreqn ' ${OUT} >/dev/null 2>&1; then echo 'const SizeofIPMreqn = 12' >> ${OUT} fi +if ! grep 'const SizeofICMPv6Filter ' ${OUT} >/dev/null 2>&1; then + echo 'const SizeofICMPv6Filter = 32' >> ${OUT} +fi exit $?