From: Ian Lance Taylor Date: Mon, 31 May 2010 05:22:47 +0000 (-0700) Subject: Correct _cgo_free when C ABI does not pass first arg on stack. X-Git-Tag: weekly.2010-06-09~62 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=1192c175fe2e82adba91c7485b458e65c6a61e70;p=gostls13.git Correct _cgo_free when C ABI does not pass first arg on stack. It turns out that _cgo_malloc is used, via cmalloc in runtime/cgocall.c, which is called by code generated by out.go for the ·_C_CString function. I can't find a call to _cgo_free, but given _cgo_malloc we might as well keep _cgo_free. This patch fixes it so that it should work on amd64. R=rsc CC=golang-dev https://golang.org/cl/1399041 --- diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 2fae48fe47..e58923ab2a 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -568,7 +568,7 @@ const cProlog = ` #pragma dynimport libcgo_thread_start libcgo_thread_start "%s/libcgo.so" #pragma dynimport libcgo_set_scheduler libcgo_set_scheduler "%s/libcgo.so" #pragma dynimport _cgo_malloc _cgo_malloc "%s/libcgo.so" -#pragma dynimport _cgo_free free "%s/libcgo.so" +#pragma dynimport _cgo_free _cgo_free "%s/libcgo.so" void ·_C_GoString(int8 *p, String s) diff --git a/src/libcgo/util.c b/src/libcgo/util.c index a814e018b3..c296b493da 100644 --- a/src/libcgo/util.c +++ b/src/libcgo/util.c @@ -4,7 +4,7 @@ #include "libcgo.h" -/* Stub for calling malloc from the other world */ +/* Stub for calling malloc from Go */ void _cgo_malloc(void *p) { @@ -16,6 +16,17 @@ _cgo_malloc(void *p) a->ret = malloc(a->n); } +/* Stub for calling from Go */ +void +_cgo_free(void *p) +{ + struct a { + void *arg; + } *a = p; + + free(a->arg); +} + /* Stub for creating a new thread */ void libcgo_thread_start(ThreadStart *arg)