From ca2d32b46d7ac60efe63cc310a0261292afffe20 Mon Sep 17 00:00:00 2001 From: Carl Shapiro Date: Mon, 19 Aug 2013 14:16:55 -0700 Subject: [PATCH] undo CL 12785045 / 71ce80dc4195 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This has broken the 32-bit builds. ««« original CL description cmd/gc, runtime: use type information to scan interface values R=golang-dev, rsc, dvyukov CC=golang-dev https://golang.org/cl/12785045 »»» R=khr, golang-dev, khr CC=golang-dev https://golang.org/cl/13010045 --- src/cmd/gc/pgen.c | 1 + src/pkg/runtime/mgc0.c | 54 +++++++++--------------------------------- 2 files changed, 12 insertions(+), 43 deletions(-) diff --git a/src/cmd/gc/pgen.c b/src/cmd/gc/pgen.c index d649fc49da..f391634067 100644 --- a/src/cmd/gc/pgen.c +++ b/src/cmd/gc/pgen.c @@ -257,6 +257,7 @@ walktype1(Type *t, vlong *xoffset, Bvec *bv) bvset(bv, ((*xoffset / widthptr) * BitsPerPointer) + 1); if(isnilinter(t)) bvset(bv, ((*xoffset / widthptr) * BitsPerPointer)); + bvset(bv, ((*xoffset + widthptr) / widthptr) * BitsPerPointer); *xoffset += t->width; break; diff --git a/src/pkg/runtime/mgc0.c b/src/pkg/runtime/mgc0.c index 0084ca108b..459a980b96 100644 --- a/src/pkg/runtime/mgc0.c +++ b/src/pkg/runtime/mgc0.c @@ -36,10 +36,6 @@ enum { // Pointer map BitsPerPointer = 2, - BitsNoPointer = 0, - BitsPointer = 1, - BitsIface = 2, - BitsEface = 3, }; // Bits in per-word bitmap. @@ -1402,52 +1398,26 @@ struct BitVector uint32 data[]; }; -// Scans an interface data value when the interface type indicates -// that it is a pointer. -static void -scaninterfacedata(uintptr bits, byte *scanp, bool inprologue) -{ - Itab *tab; - Type *type; - - if(!inprologue) { - if(bits == BitsIface) { - tab = *(Itab**)scanp; - if(tab->type->size <= sizeof(void*) && (tab->type->kind & KindNoPointers)) - return; - } else { // bits == BitsEface - type = *(Type**)scanp; - if(type->size <= sizeof(void*) && (type->kind & KindNoPointers)) - return; - } - } - addroot((Obj){scanp+PtrSize, PtrSize, 0}); -} - // Starting from scanp, scans words corresponding to set bits. static void -scanbitvector(byte *scanp, BitVector *bv, bool inprologue) +scanbitvector(byte *scanp, BitVector *bv) { - uintptr word, bits; - uint32 *wordp; + uint32 *wp; + uint32 w; int32 i, remptrs; - wordp = bv->data; + wp = bv->data; for(remptrs = bv->n; remptrs > 0; remptrs -= 32) { - word = *wordp++; + w = *wp++; if(remptrs < 32) i = remptrs; else i = 32; i /= BitsPerPointer; for(; i > 0; i--) { - bits = word & 3; - if(bits != BitsNoPointer && *(void**)scanp != nil) - if(bits == BitsPointer) - addroot((Obj){scanp, PtrSize, 0}); - else - scaninterfacedata(bits, scanp, inprologue); - word >>= BitsPerPointer; + if(w & 3) + addroot((Obj){scanp, PtrSize, 0}); + w >>= BitsPerPointer; scanp += PtrSize; } } @@ -1460,14 +1430,12 @@ addframeroots(Stkframe *frame, void*) Func *f; BitVector *args, *locals; uintptr size; - bool afterprologue; f = frame->fn; // Scan local variables if stack frame has been allocated. // Use pointer information if known. - afterprologue = (frame->varp > (byte*)frame->sp); - if(afterprologue) { + if(frame->varp > (byte*)frame->sp) { locals = runtime·funcdata(f, FUNCDATA_GCLocals); if(locals == nil) { // No locals information, scan everything. @@ -1482,7 +1450,7 @@ addframeroots(Stkframe *frame, void*) // Locals bitmap information, scan just the // pointers in locals. size = (locals->n*PtrSize) / BitsPerPointer; - scanbitvector(frame->varp - size, locals, false); + scanbitvector(frame->varp - size, locals); } } @@ -1490,7 +1458,7 @@ addframeroots(Stkframe *frame, void*) // Use pointer information if known. args = runtime·funcdata(f, FUNCDATA_GCArgs); if(args != nil && args->n > 0) - scanbitvector(frame->argp, args, !afterprologue); + scanbitvector(frame->argp, args); else addroot((Obj){frame->argp, frame->arglen, 0}); } -- 2.48.1