]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: make Go code order deterministic
authorRuss Cox <rsc@golang.org>
Thu, 7 Jun 2012 16:37:50 +0000 (12:37 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 7 Jun 2012 16:37:50 +0000 (12:37 -0400)
The type declarations were being generated using
a range over a map, which meant that successive
runs produced different orders. This will make sure
successive runs produce the same files.

Fixes #3707.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6300062

src/cmd/cgo/main.go
src/cmd/cgo/out.go

index 7449f04c4c8a2a01f28e4d37bd111802cf25917d..60165961a1fca2dd0586367f32e98fdb9c29b0c0 100644 (file)
@@ -22,6 +22,7 @@ import (
        "path/filepath"
        "reflect"
        "runtime"
+       "sort"
        "strings"
 )
 
@@ -33,9 +34,8 @@ type Package struct {
        GccOptions  []string
        CgoFlags    map[string]string // #cgo flags (CFLAGS, LDFLAGS)
        Written     map[string]bool
-       Name        map[string]*Name    // accumulated Name from Files
-       Typedef     map[string]ast.Expr // accumulated Typedef from Files
-       ExpFunc     []*ExpFunc          // accumulated ExpFunc from Files
+       Name        map[string]*Name // accumulated Name from Files
+       ExpFunc     []*ExpFunc       // accumulated ExpFunc from Files
        Decl        []ast.Decl
        GoFiles     []string // list of Go files
        GccFiles    []string // list of gcc output files
@@ -51,7 +51,15 @@ type File struct {
        Ref      []*Ref              // all references to C.xxx in AST
        ExpFunc  []*ExpFunc          // exported functions for this file
        Name     map[string]*Name    // map from Go name to Name
-       Typedef  map[string]ast.Expr // translations of all necessary types from C
+}
+
+func nameKeys(m map[string]*Name) []string {
+       var ks []string
+       for k := range m {
+               ks = append(ks, k)
+       }
+       sort.Strings(ks)
+       return ks
 }
 
 // A Ref refers to an expression of the form C.xxx in the AST.
index 290b37ac5c0dbb9131aae2f9b40342b95cd4f30b..44f9f306808d42c3ab40f0da786225131093102c 100644 (file)
@@ -71,7 +71,8 @@ func (p *Package) writeDefs() {
        }
 
        cVars := make(map[string]bool)
-       for _, n := range p.Name {
+       for _, key := range nameKeys(p.Name) {
+               n := p.Name[key]
                if n.Kind != "var" {
                        continue
                }
@@ -94,14 +95,16 @@ func (p *Package) writeDefs() {
        }
        fmt.Fprintf(fc, "\n")
 
-       for _, n := range p.Name {
+       for _, key := range nameKeys(p.Name) {
+               n := p.Name[key]
                if n.Const != "" {
                        fmt.Fprintf(fgo2, "const _Cconst_%s = %s\n", n.Go, n.Const)
                }
        }
        fmt.Fprintf(fgo2, "\n")
 
-       for _, n := range p.Name {
+       for _, key := range nameKeys(p.Name) {
+               n := p.Name[key]
                if n.FuncType != nil {
                        p.writeDefsFunc(fc, fgo2, n)
                }
@@ -378,7 +381,8 @@ func (p *Package) writeOutput(f *File, srcfile string) {
        fmt.Fprintf(fgcc, "%s\n", f.Preamble)
        fmt.Fprintf(fgcc, "%s\n", gccProlog)
 
-       for _, n := range f.Name {
+       for _, key := range nameKeys(f.Name) {
+               n := f.Name[key]
                if n.FuncType != nil {
                        p.writeOutputFunc(fgcc, n)
                }