compiler: sort packages in export data more deterministically
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 9 Apr 2019 04:36:51 +0000 (04:36 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 9 Apr 2019 04:36:51 +0000 (04:36 +0000)
    We can have multiple packages with the same name, so also sort by pkgpath.
    To avoid an inconsistent sort, sort by symbol and pointer address if
    we somehow get two different packages with the same name and pkgpath.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/171032

From-SVN: r270220

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/export.cc

index 1e4da036b8f331f8e01f56c1def8e0840cda9db8..74e811b8a23ffc65c1956615aa6d96bca62336f6 100644 (file)
@@ -1,4 +1,4 @@
-a69f7c05f1880bb90544fb0c3577109cb1d7f3ab
+8822487ed776d55eafed44de7d89ee54bbfbab47
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 963f0bfe842c9453f9883ed16172ed92172d3e28..066455a4ee94891d03e795a409b8771317d12c9d 100644 (file)
@@ -509,7 +509,24 @@ Export::set_type_index(Type* type)
 static bool
 packages_compare(const Package* a, const Package* b)
 {
-  return a->package_name() < b->package_name();
+  if (a->package_name() < b->package_name())
+    return true;
+  else if (a->package_name() > b->package_name())
+    return false;
+
+  if (a->pkgpath() < b->pkgpath())
+    return true;
+  else if (a->pkgpath() > b->pkgpath())
+    return false;
+
+  // In principle if we get here then a == b.  Try to do something sensible
+  // even if the import information is inconsistent.
+  if (a->pkgpath_symbol() < b->pkgpath_symbol())
+    return true;
+  else if (a->pkgpath_symbol() > b->pkgpath_symbol())
+    return false;
+
+  return a < b;
 }
 
 // Write out all the known packages whose pkgpath symbol is not a