compiler, runtime: remove hmap field from maptypes

This is the gofrontend version of https://golang.org/cl/91796.
    
    This is part of that CL, just the compiler change and required runtime
    changes, in preparation for updating libgo to 1.11.
    
    Relevant part of original CL description:
    
        The hmap field in the maptype is only used by the runtime to check the sizes of
        the hmap structure created by the compiler and runtime agree.
    
        Comments are already present about the hmap structure definitions in the
        compiler and runtime needing to be in sync.
    
    Reviewed-on: https://go-review.googlesource.com/130976

From-SVN: r263941
This commit is contained in:
Ian Lance Taylor 2018-08-29 00:20:25 +00:00
parent d16c446e0b
commit 347462bfee
5 changed files with 3 additions and 23 deletions

View File

@ -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.

View File

@ -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,
@ -8064,11 +8063,6 @@ Map_type::do_type_descriptor(Gogo* gogo, Named_type* name)
go_assert(p->is_field_name("bucket"));
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)

View File

@ -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

View File

@ -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")
}

View File

@ -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