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
This commit is contained in:
Matthew Dempsky 2014-08-11 16:49:13 -07:00 committed by Ian Lance Taylor
parent fce63888ce
commit 03e6a88ef0

View file

@ -229,7 +229,8 @@ func (p *Package) guessKinds(f *File) []*Name {
// Determine kinds for names we already know about, // Determine kinds for names we already know about,
// like #defines or 'struct foo', before bothering with gcc. // like #defines or 'struct foo', before bothering with gcc.
var names, needType []*Name 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 // If we've already found this name as a #define
// and we can translate it as a constant value, do so. // and we can translate it as a constant value, do so.
if n.Define != "" { if n.Define != "" {