ab2d47a87f
This CL serves as part of an initial change for enabling gollvm building on arm64 linux, the rest of the change will be covered by another one to the gollvm repo. Incorporate type definition of 'uint128' to 'runtime' and 'syscall' packges, the change is not specific to arm64 linux but made available for all platforms. Verified by building and unit-testing gollvm on linux x86-64 and arm64. Verified by building and checking gccgo on linux x86-64 and arm64. Fixes golang/go#33711 Change-Id: I4720c7d810cfd4ef720962fb4104c5641b2459c0 From-SVN: r275919
502 lines
9.8 KiB
C
502 lines
9.8 KiB
C
/* sysinfo.c -- input for mksysinfo.sh
|
|
|
|
Copyright 2009 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. */
|
|
|
|
/* This file is passed to GCC with the -fdump-go-spec option to
|
|
generate a Go version of the system information. */
|
|
|
|
#include "config.h"
|
|
|
|
#include <stddef.h>
|
|
#include <sys/types.h>
|
|
#include <dirent.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <ucontext.h>
|
|
#include <netinet/in.h>
|
|
/* <netinet/tcp.h> needs u_char/u_short, but <sys/bsd_types> is only
|
|
included by <netinet/in.h> if _SGIAPI (i.e. _SGI_SOURCE
|
|
&& !_XOPEN_SOURCE.
|
|
<sys/termios.h> only defines TIOCNOTTY if !_XOPEN_SOURCE, while
|
|
<sys/ttold.h> does so unconditionally. */
|
|
#ifdef __sgi__
|
|
#include <sys/bsd_types.h>
|
|
#include <sys/ttold.h>
|
|
#endif
|
|
#include <netinet/tcp.h>
|
|
#if defined(HAVE_NETINET_IN_SYSTM_H)
|
|
#include <netinet/in_systm.h>
|
|
#endif
|
|
#if defined(HAVE_NETINET_IP_H)
|
|
#include <netinet/ip.h>
|
|
#endif
|
|
#if defined(HAVE_NETINET_IP_MROUTE_H)
|
|
#include <netinet/ip_mroute.h>
|
|
#endif
|
|
#if defined(HAVE_NETINET_IF_ETHER_H)
|
|
#include <netinet/if_ether.h>
|
|
#endif
|
|
#include <signal.h>
|
|
#include <sys/ioctl.h>
|
|
#include <termios.h>
|
|
#if defined(HAVE_SYSCALL_H)
|
|
#include <syscall.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_SYSCALL_H)
|
|
#include <sys/syscall.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_EPOLL_H)
|
|
#include <sys/epoll.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_EVENT_H)
|
|
#include <sys/event.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_FILE_H)
|
|
#include <sys/file.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_MMAN_H)
|
|
#include <sys/mman.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_PRCTL_H)
|
|
#include <sys/prctl.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_PTRACE_H)
|
|
#include <sys/ptrace.h>
|
|
#endif
|
|
#include <sys/resource.h>
|
|
#include <sys/uio.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/time.h>
|
|
#include <sys/times.h>
|
|
#include <sys/wait.h>
|
|
#include <sys/un.h>
|
|
#if defined(HAVE_SYS_USER_H)
|
|
#include <sys/user.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_UTSNAME_H)
|
|
#include <sys/utsname.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_SELECT_H)
|
|
#include <sys/select.h>
|
|
#endif
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include <netdb.h>
|
|
#include <pwd.h>
|
|
#include <grp.h>
|
|
#if defined(HAVE_LINUX_FILTER_H)
|
|
#include <linux/filter.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_IF_ADDR_H)
|
|
#include <linux/if_addr.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_IF_ETHER_H)
|
|
#include <linux/if_ether.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_IF_TUN_H)
|
|
#include <linux/if_tun.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_NETLINK_H)
|
|
#include <linux/netlink.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_PTRACE_H)
|
|
/* Avoid https://sourceware.org/bugzilla/show_bug.cgi?id=762 . */
|
|
#define ia64_fpreg pt_ia64_fpreg
|
|
#define pt_all_user_regs pt_ia64_all_user_regs
|
|
/* Avoid redefinition of ptrace_peeksiginfo from <sys/ptrace.h>.
|
|
https://gcc.gnu.org/PR81324 . */
|
|
#define ptrace_peeksiginfo_args ignore_ptrace_peeksiginfo_args
|
|
#include <linux/ptrace.h>
|
|
#undef ia64_fpreg
|
|
#undef pt_all_user_regs
|
|
#undef ptrace_peeksiginfo_args
|
|
#endif
|
|
#if defined(HAVE_LINUX_RTNETLINK_H)
|
|
#include <linux/rtnetlink.h>
|
|
#endif
|
|
#if defined(HAVE_NET_IF_H)
|
|
#include <net/if.h>
|
|
#endif
|
|
#if defined(HAVE_NET_IF_ARP_H)
|
|
#include <net/if_arp.h>
|
|
#endif
|
|
#if defined(HAVE_NET_ROUTE_H)
|
|
#include <net/route.h>
|
|
#endif
|
|
#if defined (HAVE_NETPACKET_PACKET_H)
|
|
#include <netpacket/packet.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_MOUNT_H)
|
|
#include <sys/mount.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_VFS_H)
|
|
#include <sys/vfs.h>
|
|
#endif
|
|
#if defined(HAVE_STATFS_H)
|
|
#include <sys/statfs.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_TIMEX_H)
|
|
#include <sys/timex.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_SYSINFO_H)
|
|
#include <sys/sysinfo.h>
|
|
#endif
|
|
#if defined(HAVE_UTIME_H)
|
|
#include <utime.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_ETHER_H)
|
|
#include <linux/ether.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_FS_H)
|
|
#include <linux/fs.h>
|
|
#endif
|
|
#if defined(HAVE_LINUX_REBOOT_H)
|
|
#include <linux/reboot.h>
|
|
#endif
|
|
#if defined(HAVE_SYS_INOTIFY_H)
|
|
#include <sys/inotify.h>
|
|
#endif
|
|
#if defined(HAVE_NETINET_ICMP6_H)
|
|
#include <netinet/icmp6.h>
|
|
#endif
|
|
#if defined(HAVE_SCHED_H)
|
|
#include <sched.h>
|
|
#endif
|
|
#if defined(HAVE_SEMAPHORE_H)
|
|
#include <semaphore.h>
|
|
#endif
|
|
#if defined(HAVE_PORT_H)
|
|
#include <port.h>
|
|
#endif
|
|
|
|
#ifdef USE_LIBFFI
|
|
#include "ffi.h"
|
|
#endif
|
|
|
|
/* Constants that may only be defined as expressions on some systems,
|
|
expressions too complex for -fdump-go-spec to handle. These are
|
|
handled specially below. */
|
|
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 TIOCGPGRP
|
|
TIOCGPGRP_val = TIOCGPGRP,
|
|
#endif
|
|
#ifdef TIOCSPGRP
|
|
TIOCSPGRP_val = TIOCSPGRP,
|
|
#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
|
|
#ifdef TUNSETIFF
|
|
TUNSETIFF_val = TUNSETIFF,
|
|
#endif
|
|
#ifdef TUNSETNOCSUM
|
|
TUNSETNOCSUM_val = TUNSETNOCSUM,
|
|
#endif
|
|
#ifdef TUNSETDEBUG
|
|
TUNSETDEBUG_val = TUNSETDEBUG,
|
|
#endif
|
|
#ifdef TUNSETPERSIST
|
|
TUNSETPERSIST_val = TUNSETPERSIST,
|
|
#endif
|
|
#ifdef TUNSETOWNER
|
|
TUNSETOWNER_val = TUNSETOWNER,
|
|
#endif
|
|
#ifdef TUNSETLINK
|
|
TUNSETLINK_val = TUNSETLINK,
|
|
#endif
|
|
#ifdef TUNSETGROUP
|
|
TUNSETGROUP_val = TUNSETGROUP,
|
|
#endif
|
|
#ifdef TUNGETFEATURES
|
|
TUNGETFEATURES_val = TUNGETFEATURES,
|
|
#endif
|
|
#ifdef TUNSETOFFLOAD
|
|
TUNSETOFFLOAD_val = TUNSETOFFLOAD,
|
|
#endif
|
|
#ifdef TUNSETTXFILTER
|
|
TUNSETTXFILTER_val = TUNSETTXFILTER,
|
|
#endif
|
|
#ifdef TUNGETIFF
|
|
TUNGETIFF_val = TUNGETIFF,
|
|
#endif
|
|
#ifdef TUNGETSNDBUF
|
|
TUNGETSNDBUF_val = TUNGETSNDBUF,
|
|
#endif
|
|
#ifdef TUNSETSNDBUF
|
|
TUNSETSNDBUF_val = TUNSETSNDBUF,
|
|
#endif
|
|
#ifdef TUNATTACHFILTER
|
|
TUNATTACHFILTER_val = TUNATTACHFILTER,
|
|
#endif
|
|
#ifdef TUNDETACHFILTER
|
|
TUNDETACHFILTER_val = TUNDETACHFILTER,
|
|
#endif
|
|
#ifdef TUNGETVNETHDRSZ
|
|
TUNGETVNETHDRSZ_val = TUNGETVNETHDRSZ,
|
|
#endif
|
|
#ifdef TUNSETVNETHDRSZ
|
|
TUNSETVNETHDRSZ_val = TUNSETVNETHDRSZ,
|
|
#endif
|
|
#ifdef TUNSETQUEUE
|
|
TUNSETQUEUE_val = TUNSETQUEUE,
|
|
#endif
|
|
#ifdef TUNSETIFINDEX
|
|
TUNSETIFINDEX_val = TUNSETIFINDEX,
|
|
#endif
|
|
#ifdef TUNGETFILTER
|
|
TUNGETFILTER_val = TUNGETFILTER,
|
|
#endif
|
|
#ifdef NLA_HDRLEN
|
|
NLA_HDRLEN_val = NLA_HDRLEN,
|
|
#endif
|
|
};
|
|
|
|
#if defined(HAVE_SYS_EPOLL_H)
|
|
enum {
|
|
epoll_data_offset = offsetof(struct epoll_event, data)
|
|
};
|
|
#endif
|
|
|
|
// The following section introduces explicit references to types and
|
|
// constants of interest to support bootstrapping libgo using a
|
|
// compiler that doesn't support -fdump-go-spec (e.g., clang), via
|
|
// DWARF-based tools. This process is made more difficult due to the
|
|
// fact that clang tries hard to omit types/constants from DWARF if it
|
|
// can't find explicit references to them, so here we make sure that
|
|
// key items are mentioned in ways that will force them into the
|
|
// generated DWARF.
|
|
|
|
#if defined(__clang__)
|
|
|
|
// Make a reference to a type
|
|
#define TREF(typ) typ typ ## ref
|
|
|
|
// Make a reference to an opaque type
|
|
#define OTREF(typ) typ *typ ## ref
|
|
|
|
// Make a reference to a struct tag
|
|
#define SREF(stag) struct stag stag ## ref
|
|
|
|
// Make a reference to an enum literal
|
|
#define EREF(elit) unsigned elit ## fn(unsigned x) { return x == elit ? 1 : 0; }
|
|
|
|
//......................................................................
|
|
|
|
// From dirent.h
|
|
SREF(dirent);
|
|
SREF(dirent64);
|
|
OTREF(DIR);
|
|
|
|
// From fcntl.h
|
|
SREF(flock);
|
|
SREF(flock64);
|
|
|
|
// From ffi headers
|
|
SREF(_ffi_type);
|
|
TREF(ffi_cif);
|
|
TREF(ffi_abi);
|
|
TREF(ffi_status);
|
|
EREF(FFI_OK);
|
|
|
|
// From grp.h
|
|
SREF(group);
|
|
|
|
#if defined(HAVE_LINUX_FILTER_H)
|
|
// From linux/filter.h
|
|
SREF(sock_filter);
|
|
SREF(sock_fprog);
|
|
#endif
|
|
|
|
// From linux/if.h
|
|
EREF(IFF_UP);
|
|
|
|
#if defined(HAVE_LINUX_IF_ADDR_H)
|
|
// From linux/if_addr.h
|
|
SREF(ifaddrmsg);
|
|
EREF(IFA_ADDRESS);
|
|
#endif
|
|
|
|
#if defined(HAVE_LINUX_RTNETLINK_H)
|
|
// From linux/if_link.h
|
|
EREF(IFLA_ADDRESS);
|
|
#endif
|
|
|
|
// From in.h, in6.h, icmp6.h
|
|
SREF(ip_mreq);
|
|
SREF(ip_mreqn);
|
|
SREF(ipv6_mreq);
|
|
SREF(ip6_mtuinfo);
|
|
SREF(icmp6_filter);
|
|
SREF(in_pktinfo);
|
|
EREF(IPPROTO_TCP);
|
|
|
|
#if defined(HAVE_LINUX_RTNETLINK_H)
|
|
// From linux/rtnetlink.h
|
|
SREF(rtgenmsg);
|
|
SREF(rtmsg);
|
|
SREF(ifinfomsg);
|
|
SREF(rtattr);
|
|
SREF(rtnexthop);
|
|
EREF(RTM_BASE);
|
|
EREF(RTN_UNSPEC);
|
|
#endif
|
|
|
|
// From netdb.h
|
|
SREF(addrinfo);
|
|
|
|
// From netlink.h
|
|
SREF(nlattr);
|
|
SREF(nlmsgerr);
|
|
|
|
// From pthread.h and related
|
|
TREF(pthread_attr_t);
|
|
TREF(pthread_t);
|
|
TREF(pthread_mutex_t);
|
|
TREF(pthread_mutexattr_t);
|
|
|
|
// From pwd.h
|
|
SREF(passwd);
|
|
|
|
// From signal.h and related
|
|
TREF(sigset_t);
|
|
TREF(siginfo_t);
|
|
TREF(stack_t);
|
|
SREF(sigaction);
|
|
SREF(sigstack);
|
|
EREF(SI_USER);
|
|
EREF(FPE_INTOVF);
|
|
EREF(BUS_ADRALN);
|
|
EREF(SS_ONSTACK);
|
|
EREF(SEGV_MAPERR);
|
|
|
|
// From stat.h
|
|
SREF(stat64);
|
|
|
|
// From statfs.h
|
|
SREF(statfs);
|
|
SREF(statfs64);
|
|
|
|
// From sysinfo.h
|
|
SREF(sysinfo);
|
|
|
|
// From <sys/epoll.h>
|
|
#if defined(HAVE_SYS_EPOLL_H)
|
|
SREF(epoll_event);
|
|
EREF(EPOLLIN);
|
|
EREF(epoll_data_offset);
|
|
#endif
|
|
|
|
#if defined(HAVE_SYS_MOUNT_H)
|
|
// From sys/mount.h
|
|
EREF(MS_PRIVATE);
|
|
EREF(MNT_FORCE);
|
|
#endif
|
|
|
|
#if defined(HAVE_SYS_PTRACE_H)
|
|
// From <sys/ptrace.h>
|
|
#if defined (__aarch64__)
|
|
SREF(user_pt_regs);
|
|
#else
|
|
SREF(pt_regs);
|
|
#endif
|
|
EREF(PTRACE_PEEKTEXT);
|
|
#endif
|
|
|
|
// From sys/resource.h
|
|
SREF(rusage);
|
|
SREF(rlimit64);
|
|
EREF(RLIMIT_NOFILE);
|
|
EREF(PRIO_USER);
|
|
|
|
// From sys/select.h
|
|
TREF(fd_set);
|
|
|
|
// From sys/socket.h
|
|
SREF(msghdr);
|
|
SREF(cmsghdr);
|
|
SREF(ucred);
|
|
EREF(MSG_OOB);
|
|
EREF(SCM_RIGHTS);
|
|
EREF(SOCK_RAW);
|
|
EREF(SHUT_RD);
|
|
|
|
// From sys/time.h and sys/times.h
|
|
SREF(timespec);
|
|
SREF(timeval);
|
|
SREF(itimerval);
|
|
SREF(tms);
|
|
EREF(ITIMER_PROF);
|
|
|
|
#if defined(HAVE_SYS_TIMEX_H)
|
|
// From sys/timex.h
|
|
SREF(timex);
|
|
#endif
|
|
|
|
// From sys/types.h
|
|
TREF(pid_t);
|
|
TREF(off_t);
|
|
TREF(loff_t);
|
|
TREF(size_t);
|
|
TREF(ssize_t);
|
|
TREF(mode_t);
|
|
TREF(dev_t);
|
|
TREF(time_t);
|
|
|
|
// From sys/ucontext.h
|
|
TREF(ucontext_t);
|
|
|
|
#if defined(HAVE_SYS_USER_H)
|
|
// From sys/user.h
|
|
SREF(user_regs_struct);
|
|
#endif
|
|
|
|
#if defined(HAVE_SYS_UTSNAME_H)
|
|
// From sys/utsname.h
|
|
SREF(utsname);
|
|
#endif
|
|
|
|
// From termios.h
|
|
SREF(termios);
|
|
|
|
// From uio.h
|
|
SREF(iovec);
|
|
|
|
// From utime.h
|
|
SREF(utimbuf);
|
|
|
|
// From unistd.h
|
|
EREF(_PC_NAME_MAX);
|
|
EREF(_SC_GETPW_R_SIZE_MAX);
|
|
|
|
#endif // clang
|