1
0
mirror of https://github.com/golang/go synced 2024-11-21 17:54:39 -07:00

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
This commit is contained in:
Julian Phillips 2011-08-16 14:56:23 -04:00 committed by Russ Cox
parent f12e543255
commit 01dd57b312
3 changed files with 31 additions and 5 deletions

View File

@ -15,6 +15,7 @@ CGOFILES=\
issue1222.go\
issue1328.go\
issue1560.go\
duplicate_symbol.go\
CGO_OFILES=\
callback_c.o\

View File

@ -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)
}

View 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")