]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: iterate over names in deterministic order
authorMatthew Dempsky <mdempsky@google.com>
Mon, 11 Aug 2014 23:49:13 +0000 (16:49 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 11 Aug 2014 23:49:13 +0000 (16:49 -0700)
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

index 841c8483327cb0f1e528d8f80fe2eec4ea407b47..aa28060ea77b055b9c56a9fcd0876c9401492d3d 100644 (file)
@@ -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 != "" {