diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 09c10470b54..8de30a1c5a4 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -24cd2e0542cc227200c3f91b9e0eefaa726cbc1c +cef3d77a3dc0207454aabdc3ef0e8f9a0ffdf32e The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/libgo/mksysinfo.sh b/libgo/mksysinfo.sh index 1b40dbe73a7..92ecb479066 100755 --- a/libgo/mksysinfo.sh +++ b/libgo/mksysinfo.sh @@ -29,6 +29,7 @@ echo 'type _ unsafe.Pointer' >> ${OUT} # will all have a leading underscore. grep -v '^// ' gen-sysinfo.go | \ grep -v '^func' | \ + grep -v '^var' | \ grep -v '^type _timeval ' | \ grep -v '^type _timespec_t ' | \ grep -v '^type _timespec ' | \ diff --git a/libgo/sysinfo.c b/libgo/sysinfo.c index 884d01716b8..fb118264200 100644 --- a/libgo/sysinfo.c +++ b/libgo/sysinfo.c @@ -289,3 +289,212 @@ 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 +#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 +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