From: Richard Henderson <rth@redhat.com>
To: gcc-patches@gcc.gnu.org
Cc: libffi-discuss@sourceware.org, gofrontend-dev@googlegroups.com
Subject: [PATCH 05/13] libgo: Use the static chain for the closure
Date: Fri, 10 Oct 2014 20:43:00 -0000 [thread overview]
Message-ID: <1412973773-3942-6-git-send-email-rth@redhat.com> (raw)
In-Reply-To: <1412973773-3942-1-git-send-email-rth@redhat.com>
Doesn't delete the __go_get/set_closure routines yet, as they're
still referenced by the ffi code, to be updated in another patch.
---
libgo/go/reflect/makefunc_386.S | 22 +++++++++-------------
libgo/go/reflect/makefunc_amd64.S | 13 ++++---------
libgo/runtime/malloc.goc | 8 --------
libgo/runtime/mgc0.c | 3 +--
libgo/runtime/time.goc | 3 +--
5 files changed, 15 insertions(+), 34 deletions(-)
diff --git a/libgo/go/reflect/makefunc_386.S b/libgo/go/reflect/makefunc_386.S
index 0e2e764..c1caf1e 100644
--- a/libgo/go/reflect/makefunc_386.S
+++ b/libgo/go/reflect/makefunc_386.S
@@ -38,7 +38,8 @@ reflect.makeFuncStub:
movl %esp, %ebp
.LCFI1:
pushl %ebx /* In case this is PIC. */
- subl $36, %esp /* Enough for args and to align stack. */
+ pushl %ecx /* Save static chain. */
+ subl $32, %esp /* Enough for args and to align stack. */
.LCFI2:
#ifdef __PIC__
@@ -47,7 +48,7 @@ reflect.makeFuncStub:
#endif
leal 8(%ebp), %eax /* Set esp field in struct. */
- movl %eax, -24(%ebp)
+ movl %eax, -32(%ebp)
/* For MakeFunc functions that call recover. */
movl 4(%ebp), %eax
@@ -58,15 +59,10 @@ reflect.makeFuncStub:
call __go_makefunc_can_recover
#endif
-#ifdef __PIC__
- call __go_get_closure@PLT
-#else
- call __go_get_closure
-#endif
-
+ movl -8(%ebp), %eax /* Recover static chain. */
movl %eax, 4(%esp)
- leal -24(%ebp), %eax
+ leal -32(%ebp), %eax
movl %eax, (%esp)
#ifdef __PIC__
@@ -84,21 +80,21 @@ reflect.makeFuncStub:
/* Set return registers. */
- movl -20(%ebp), %eax
+ movl -28(%ebp), %eax
cmpb $0, -7(%ebp)
je 2f
- fldl -16(%ebp)
+ fldl -24(%ebp)
#ifdef __SSE2__
/* In case we are compiling with -msseregparm. This won't work
correctly if only SSE1 is supported, but that seems unlikely. */
- movsd -16(%ebp), %xmm0
+ movsd -24(%ebp), %xmm0
#endif
2:
- movb -8(%ebp), %dl
+ movb -16(%ebp), %dl
addl $36, %esp
popl %ebx
diff --git a/libgo/go/reflect/makefunc_amd64.S b/libgo/go/reflect/makefunc_amd64.S
index 88302ee..f7db24f 100644
--- a/libgo/go/reflect/makefunc_amd64.S
+++ b/libgo/go/reflect/makefunc_amd64.S
@@ -41,7 +41,7 @@ reflect.makeFuncStub:
movq %rsp, %rbp
.LCFI1:
- subq $0xc0, %rsp # Space for struct on stack.
+ subq $0xd0, %rsp # Space for struct on stack.
movq %rax, 0x0(%rsp)
movq %rdi, 0x8(%rsp)
@@ -61,6 +61,8 @@ reflect.makeFuncStub:
movdqa %xmm6, 0xa0(%rsp)
movdqa %xmm7, 0xb0(%rsp)
+ movq %r10, 0xc0(%rsp) # Save static chain around call.
+
/* For MakeFunc functions that call recover. */
movq 8(%rbp), %rdi
#ifdef __PIC__
@@ -69,14 +71,7 @@ reflect.makeFuncStub:
call __go_makefunc_can_recover
#endif
- # Get function type.
-#ifdef __PIC__
- call __go_get_closure@PLT
-#else
- call __go_get_closure
-#endif
- movq %rax, %rsi
-
+ movq 0xc0(%rsp), %rsi # Recover static chain.
movq %rsp, %rdi
#ifdef __PIC__
diff --git a/libgo/runtime/malloc.goc b/libgo/runtime/malloc.goc
index c5e64c8..0288722 100644
--- a/libgo/runtime/malloc.goc
+++ b/libgo/runtime/malloc.goc
@@ -84,7 +84,6 @@ runtime_mallocgc(uintptr size, uintptr typ, uint32 flag)
MLink *v, *next;
byte *tiny;
bool incallback;
- void *closure;
if(size == 0) {
// All 0-length allocations use this pointer.
@@ -96,10 +95,6 @@ runtime_mallocgc(uintptr size, uintptr typ, uint32 flag)
m = runtime_m();
g = runtime_g();
- // We should not be called in between __go_set_closure and the
- // actual function call, but cope with it if we are.
- closure = g->closure;
-
incallback = false;
if(m->mcache == nil && g->ncgo > 0) {
// For gccgo this case can occur when a cgo or SWIG function
@@ -180,7 +175,6 @@ runtime_mallocgc(uintptr size, uintptr typ, uint32 flag)
m->locks--;
if(incallback)
runtime_entersyscall();
- g->closure = closure;
return v;
}
}
@@ -270,8 +264,6 @@ runtime_mallocgc(uintptr size, uintptr typ, uint32 flag)
if(incallback)
runtime_entersyscall();
- g->closure = closure;
-
return v;
}
diff --git a/libgo/runtime/mgc0.c b/libgo/runtime/mgc0.c
index dda1845..7726eec 100644
--- a/libgo/runtime/mgc0.c
+++ b/libgo/runtime/mgc0.c
@@ -133,8 +133,7 @@ clearpools(void)
// clear sync.Pool's
if(poolcleanup != nil) {
- __go_set_closure(poolcleanup);
- poolcleanup->fn();
+ poolcleanup->fn() __builtin_call_chain(poolcleanup);
}
for(pp=runtime_allp; (p=*pp) != nil; pp++) {
diff --git a/libgo/runtime/time.goc b/libgo/runtime/time.goc
index 220629b..645164c 100644
--- a/libgo/runtime/time.goc
+++ b/libgo/runtime/time.goc
@@ -239,8 +239,7 @@ timerproc(void* dummy __attribute__ ((unused)))
runtime_unlock(&timers);
if(raceenabled)
runtime_raceacquire(t);
- __go_set_closure(fv);
- f(now, arg);
+ f(now, arg) __builtin_call_chain(fv);
// clear f and arg to avoid leak while sleeping for next timer
f = nil;
--
1.9.3
next prev parent reply other threads:[~2014-10-10 20:43 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-10 20:43 [PATCH 00/13] Go closures, libffi, and the static chain Richard Henderson
2014-10-10 20:43 ` [PATCH 02/13] Allow the front-end to create calls with a " Richard Henderson
2014-10-10 20:43 ` [PATCH 08/13] libgo: Use the new libffi interfaces for Go Richard Henderson
2014-10-10 20:43 ` [PATCH 07/13] libffi: Support go closures on x86_64 Richard Henderson
2014-10-10 20:43 ` [PATCH 09/13] libgo: Remove __go_get/set_closure Richard Henderson
2014-10-10 20:43 ` [PATCH 01/13] Make TARGET_STATIC_CHAIN allow a function type Richard Henderson
2014-10-10 20:43 ` [PATCH 03/13] HACK! Allow the static chain to be set from C Richard Henderson
2014-10-11 0:33 ` Ian Lance Taylor
[not found] ` <CAMn1gO7vJOcNi218p9m32de_rrnKBrUcGF-EKP3dJwaL+8BtUw@mail.gmail.com>
2014-10-11 1:42 ` [gofrontend-dev] " Peter Collingbourne
2014-10-11 4:24 ` Richard Henderson
2014-10-13 8:10 ` Richard Biener
2014-10-13 18:46 ` Peter Collingbourne
2014-10-14 18:44 ` [PATCH v2 03/13] " Richard Henderson
2014-10-10 20:43 ` [PATCH 13/13] libffi: Support go closures on i386 Richard Henderson
2014-10-10 20:43 ` [PATCH 06/13] libffi: Add entry points for interacting with Go Richard Henderson
2014-10-10 20:43 ` [PATCH 11/13] libffi: Support go closures on aarch64 Richard Henderson
2014-10-10 20:43 ` [PATCH 04/13] Use the static chain as the closure parameter from Go Richard Henderson
2014-10-10 20:43 ` [PATCH 12/13] libffi: Rewrite i386 sysv Richard Henderson
2014-10-10 20:43 ` [PATCH 10/13] libffi: Rewrite aarch64 Richard Henderson
2014-10-10 20:43 ` Richard Henderson [this message]
2014-10-11 0:23 ` [PATCH 00/13] Go closures, libffi, and the static chain Ian Lance Taylor
2014-11-05 21:34 ` Lynn A. Boger
2014-11-06 6:59 ` Richard Henderson
2014-11-06 12:48 ` Alan Modra
2014-11-06 13:04 ` Richard Henderson
2014-11-06 17:45 ` [gofrontend-dev] " Ian Taylor
2014-11-07 7:39 ` Richard Henderson
2014-11-07 8:50 ` Jay
2014-11-07 16:06 ` Ian Taylor
2014-11-07 23:55 ` Alan Modra
2014-11-06 13:10 ` Lynn A. Boger
2014-11-06 13:17 ` Richard Henderson
2014-12-11 9:06 ` Dominik Vogt
2014-12-11 9:21 ` Alan Modra
2014-12-11 10:31 ` [gofrontend-dev] " Dominik Vogt
2014-12-11 12:25 ` Dominik Vogt
2014-12-11 19:56 ` Richard Henderson
2014-12-12 12:06 ` Dominik Vogt
2014-12-12 18:14 ` Richard Henderson
2014-12-15 9:42 ` Dominik Vogt
2014-12-15 20:11 ` Richard Henderson
2014-12-12 13:57 ` Dominik Vogt
2014-12-11 19:38 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1412973773-3942-6-git-send-email-rth@redhat.com \
--to=rth@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=gofrontend-dev@googlegroups.com \
--cc=libffi-discuss@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).