From 03e6a88ef04abd5916cd54d5255e7f6d6c78789f Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 11 Aug 2014 16:49:13 -0700 Subject: [PATCH] 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 --- src/cmd/cgo/gcc.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 != "" { -- 2.48.1