From 58aeb75d4097010ad9bb72b964265b18ab284f93 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 12 Feb 2022 17:12:41 -0800 Subject: runtime: call timer functions via syscall It turns out to be painful to require linking against -lrt on GNU/Linux, as that makes it harder to link Go code into C programs. Instead just call the timer syscalls directly. That is what the upstream library does anyhow. gcc/go/ * gospec.cc: Revert 2022-02-09 change: (RTLIB, RT_LIBRARY): Don't define. (lang_specific_driver): Don't add -lrt if linking statically on GNU/Linux. gotools/ * configure.ac: Revert 2022-02-09 change: (RT_LIBS): Don't define. * Makefile.am (check-runtime): Don't set GOLIBS to $(RT_LIBS). * configure, Makefile.in: Regenerate. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/385475 --- libgo/Makefile.am | 5 ++--- libgo/Makefile.in | 9 +++------ libgo/configure | 11 ++--------- libgo/configure.ac | 6 ------ libgo/go/runtime/os_linux.go | 21 +++++++++++---------- libgo/testsuite/Makefile.in | 1 - 6 files changed, 18 insertions(+), 35 deletions(-) (limited to 'libgo') diff --git a/libgo/Makefile.am b/libgo/Makefile.am index be889f2..9318f38 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -832,8 +832,7 @@ libgo_ldflags = \ libgo_libadd = \ $(libgo_go_objs) ../libbacktrace/libbacktrace.la \ - $(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) \ - $(NET_LIBS) $(RT_LIBS) + $(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS) libgo_la_SOURCES = $(runtime_files) libgo_la_LDFLAGS = $(libgo_ldflags) @@ -924,7 +923,7 @@ GOBENCH = CHECK = \ GC="$(GOC) $(GOCFLAGS) $($(subst /,_,$@)_GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \ export GC; \ - GOLIBS="$(extra_check_libs_$(subst .,_,$(subst /,_,$(@D)))) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS) $(RT_LIBS) $(LIBS)"; \ + GOLIBS="$(extra_check_libs_$(subst .,_,$(subst /,_,$(@D)))) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \ export GOLIBS; \ RUNTESTFLAGS="$(RUNTESTFLAGS)"; \ export RUNTESTFLAGS; \ diff --git a/libgo/Makefile.in b/libgo/Makefile.in index 216be43..642688e 100644 --- a/libgo/Makefile.in +++ b/libgo/Makefile.in @@ -233,8 +233,7 @@ am__DEPENDENCIES_4 = am__DEPENDENCIES_5 = $(am__DEPENDENCIES_3) \ ../libbacktrace/libbacktrace.la $(am__DEPENDENCIES_4) \ $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_4) \ - $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_4) \ - $(am__DEPENDENCIES_4) + $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_4) libgo_llgo_la_DEPENDENCIES = $(am__DEPENDENCIES_5) @LIBGO_IS_LINUX_TRUE@@LIBGO_IS_X86_TRUE@am__objects_1 = \ @LIBGO_IS_LINUX_TRUE@@LIBGO_IS_X86_TRUE@ runtime/go-context.lo @@ -466,7 +465,6 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ -RT_LIBS = @RT_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ @@ -972,8 +970,7 @@ libgo_ldflags = \ libgo_libadd = \ $(libgo_go_objs) ../libbacktrace/libbacktrace.la \ - $(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) \ - $(NET_LIBS) $(RT_LIBS) + $(LIBATOMIC) $(LIBFFI) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS) libgo_la_SOURCES = $(runtime_files) libgo_la_LDFLAGS = $(libgo_ldflags) @@ -1047,7 +1044,7 @@ GOBENCH = CHECK = \ GC="$(GOC) $(GOCFLAGS) $($(subst /,_,$@)_GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \ export GC; \ - GOLIBS="$(extra_check_libs_$(subst .,_,$(subst /,_,$(@D)))) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS) $(RT_LIBS) $(LIBS)"; \ + GOLIBS="$(extra_check_libs_$(subst .,_,$(subst /,_,$(@D)))) $(PTHREAD_LIBS) $(MATH_LIBS) $(NET_LIBS) $(LIBS)"; \ export GOLIBS; \ RUNTESTFLAGS="$(RUNTESTFLAGS)"; \ export RUNTESTFLAGS; \ diff --git a/libgo/configure b/libgo/configure index e240363..ffe17c9 100755 --- a/libgo/configure +++ b/libgo/configure @@ -649,7 +649,6 @@ HAVE_SYS_MMAN_H_FALSE HAVE_SYS_MMAN_H_TRUE PTHREAD_LIBS PTHREAD_CFLAGS -RT_LIBS NET_LIBS MATH_LIBS GOC_IS_LLGO_FALSE @@ -11545,7 +11544,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11548 "configure" +#line 11547 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11651,7 +11650,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11654 "configure" +#line 11653 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -14748,12 +14747,6 @@ $as_echo "$libgo_cv_lib_sockets" >&6; } NET_LIBS="$libgo_cv_lib_sockets" -RT_LIBS= -case ${host} in - *-*-linux*) RT_LIBS=-lrt ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is supported" >&5 $as_echo_n "checking whether -pthread is supported... " >&6; } if ${libgo_cv_lib_pthread+:} false; then : diff --git a/libgo/configure.ac b/libgo/configure.ac index 1b44b22..7e2b98b 100644 --- a/libgo/configure.ac +++ b/libgo/configure.ac @@ -549,12 +549,6 @@ AC_CACHE_CHECK([for socket libraries], libgo_cv_lib_sockets, NET_LIBS="$libgo_cv_lib_sockets" AC_SUBST(NET_LIBS) -RT_LIBS= -case ${host} in - *-*-linux*) RT_LIBS=-lrt ;; -esac -AC_SUBST(RT_LIBS) - dnl Test whether the compiler supports the -pthread option. AC_CACHE_CHECK([whether -pthread is supported], [libgo_cv_lib_pthread], diff --git a/libgo/go/runtime/os_linux.go b/libgo/go/runtime/os_linux.go index 6ffd898..96fb178 100644 --- a/libgo/go/runtime/os_linux.go +++ b/libgo/go/runtime/os_linux.go @@ -18,7 +18,7 @@ type mOS struct { // creates and manages its own timer, and these fields are read and written // only by this thread. But because some of the reads on profileTimerValid // are in signal handling code, access to that field uses atomic operations. - profileTimer uintptr + profileTimer int32 profileTimerValid uint32 } @@ -243,16 +243,17 @@ func osinit() { physHugePageSize = getHugePageSize() } -//go:noescape -//extern-sysinfo timer_create -func timer_create(clockid int32, sevp *_sigevent, timerid *uintptr) int32 +func timer_create(clockid int32, sevp *_sigevent, timerid *int32) int32 { + return int32(syscall(_SYS_timer_create, uintptr(clockid), uintptr(unsafe.Pointer(sevp)), uintptr(unsafe.Pointer(timerid)), 0, 0, 0)) +} -//go:noescape -//extern-sysinfo timer_settime -func timer_settime(timerid uintptr, flags int32, new, old *_itimerspec) int32 +func timer_settime(timerid int32, flags int32, new, old *_itimerspec) int32 { + return int32(syscall(_SYS_timer_settime, uintptr(timerid), uintptr(flags), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old)), 0, 0)) +} -//extern-sysinfo timer_delete -func timer_delete(timerid uintptr) int32 +func timer_delete(timerid int32) int32 { + return int32(syscall(_SYS_timer_delete, uintptr(timerid), 0, 0, 0, 0, 0)) +} // go118UseTimerCreateProfiler enables the per-thread CPU profiler. const go118UseTimerCreateProfiler = true @@ -360,7 +361,7 @@ func setThreadCPUProfiler(hz int32) { spec.it_value.setNsec(1 + int64(fastrandn(uint32(1e9/hz)))) spec.it_interval.setNsec(1e9 / int64(hz)) - var timerid uintptr + var timerid int32 var sevp _sigevent sevp.sigev_notify = _SIGEV_THREAD_ID sevp.sigev_signo = _SIGPROF diff --git a/libgo/testsuite/Makefile.in b/libgo/testsuite/Makefile.in index 6e143fa..7869265 100644 --- a/libgo/testsuite/Makefile.in +++ b/libgo/testsuite/Makefile.in @@ -215,7 +215,6 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ -RT_LIBS = @RT_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ -- cgit v1.1