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

Reply via email to