diff options
author | Julian Phillips <julian@quantumfyre.co.uk> | 2011-08-16 14:56:23 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-08-16 14:56:23 -0400 |
commit | 01dd57b3125892e0dc2054436f29cafb38b0a3ef (patch) | |
tree | af5e5271c38fd5ec058258ea71e9ec911d77a0b7 | |
parent | f12e543255894c82533f556b71ffc9f5ce94f286 (diff) | |
download | go-git-01dd57b3125892e0dc2054436f29cafb38b0a3ef.tar.gz |
cgo: omit duplicate symbols in writeDefs
When the C API being used includes multiple names for the same
underlying symbol (e.g. multiple #define's for the same variable), then
cgo will generate the same placeholder variables for each name. This
then prevents the code from compiling due to multiple declarations of
the same variable - so change cgo to only create one instance of the
variable for the underlying symbol.
R=rsc
CC=golang-dev
https://golang.org/cl/4826055
-rw-r--r-- | misc/cgo/test/Makefile | 1 | ||||
-rw-r--r-- | misc/cgo/test/duplicate_symbol.go | 21 | ||||
-rw-r--r-- | src/cmd/cgo/out.go | 14 |
3 files changed, 31 insertions, 5 deletions
diff --git a/misc/cgo/test/Makefile b/misc/cgo/test/Makefile index f26f972898..d4309be3c6 100644 --- a/misc/cgo/test/Makefile +++ b/misc/cgo/test/Makefile @@ -15,6 +15,7 @@ CGOFILES=\ issue1222.go\ issue1328.go\ issue1560.go\ + duplicate_symbol.go\ CGO_OFILES=\ callback_c.o\ diff --git a/misc/cgo/test/duplicate_symbol.go b/misc/cgo/test/duplicate_symbol.go new file mode 100644 index 0000000000..69600de9cb --- /dev/null +++ b/misc/cgo/test/duplicate_symbol.go @@ -0,0 +1,21 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains test cases for cgo. + +package cgotest + +/* +int base_symbol = 0; + +#define alias_one base_symbol +#define alias_two base_symbol +*/ +import "C" + +import "fmt" + +func duplicateSymbols() { + fmt.Printf("%v %v %v\n", C.base_symbol, C.alias_one, C.alias_two) +} diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 9c962b8ff9..498ab1566b 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -59,17 +59,21 @@ func (p *Package) writeDefs() { fmt.Fprintf(fc, cProlog) - var cVars []string + cVars := make(map[string]bool) for _, n := range p.Name { if n.Kind != "var" { continue } - cVars = append(cVars, n.C) - fmt.Fprintf(fm, "extern char %s[];\n", n.C) - fmt.Fprintf(fm, "void *_cgohack_%s = %s;\n\n", n.C, n.C) + if !cVars[n.C] { + fmt.Fprintf(fm, "extern char %s[];\n", n.C) + fmt.Fprintf(fm, "void *_cgohack_%s = %s;\n\n", n.C, n.C) + + fmt.Fprintf(fc, "extern byte *%s;\n", n.C) + + cVars[n.C] = true + } - fmt.Fprintf(fc, "extern byte *%s;\n", n.C) fmt.Fprintf(fc, "void *ยท%s = &%s;\n", n.Mangle, n.C) fmt.Fprintf(fc, "\n") |