diff options
author | Russ Cox <rsc@golang.org> | 2014-09-03 11:36:14 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-09-03 11:36:14 -0400 |
commit | df54deb85b8435816906b08e0341517746cd3565 (patch) | |
tree | cab2f294cec96f61facff91a029c7f95ecc9e6a6 /src/pkg | |
parent | b62dadf5ea6acab08a51abed8fc83db630d63f4d (diff) | |
download | go-df54deb85b8435816906b08e0341517746cd3565.tar.gz |
cmd/cgo, runtime: write cgo stub wrappers in Go, not C
LGTM=alex.brainman, iant
R=golang-codereviews, alex.brainman, iant
CC=dvyukov, golang-codereviews, khr, r
https://codereview.appspot.com/139070043
Diffstat (limited to 'src/pkg')
-rw-r--r-- | src/pkg/runtime/asm_386.s | 11 | ||||
-rw-r--r-- | src/pkg/runtime/asm_amd64.s | 11 | ||||
-rw-r--r-- | src/pkg/runtime/asm_amd64p32.s | 6 | ||||
-rw-r--r-- | src/pkg/runtime/asm_arm.s | 11 | ||||
-rw-r--r-- | src/pkg/runtime/cgocall.c | 11 | ||||
-rw-r--r-- | src/pkg/runtime/cgocall.h | 1 | ||||
-rw-r--r-- | src/pkg/runtime/runtime.h | 1 |
7 files changed, 48 insertions, 4 deletions
diff --git a/src/pkg/runtime/asm_386.s b/src/pkg/runtime/asm_386.s index 07158ef0f..8a5fd3fb0 100644 --- a/src/pkg/runtime/asm_386.s +++ b/src/pkg/runtime/asm_386.s @@ -680,7 +680,15 @@ TEXT gosave<>(SB),NOSPLIT,$0 // Call fn(arg) on the scheduler stack, // aligned appropriately for the gcc ABI. // See cgocall.c for more details. -TEXT runtime·asmcgocall(SB),NOSPLIT,$0-8 +TEXT runtime·asmcgocall(SB),NOSPLIT,$12-8 + MOVL fn+0(FP), AX + MOVL arg+4(FP), BX + MOVL AX, 0(SP) + MOVL BX, 4(SP) + CALL runtime·asmcgocall_errno(SB) + RET + +TEXT runtime·asmcgocall_errno(SB),NOSPLIT,$0-12 MOVL fn+0(FP), AX MOVL arg+4(FP), BX MOVL SP, DX @@ -712,6 +720,7 @@ TEXT runtime·asmcgocall(SB),NOSPLIT,$0-8 MOVL 8(SP), DI MOVL DI, g(CX) MOVL 4(SP), SP + MOVL AX, ret+8(FP) RET // cgocallback(void (*fn)(void*), void *frame, uintptr framesize) diff --git a/src/pkg/runtime/asm_amd64.s b/src/pkg/runtime/asm_amd64.s index 1d98fc265..0846966f1 100644 --- a/src/pkg/runtime/asm_amd64.s +++ b/src/pkg/runtime/asm_amd64.s @@ -764,7 +764,15 @@ TEXT gosave<>(SB),NOSPLIT,$0 // Call fn(arg) on the scheduler stack, // aligned appropriately for the gcc ABI. // See cgocall.c for more details. -TEXT runtime·asmcgocall(SB),NOSPLIT,$0-16 +TEXT runtime·asmcgocall(SB),NOSPLIT,$24-16 + MOVQ fn+0(FP), AX + MOVQ arg+8(FP), BX + MOVQ AX, 0(SP) + MOVQ BX, 8(SP) + CALL runtime·asmcgocall_errno(SB) + RET + +TEXT runtime·asmcgocall_errno(SB),NOSPLIT,$0-20 MOVQ fn+0(FP), AX MOVQ arg+8(FP), BX MOVQ SP, DX @@ -805,6 +813,7 @@ nosave: MOVQ 48(SP), DI MOVQ DI, g(CX) MOVQ 40(SP), SP + MOVL AX, ret+16(FP) RET // cgocallback(void (*fn)(void*), void *frame, uintptr framesize) diff --git a/src/pkg/runtime/asm_amd64p32.s b/src/pkg/runtime/asm_amd64p32.s index 20069a6c7..7886861eb 100644 --- a/src/pkg/runtime/asm_amd64p32.s +++ b/src/pkg/runtime/asm_amd64p32.s @@ -711,6 +711,12 @@ TEXT runtime·asmcgocall(SB),NOSPLIT,$0-8 MOVL 0, AX RET +// asmcgocall(void(*fn)(void*), void *arg) +// Not implemented. +TEXT runtime·asmcgocall_errno(SB),NOSPLIT,$0-12 + MOVL 0, AX + RET + // cgocallback(void (*fn)(void*), void *frame, uintptr framesize) // Not implemented. TEXT runtime·cgocallback(SB),NOSPLIT,$0-12 diff --git a/src/pkg/runtime/asm_arm.s b/src/pkg/runtime/asm_arm.s index 6e12cf60f..67763e1b2 100644 --- a/src/pkg/runtime/asm_arm.s +++ b/src/pkg/runtime/asm_arm.s @@ -493,7 +493,15 @@ TEXT gosave<>(SB),NOSPLIT,$0 // Call fn(arg) on the scheduler stack, // aligned appropriately for the gcc ABI. // See cgocall.c for more details. -TEXT runtime·asmcgocall(SB),NOSPLIT,$0-8 +TEXT runtime·asmcgocall(SB),NOSPLIT,$12-8 + MOVW fn+0(FP), R1 + MOVW arg+4(FP), R2 + MOVW R1, 0(R13) + MOVW R2, 4(R13) + BL runtime·asmcgocall_errno(SB) + RET + +TEXT runtime·asmcgocall_errno(SB),NOSPLIT,$0-12 MOVW fn+0(FP), R1 MOVW arg+4(FP), R0 MOVW R13, R2 @@ -521,6 +529,7 @@ TEXT runtime·asmcgocall(SB),NOSPLIT,$0-8 // Restore registers, g, stack pointer. MOVW 20(R13), g MOVW 16(R13), R13 + MOVW R0, ret+8(FP) RET // cgocallback(void (*fn)(void*), void *frame, uintptr framesize) diff --git a/src/pkg/runtime/cgocall.c b/src/pkg/runtime/cgocall.c index 145ac7dc1..0fd5fbd00 100644 --- a/src/pkg/runtime/cgocall.c +++ b/src/pkg/runtime/cgocall.c @@ -97,7 +97,14 @@ static FuncVal endcgoV = { endcgo }; void runtime·cgocall(void (*fn)(void*), void *arg) { + runtime·cgocall_errno(fn, arg); +} + +int32 +runtime·cgocall_errno(void (*fn)(void*), void *arg) +{ Defer d; + int32 errno; if(!runtime·iscgo && !Solaris && !Windows) runtime·throw("cgocall unavailable"); @@ -140,13 +147,15 @@ runtime·cgocall(void (*fn)(void*), void *arg) * the $GOMAXPROCS accounting. */ runtime·entersyscall(); - runtime·asmcgocall(fn, arg); + errno = runtime·asmcgocall_errno(fn, arg); runtime·exitsyscall(); if(g->defer != &d || d.fn != &endcgoV) runtime·throw("runtime: bad defer entry in cgocallback"); g->defer = d.link; endcgo(); + + return errno; } static void diff --git a/src/pkg/runtime/cgocall.h b/src/pkg/runtime/cgocall.h index 253661a7e..c87a9cdc5 100644 --- a/src/pkg/runtime/cgocall.h +++ b/src/pkg/runtime/cgocall.h @@ -7,6 +7,7 @@ */ void runtime·cgocall(void (*fn)(void*), void*); +int32 runtime·cgocall_errno(void (*fn)(void*), void*); void runtime·cgocallback(void (*fn)(void), void*, uintptr); void *runtime·cmalloc(uintptr); void runtime·cfree(void*); diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h index d67d7a007..0d25ca6c5 100644 --- a/src/pkg/runtime/runtime.h +++ b/src/pkg/runtime/runtime.h @@ -848,6 +848,7 @@ void runtime·tsleep(int64, String); M* runtime·newm(void); void runtime·goexit(void); void runtime·asmcgocall(void (*fn)(void*), void*); +int32 runtime·asmcgocall_errno(void (*fn)(void*), void*); void runtime·entersyscall(void); void runtime·entersyscallblock(void); void runtime·exitsyscall(void); |