summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Phillips <julian@quantumfyre.co.uk>2011-08-16 14:56:23 -0400
committerRuss Cox <rsc@golang.org>2011-08-16 14:56:23 -0400
commit01dd57b3125892e0dc2054436f29cafb38b0a3ef (patch)
treeaf5e5271c38fd5ec058258ea71e9ec911d77a0b7
parentf12e543255894c82533f556b71ffc9f5ce94f286 (diff)
downloadgo-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/Makefile1
-rw-r--r--misc/cgo/test/duplicate_symbol.go21
-rw-r--r--src/cmd/cgo/out.go14
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")