]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: for gccgo add #define to cgo_export.h for expected name
authorIan Lance Taylor <iant@golang.org>
Tue, 29 Apr 2014 12:53:38 +0000 (08:53 -0400)
committerIan Lance Taylor <iant@golang.org>
Tue, 29 Apr 2014 12:53:38 +0000 (08:53 -0400)
For gccgo we rename exported functions so that the compiler
will make them visible.  This CL adds a #define so that C
functions that #include "cgo_export.h" can use the expected
names of the function.

The test for this is the existing issue6833 test in
misc/cgo/test.  Without this CL it fails when using
-compiler=gccgo.

LGTM=minux.ma, rsc
R=golang-codereviews, gobot, rsc, minux.ma
CC=golang-codereviews
https://golang.org/cl/91830046

src/cmd/cgo/out.go

index 3f04f13611b78fe2df9f7dc864f04e0659e26892..a1fc2bd4ff57b66144d141cce25c5da002329454 100644 (file)
@@ -880,10 +880,24 @@ func (p *Package) writeGccgoExports(fgo2, fc, fm *os.File) {
                fmt.Fprintf(cdeclBuf, ")")
                cParams := cdeclBuf.String()
 
+               // We need to use a name that will be exported by the
+               // Go code; otherwise gccgo will make it static and we
+               // will not be able to link against it from the C
+               // code.
                goName := "Cgoexp_" + exp.ExpName
                fmt.Fprintf(fgcch, `extern %s %s %s __asm__("%s.%s");`, cRet, goName, cParams, gccgoSymbolPrefix, goName)
                fmt.Fprint(fgcch, "\n")
 
+               // Use a #define so that the C code that includes
+               // cgo_export.h will be able to refer to the Go
+               // function using the expected name.
+               fmt.Fprintf(fgcch, "#define %s %s\n", exp.ExpName, goName)
+
+               // Use a #undef in _cgo_export.c so that we ignore the
+               // #define from cgo_export.h, since here we are
+               // defining the real function.
+               fmt.Fprintf(fgcc, "#undef %s\n", exp.ExpName)
+
                fmt.Fprint(fgcc, "\n")
                fmt.Fprintf(fgcc, "%s %s %s {\n", cRet, exp.ExpName, cParams)
                fmt.Fprint(fgcc, "\t")