libgo: add type/const references to sysinfo.c
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 2 May 2018 22:32:23 +0000 (22:32 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 2 May 2018 22:32:23 +0000 (22:32 +0000)
    This patch adds explicit references to various types and constants
    defined by the header files included by sysinfo.c (used to drive the
    generation of gen-sysinfo.go as part of the libgo build via the GCC
    "-fdump-go-spec" option).

    The intent is to enable clients to gather the same info generated by
    "-fdump-go-spec" by instead reading the generated DWARF from a
    sysinfo.o object file compiled with "-g". Some compilers (notably
    clang) try to omit DWARF records for a given type unless there is an
    explicit use of it in the translation unit; the additional references
    are to insure that everything we want to see in the DWARF shows up.

    Reviewed-on: https://go-review.googlesource.com/99063

From-SVN: r259868

gcc/go/gofrontend/MERGE
libgo/mksysinfo.sh
libgo/sysinfo.c

index 09c10470b5473ee24685e8e175f9b1001945d4ff..8de30a1c5a4f2ec2a3fa33a6ee681c9932e1ef93 100644 (file)
@@ -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.
index 1b40dbe73a7abb245d4472701b83470f9d155964..92ecb47906639b774282441aa842abf24f4c25e1 100755 (executable)
@@ -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 ' | \
index 884d01716b84eef689e6c6d7a0b39c37dffda91d..fb11826420054eafef9e459777c82e4d2c9d6973 100644 (file)
@@ -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 <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