// TODO(gri) remove eventually
const forceNewExport = false // force new export format - DO NOT SUBMIT with this flag set
-// forceNumberedParams keeps parameter numbering in exported parameter names
-// even where we don't really need it (because the parameter names are not used
-// elsewhere). Leave it enabled for now to remove this difference in generated
-// object files so we can more easily compare old and new format.
-// TODO(gri) remove once we switched to new format
-const forceNumberedParams = true
+// forceObjFileStability enforces additional constraints in export data
+// and other parts of the compiler to eliminate object file differences
+// only due to the choice of export format.
+// TODO(gri) disable and remove once there is only one export format again
+const forceObjFileStability = true
const exportVersion = "v0"
// Functions that can be inlined use numbered parameters so we can distingish them
// from other names in their context after inlining (i.e., the parameter numbering
// is a form of parameter rewriting). See issue 4326 for an example and test case.
- if forceNumberedParams || numbered {
+ if forceObjFileStability || numbered {
if !strings.Contains(name, "·") && f.Nname != nil && f.Nname.Name != nil && f.Nname.Name.Vargen > 0 {
name = fmt.Sprintf("%s·%d", name, f.Nname.Name.Vargen) // append Vargen
}
}
// generate import strings for imported packages
+ if forceObjFileStability {
+ // Sorting the packages is not necessary but to compare binaries created
+ // using textual and binary format we sort by path to reduce differences.
+ sort.Sort(pkgByPath(pkgs))
+ }
for _, p := range pkgs {
if p.Direct {
dimportpath(p)
}
}
+type pkgByPath []*Pkg
+
+func (a pkgByPath) Len() int { return len(a) }
+func (a pkgByPath) Less(i, j int) bool { return a[i].Path < a[j].Path }
+func (a pkgByPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+
func dalgsym(t *Type) *Sym {
var s *Sym
var hashfunc *Sym