From: Russ Cox Date: Sat, 22 Dec 2012 21:42:22 +0000 (-0500) Subject: runtime: coalesce 0-size allocations X-Git-Tag: go1.1rc2~1545 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ec59b840f93fff4631b60323e28a44967c704e7d;p=gostls13.git runtime: coalesce 0-size allocations Fixes #3996. R=ken2 CC=golang-dev https://golang.org/cl/7001052 --- diff --git a/src/pkg/runtime/malloc.goc b/src/pkg/runtime/malloc.goc index f58045e63e..e37f8927ba 100644 --- a/src/pkg/runtime/malloc.goc +++ b/src/pkg/runtime/malloc.goc @@ -697,14 +697,22 @@ runtime·new(Type *typ, uint8 *ret) if(raceenabled) m->racepc = runtime·getcallerpc(&typ); - flag = typ->kind&KindNoPointers ? FlagNoPointers : 0; - ret = runtime·mallocgc(typ->size, flag, 1, 1); - if(UseSpanType && !flag) { - if(false) { - runtime·printf("new %S: %p\n", *typ->string, ret); + if(typ->size == 0) { + // All 0-length allocations use this pointer. + // The language does not require the allocations to + // have distinct values. + ret = (uint8*)&runtime·zerobase; + } else { + flag = typ->kind&KindNoPointers ? FlagNoPointers : 0; + ret = runtime·mallocgc(typ->size, flag, 1, 1); + + if(UseSpanType && !flag) { + if(false) { + runtime·printf("new %S: %p\n", *typ->string, ret); + } + runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject); } - runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject); } FLUSH(&ret); @@ -719,15 +727,24 @@ runtime·cnew(Type *typ) if(raceenabled) m->racepc = runtime·getcallerpc(&typ); - flag = typ->kind&KindNoPointers ? FlagNoPointers : 0; - ret = runtime·mallocgc(typ->size, flag, 1, 1); - if(UseSpanType && !flag) { - if(false) { - runtime·printf("new %S: %p\n", *typ->string, ret); + if(typ->size == 0) { + // All 0-length allocations use this pointer. + // The language does not require the allocations to + // have distinct values. + ret = (uint8*)&runtime·zerobase; + } else { + flag = typ->kind&KindNoPointers ? FlagNoPointers : 0; + ret = runtime·mallocgc(typ->size, flag, 1, 1); + + if(UseSpanType && !flag) { + if(false) { + runtime·printf("new %S: %p\n", *typ->string, ret); + } + runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject); } - runtime·settype(ret, (uintptr)typ | TypeInfo_SingleObject); } + return ret; }