]> Cypherpunks repositories - gostls13.git/commitdiff
cgo: omit duplicate symbols in writeDefs
authorJulian Phillips <julian@quantumfyre.co.uk>
Tue, 16 Aug 2011 18:56:23 +0000 (14:56 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 16 Aug 2011 18:56:23 +0000 (14:56 -0400)
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

misc/cgo/test/Makefile
misc/cgo/test/duplicate_symbol.go [new file with mode: 0644]
src/cmd/cgo/out.go

index f26f972898b30c280e70cdcc42848324eafa1bb3..d4309be3c62245b493c8ce80e434c353b897f10b 100644 (file)
@@ -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 (file)
index 0000000..69600de
--- /dev/null
@@ -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)
+}
index 9c962b8ff9edb36daea53820f142c49b9d119e47..498ab1566bf5a9f47a7a9f996074e835b26ff7e4 100644 (file)
@@ -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")