diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-11-30 02:09:24 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-11-30 02:09:24 +0000 |
commit | fbe9724cc368a76c8bb04c822a9877b9096758e6 (patch) | |
tree | c1565b1daa9faf905ef5d66188008c4603dd4f77 /libgo/runtime/go-signal.c | |
parent | f521b29334903c4e3c27d4ef67fbf602ac427df7 (diff) | |
download | gcc-fbe9724cc368a76c8bb04c822a9877b9096758e6.zip gcc-fbe9724cc368a76c8bb04c822a9877b9096758e6.tar.gz gcc-fbe9724cc368a76c8bb04c822a9877b9096758e6.tar.bz2 |
runtime: fixes for -buildmode=c-archive
With -buildmode=c-archive, initsig is called before the memory
allocator has been initialized. The code was doing a memory
allocation because of the call to funcPC(sigtramp). When escape
analysis is fully implemented, that call should not allocate. For
now, finesse the issue by calling a C function to get the C function
pointer value of sigtramp.
When returning from a call from C to a Go function, a deferred
function is run to go back to syscall mode. When the call occurs on a
non-Go thread, that call sets g to nil, making it impossible to add
the _defer struct back to the pool. Just drop it and let the garbage
collector clean it up.
Reviewed-on: https://go-review.googlesource.com/33675
From-SVN: r242992
Diffstat (limited to 'libgo/runtime/go-signal.c')
-rw-r--r-- | libgo/runtime/go-signal.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/libgo/runtime/go-signal.c b/libgo/runtime/go-signal.c index c1f1a52..711f71e 100644 --- a/libgo/runtime/go-signal.c +++ b/libgo/runtime/go-signal.c @@ -140,6 +140,15 @@ sigtramp(int sig, siginfo_t *info, void *context) #endif // USING_SPLIT_STACK +// C function to return the address of the sigtramp function. +uintptr getSigtramp(void) __asm__ (GOSYM_PREFIX "runtime.getSigtramp"); + +uintptr +getSigtramp() +{ + return (uintptr)(void*)sigtramp; +} + // C code to manage the sigaction sa_sigaction field, which is // typically a union and so hard for mksysinfo.sh to handle. |