mirror of
https://github.com/golang/go
synced 2024-11-25 01:57:56 -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:
parent
f12e543255
commit
01dd57b312
@ -15,6 +15,7 @@ CGOFILES=\
|
||||
issue1222.go\
|
||||
issue1328.go\
|
||||
issue1560.go\
|
||||
duplicate_symbol.go\
|
||||
|
||||
CGO_OFILES=\
|
||||
callback_c.o\
|
||||
|
21
misc/cgo/test/duplicate_symbol.go
Normal file
21
misc/cgo/test/duplicate_symbol.go
Normal 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)
|
||||
}
|
@ -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")
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user