This is the mail archive of the
libffi-discuss@sourceware.org
mailing list for the libffi project.
[PATCH 05/13] libgo: Use the static chain for the closure
- From: Richard Henderson <rth at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: libffi-discuss at sourceware dot org, gofrontend-dev at googlegroups dot com
- Date: Fri, 10 Oct 2014 13:42:45 -0700
- Subject: [PATCH 05/13] libgo: Use the static chain for the closure
- Authentication-results: sourceware.org; auth=none
- References: <1412973773-3942-1-git-send-email-rth at redhat dot 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