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