diff options
| author | Joel Sing <joel@sing.id.au> | 2023-08-11 18:54:52 +1000 |
|---|---|---|
| committer | Joel Sing <joel@sing.id.au> | 2023-08-15 03:55:36 +0000 |
| commit | 23e4a4b6e5ef46f2ea3fa3a95efda46df1084cf7 (patch) | |
| tree | 29436719943a406ee66878afae75b5259ff4491c /src/runtime | |
| parent | 60506f4d7f912bff9af886ea1befb8aa9583d535 (diff) | |
| download | go-23e4a4b6e5ef46f2ea3fa3a95efda46df1084cf7.tar.xz | |
runtime/cgo: consolidate linux cgo code
Much of the gcc_linux_*.c code is identical and duplicated across
architectures. Consolidate code for 386, arm, loong64, mips* and
riscv64, where the only difference is the build tags (386 also
has some non-functional ordering differences).
Change-Id: I14ee9a4cc6b72e165239d196b68b6343efaddf0a
Reviewed-on: https://go-review.googlesource.com/c/go/+/518620
Run-TryBot: Joel Sing <joel@sing.id.au>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/cgo/gcc_linux.c (renamed from src/runtime/cgo/gcc_linux_386.c) | 6 | ||||
| -rw-r--r-- | src/runtime/cgo/gcc_linux_arm.c | 63 | ||||
| -rw-r--r-- | src/runtime/cgo/gcc_linux_loong64.c | 63 | ||||
| -rw-r--r-- | src/runtime/cgo/gcc_linux_mips64x.c | 65 | ||||
| -rw-r--r-- | src/runtime/cgo/gcc_linux_mipsx.c | 66 | ||||
| -rw-r--r-- | src/runtime/cgo/gcc_linux_riscv64.c | 63 |
6 files changed, 4 insertions, 322 deletions
diff --git a/src/runtime/cgo/gcc_linux_386.c b/src/runtime/cgo/gcc_linux.c index 9c23c90308..9624df596f 100644 --- a/src/runtime/cgo/gcc_linux_386.c +++ b/src/runtime/cgo/gcc_linux.c @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build linux && (386 || arm || loong64 || mips || mipsle || mips64 || mips64le || riscv64) + #include <pthread.h> #include <string.h> #include <signal.h> @@ -9,15 +11,15 @@ #include "libcgo_unix.h" static void *threadentry(void*); -static void (*setg_gcc)(void*); -// This will be set in gcc_android.c for android-specific customization. void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common)); +static void (*setg_gcc)(void*); void x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) { setg_gcc = setg; + _cgo_set_stacklo(g, NULL); if (x_cgo_inittls) { diff --git a/src/runtime/cgo/gcc_linux_arm.c b/src/runtime/cgo/gcc_linux_arm.c deleted file mode 100644 index 6ebb6c82f6..0000000000 --- a/src/runtime/cgo/gcc_linux_arm.c +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2010 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. - -#include <pthread.h> -#include <string.h> -#include <signal.h> -#include "libcgo.h" -#include "libcgo_unix.h" - -static void *threadentry(void*); - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common)); -static void (*setg_gcc)(void*); - -void -_cgo_sys_thread_start(ThreadStart *ts) -{ - pthread_attr_t attr; - sigset_t ign, oset; - pthread_t p; - size_t size; - int err; - - sigfillset(&ign); - pthread_sigmask(SIG_SETMASK, &ign, &oset); - - pthread_attr_init(&attr); - pthread_attr_getstacksize(&attr, &size); - // Leave stacklo=0 and set stackhi=size; mstart will do the rest. - ts->g->stackhi = size; - err = _cgo_try_pthread_create(&p, &attr, threadentry, ts); - - pthread_sigmask(SIG_SETMASK, &oset, nil); - - if (err != 0) { - fatalf("pthread_create failed: %s", strerror(err)); - } -} - -extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g); -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - crosscall1(ts.fn, setg_gcc, (void*)ts.g); - return nil; -} - -void -x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) -{ - setg_gcc = setg; - _cgo_set_stacklo(g, NULL); - - if (x_cgo_inittls) { - x_cgo_inittls(tlsg, tlsbase); - } -} diff --git a/src/runtime/cgo/gcc_linux_loong64.c b/src/runtime/cgo/gcc_linux_loong64.c deleted file mode 100644 index b7363ccd96..0000000000 --- a/src/runtime/cgo/gcc_linux_loong64.c +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2022 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. - -#include <pthread.h> -#include <string.h> -#include <signal.h> -#include "libcgo.h" -#include "libcgo_unix.h" - -static void *threadentry(void*); - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -static void (*setg_gcc)(void*); - -void -_cgo_sys_thread_start(ThreadStart *ts) -{ - pthread_attr_t attr; - sigset_t ign, oset; - pthread_t p; - size_t size; - int err; - - sigfillset(&ign); - pthread_sigmask(SIG_SETMASK, &ign, &oset); - - pthread_attr_init(&attr); - pthread_attr_getstacksize(&attr, &size); - // Leave stacklo=0 and set stackhi=size; mstart will do the rest. - ts->g->stackhi = size; - err = _cgo_try_pthread_create(&p, &attr, threadentry, ts); - - pthread_sigmask(SIG_SETMASK, &oset, nil); - - if (err != 0) { - fatalf("pthread_create failed: %s", strerror(err)); - } -} - -extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g); -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - crosscall1(ts.fn, setg_gcc, (void*)ts.g); - return nil; -} - -void -x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) -{ - setg_gcc = setg; - _cgo_set_stacklo(g, NULL); - - if (x_cgo_inittls) { - x_cgo_inittls(tlsg, tlsbase); - } -} diff --git a/src/runtime/cgo/gcc_linux_mips64x.c b/src/runtime/cgo/gcc_linux_mips64x.c deleted file mode 100644 index 6f4b52e2b0..0000000000 --- a/src/runtime/cgo/gcc_linux_mips64x.c +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2016 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. - -//go:build linux && (mips64 || mips64le) - -#include <pthread.h> -#include <string.h> -#include <signal.h> -#include "libcgo.h" -#include "libcgo_unix.h" - -static void *threadentry(void*); - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -static void (*setg_gcc)(void*); - -void -_cgo_sys_thread_start(ThreadStart *ts) -{ - pthread_attr_t attr; - sigset_t ign, oset; - pthread_t p; - size_t size; - int err; - - sigfillset(&ign); - pthread_sigmask(SIG_SETMASK, &ign, &oset); - - pthread_attr_init(&attr); - pthread_attr_getstacksize(&attr, &size); - // Leave stacklo=0 and set stackhi=size; mstart will do the rest. - ts->g->stackhi = size; - err = _cgo_try_pthread_create(&p, &attr, threadentry, ts); - - pthread_sigmask(SIG_SETMASK, &oset, nil); - - if (err != 0) { - fatalf("pthread_create failed: %s", strerror(err)); - } -} - -extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g); -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - crosscall1(ts.fn, setg_gcc, (void*)ts.g); - return nil; -} - -void -x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) -{ - setg_gcc = setg; - _cgo_set_stacklo(g, NULL); - - if (x_cgo_inittls) { - x_cgo_inittls(tlsg, tlsbase); - } -} diff --git a/src/runtime/cgo/gcc_linux_mipsx.c b/src/runtime/cgo/gcc_linux_mipsx.c deleted file mode 100644 index f6470d66dc..0000000000 --- a/src/runtime/cgo/gcc_linux_mipsx.c +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2016 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. - -//go:build linux && (mips || mipsle) - -#include <pthread.h> -#include <string.h> -#include <signal.h> -#include "libcgo.h" -#include "libcgo_unix.h" - -static void *threadentry(void*); - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -static void (*setg_gcc)(void*); - -void -_cgo_sys_thread_start(ThreadStart *ts) -{ - pthread_attr_t attr; - sigset_t ign, oset; - pthread_t p; - size_t size; - int err; - - sigfillset(&ign); - pthread_sigmask(SIG_SETMASK, &ign, &oset); - - pthread_attr_init(&attr); - pthread_attr_getstacksize(&attr, &size); - // Leave stacklo=0 and set stackhi=size; mstart will do the rest. - ts->g->stackhi = size; - err = _cgo_try_pthread_create(&p, &attr, threadentry, ts); - - pthread_sigmask(SIG_SETMASK, &oset, nil); - - if (err != 0) { - fatalf("pthread_create failed: %s", strerror(err)); - } -} - -extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g); -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - crosscall1(ts.fn, setg_gcc, (void*)ts.g); - return nil; -} - -void -x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) -{ - setg_gcc = setg; - - _cgo_set_stacklo(g, NULL); - - if (x_cgo_inittls) { - x_cgo_inittls(tlsg, tlsbase); - } -} diff --git a/src/runtime/cgo/gcc_linux_riscv64.c b/src/runtime/cgo/gcc_linux_riscv64.c deleted file mode 100644 index ee4981104a..0000000000 --- a/src/runtime/cgo/gcc_linux_riscv64.c +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2020 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. - -#include <pthread.h> -#include <string.h> -#include <signal.h> -#include "libcgo.h" -#include "libcgo_unix.h" - -static void *threadentry(void*); - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -static void (*setg_gcc)(void*); - -void -_cgo_sys_thread_start(ThreadStart *ts) -{ - pthread_attr_t attr; - sigset_t ign, oset; - pthread_t p; - size_t size; - int err; - - sigfillset(&ign); - pthread_sigmask(SIG_SETMASK, &ign, &oset); - - pthread_attr_init(&attr); - pthread_attr_getstacksize(&attr, &size); - // Leave stacklo=0 and set stackhi=size; mstart will do the rest. - ts->g->stackhi = size; - err = _cgo_try_pthread_create(&p, &attr, threadentry, ts); - - pthread_sigmask(SIG_SETMASK, &oset, nil); - - if (err != 0) { - fatalf("pthread_create failed: %s", strerror(err)); - } -} - -extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g); -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - crosscall1(ts.fn, setg_gcc, (void*)ts.g); - return nil; -} - -void -x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) -{ - setg_gcc = setg; - _cgo_set_stacklo(g, NULL); - - if (x_cgo_inittls) { - x_cgo_inittls(tlsg, tlsbase); - } -} |
