From: Rémy Oudompheng Date: Sat, 14 Sep 2013 07:30:36 +0000 (+0200) Subject: cmd/gc: don't generate algs for internal map types. X-Git-Tag: go1.2rc2~219 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=04c40c97c3a76368f878126259fb5d33e0515aaa;p=gostls13.git cmd/gc: don't generate algs for internal map types. Fake types describing the internal structure of hashmaps are generated for use by precise GC. Generating hash and eq functions for these fake types slows down the build and wastes space: the go tool binary size is 13MB instead of 12MB, and the package size on amd64 is 48.7MB instead of 45.3MB. R=golang-dev, daniel.morsing, r, khr, rsc, iant CC=golang-dev https://golang.org/cl/13698043 --- diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index ba73508b8f..59e241bbe3 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -141,6 +141,7 @@ struct Type { uchar etype; uchar nointerface; + uchar noalg; uchar chan; uchar trecur; // to detect loops uchar printed; diff --git a/src/cmd/gc/reflect.c b/src/cmd/gc/reflect.c index d204301b59..ea66eb94b2 100644 --- a/src/cmd/gc/reflect.c +++ b/src/cmd/gc/reflect.c @@ -131,6 +131,7 @@ mapbucket(Type *t) valtype = ptrto(valtype); bucket = typ(TSTRUCT); + bucket->noalg = 1; // The first field is: uint8 topbits[BUCKETSIZE]. // We don't need to encode it as GC doesn't care about it. @@ -192,6 +193,7 @@ hmap(Type *t) bucket = mapbucket(t); h = typ(TSTRUCT); + h->noalg = 1; offset = widthint; // count offset += 4; // flags diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 3b3b576312..b529e2cc9a 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -547,6 +547,9 @@ algtype1(Type *t, Type **bad) if(bad) *bad = T; + if(t->noalg) + return ANOEQ; + switch(t->etype) { case TANY: case TFORW: