From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13131 invoked by alias); 10 Oct 2014 20:43:39 -0000 Mailing-List: contact libffi-discuss-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libffi-discuss-owner@sourceware.org Received: (qmail 12981 invoked by uid 89); 10 Oct 2014 20:43:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qc0-f175.google.com Received: from mail-qc0-f175.google.com (HELO mail-qc0-f175.google.com) (209.85.216.175) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 10 Oct 2014 20:43:35 +0000 Received: by mail-qc0-f175.google.com with SMTP id x13so2533745qcv.20 for ; Fri, 10 Oct 2014 13:43:33 -0700 (PDT) X-Received: by 10.224.4.5 with SMTP id 5mr12912006qap.83.1412973813853; Fri, 10 Oct 2014 13:43:33 -0700 (PDT) Received: from anchor.com (50-194-63-110-static.hfc.comcastbusiness.net. [50.194.63.110]) by mx.google.com with ESMTPSA id s49sm5909008qge.15.2014.10.10.13.43.32 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Oct 2014 13:43:33 -0700 (PDT) From: Richard Henderson 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 Message-Id: <1412973773-3942-6-git-send-email-rth@redhat.com> In-Reply-To: <1412973773-3942-1-git-send-email-rth@redhat.com> References: <1412973773-3942-1-git-send-email-rth@redhat.com> X-IsSubscribed: yes X-SW-Source: 2014/txt/msg00099.txt.bz2 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