From: Matthew Dempsky Date: Mon, 11 Aug 2014 23:49:13 +0000 (-0700) Subject: cmd/cgo: iterate over names in deterministic order X-Git-Tag: go1.4beta1~852 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=03e6a88ef04abd5916cd54d5255e7f6d6c78789f;p=gostls13.git cmd/cgo: iterate over names in deterministic order This makes GCC behavior (and cgo build failures) deterministic. Fixes #8487. Ran this shell command on linux/amd64 (Ubuntu 12.04) before and after this change: for x in `seq 100`; do go tool cgo -debug-gcc=true issue8441.go 2>&1 | md5sum done | sort | uniq -c Before: 67 2cdcb8c7c4e290f7d9009abc581b83dd - 10 9a55390df94f7cec6d810f3e20590789 - 10 acfad22140d43d9b9517bbc5dfc3c0df - 13 c337f8fee2304b3a8e3158a4362d8698 - After: 100 785c316cbcbcd50896695050e2fa23c1 - LGTM=minux, iant R=golang-codereviews, bradfitz, minux, iant CC=golang-codereviews https://golang.org/cl/126990043 --- diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 841c848332..aa28060ea7 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -229,7 +229,8 @@ func (p *Package) guessKinds(f *File) []*Name { // Determine kinds for names we already know about, // like #defines or 'struct foo', before bothering with gcc. var names, needType []*Name - for _, n := range f.Name { + for _, key := range nameKeys(f.Name) { + n := f.Name[key] // If we've already found this name as a #define // and we can translate it as a constant value, do so. if n.Define != "" {