In https://golang.org/cl/91796 in the master Go repository the hmap
field was removed from map types.  While the Go frontend doesn't have
to be compatible, it may as well be.  This implements part of that
change for the Go frontend, just the compiler change and the required
libgo change.  This is in preparation for updating libgo to 1.11.
Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 263840)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-8deaafd14414bb5cbbdf3e2673f61b6d836d7d2a
+da249ffd264154cc992e76ff03f91f700d3bf53e
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/types.cc
===================================================================
--- gcc/go/gofrontend/types.cc  (revision 263749)
+++ gcc/go/gofrontend/types.cc  (working copy)
@@ -7975,12 +7975,11 @@ Map_type::make_map_type_descriptor_type(
       Type* bool_type = Type::lookup_bool_type();
 
       Struct_type* sf =
-       Type::make_builtin_struct_type(12,
+       Type::make_builtin_struct_type(11,
                                       "", tdt,
                                       "key", ptdt,
                                       "elem", ptdt,
                                       "bucket", ptdt,
-                                      "hmap", ptdt,
                                       "keysize", uint8_type,
                                       "indirectkey", bool_type,
                                       "valuesize", uint8_type,
@@ -8065,11 +8064,6 @@ Map_type::do_type_descriptor(Gogo* gogo,
   vals->push_back(Expression::make_type_descriptor(bucket_type, bloc));
 
   ++p;
-  go_assert(p->is_field_name("hmap"));
-  Type* hmap_type = this->hmap_type(bucket_type);
-  vals->push_back(Expression::make_type_descriptor(hmap_type, bloc));
-
-  ++p;
   go_assert(p->is_field_name("keysize"));
   if (keysize > Map_type::max_key_size)
     vals->push_back(Expression::make_integer_int64(ptrsize, uint8_type, bloc));
Index: libgo/go/reflect/type.go
===================================================================
--- libgo/go/reflect/type.go    (revision 263749)
+++ libgo/go/reflect/type.go    (working copy)
@@ -351,7 +351,6 @@ type mapType struct {
        key           *rtype // map key type
        elem          *rtype // map element (value) type
        bucket        *rtype // internal bucket structure
-       hmap          *rtype // internal map header
        keysize       uint8  // size of key slot
        indirectkey   uint8  // store ptr to key instead of key itself
        valuesize     uint8  // size of value slot
Index: libgo/go/runtime/hashmap.go
===================================================================
--- libgo/go/runtime/hashmap.go (revision 263749)
+++ libgo/go/runtime/hashmap.go (working copy)
@@ -311,20 +311,13 @@ func makemap_small() *hmap {
 // If h != nil, the map can be created directly in h.
 // If h.buckets != nil, bucket pointed to can be used as the first bucket.
 func makemap(t *maptype, hint int, h *hmap) *hmap {
-       // The size of hmap should be 48 bytes on 64 bit
-       // and 28 bytes on 32 bit platforms.
-       if sz := unsafe.Sizeof(hmap{}); sz != 8+5*sys.PtrSize {
-               println("runtime: sizeof(hmap) =", sz, ", t.hmap.size =", 
t.hmap.size)
-               throw("bad hmap size")
-       }
-
        if hint < 0 || hint > int(maxSliceCap(t.bucket.size)) {
                hint = 0
        }
 
        // initialize Hmap
        if h == nil {
-               h = (*hmap)(newobject(t.hmap))
+               h = new(hmap)
        }
        h.hash0 = fastrand()
 
@@ -1210,11 +1203,6 @@ func ismapkey(t *_type) bool {
 
 //go:linkname reflect_makemap reflect.makemap
 func reflect_makemap(t *maptype, cap int) *hmap {
-       // Check invariants and reflects math.
-       if sz := unsafe.Sizeof(hmap{}); sz != t.hmap.size {
-               println("runtime: sizeof(hmap) =", sz, ", t.hmap.size =", 
t.hmap.size)
-               throw("bad hmap size")
-       }
        if !ismapkey(t.key) {
                throw("runtime.reflect_makemap: unsupported map key type")
        }
Index: libgo/go/runtime/type.go
===================================================================
--- libgo/go/runtime/type.go    (revision 263749)
+++ libgo/go/runtime/type.go    (working copy)
@@ -72,7 +72,6 @@ type maptype struct {
        key           *_type
        elem          *_type
        bucket        *_type // internal type representing a hash bucket
-       hmap          *_type // internal type representing a hmap
        keysize       uint8  // size of key slot
        indirectkey   bool   // store ptr to key instead of key itself
        valuesize     uint8  // size of value slot

Reply via email to