mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			498 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			498 lines
		
	
	
		
			9.7 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>
 | |
| SREF(pt_regs);
 | |
| 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
 |