From e431398e0947c455e1c34fdd7c0571d17a1365d0 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 22 Dec 2012 11:18:04 -0500 Subject: [PATCH] undo CL 6938073 / 1542912cf09d MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit remove zerostack compiler experiment; will do at link time instead ««« original CL description cmd/gc: add GOEXPERIMENT=zerostack to clear stack on function entry This is expensive but it might be useful in cases where people are suffering from false positives during garbage collection and are willing to trade the CPU time for getting rid of the false positives. On the other hand it only eliminates false positives caused by other function calls, not false positives caused by dead temporaries stored in the current function call. The 5g/6g/8g changes were pulled out of the history, from the last time we needed to do this (to work around a goto bug). The code in go.h, lex.c, pgen.c is new but tiny. R=ken2 CC=golang-dev https://golang.org/cl/6938073 »»» R=ken2 CC=golang-dev https://golang.org/cl/7002051 --- src/cmd/5g/gsubr.c | 58 ---------------------------------------------- src/cmd/6g/gsubr.c | 38 ------------------------------ src/cmd/8g/gsubr.c | 38 ------------------------------ src/cmd/gc/go.h | 2 -- src/cmd/gc/lex.c | 1 - src/cmd/gc/pgen.c | 3 --- 6 files changed, 140 deletions(-) diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c index 3d1c68f804..f023b269c8 100644 --- a/src/cmd/5g/gsubr.c +++ b/src/cmd/5g/gsubr.c @@ -174,64 +174,6 @@ newplist(void) return pl; } -void -clearstk(void) -{ - Plist *pl; - Prog *p, *p1, *p2, *p3; - Node dst, end, zero, con; - - if(plast->firstpc->to.offset <= 0) - return; - - // reestablish context for inserting code - // at beginning of function. - pl = plast; - p1 = pl->firstpc; - p2 = p1->link; - pc = mal(sizeof(*pc)); - clearp(pc); - p1->link = pc; - - // zero stack frame - - // MOVW $4(SP), R1 - nodreg(&dst, types[tptr], 1); - p = gins(AMOVW, N, &dst); - p->from.type = D_CONST; - p->from.reg = REGSP; - p->from.offset = 4; - - // MOVW $n(R1), R2 - nodreg(&end, types[tptr], 2); - p = gins(AMOVW, N, &end); - p->from.type = D_CONST; - p->from.reg = 1; - p->from.offset = p1->to.offset; - - // MOVW $0, R3 - nodreg(&zero, types[TUINT32], 3); - nodconst(&con, types[TUINT32], 0); - gmove(&con, &zero); - - // L: - // MOVW.P R3, 0(R1) +4 - // CMP R1, R2 - // BNE L - p = gins(AMOVW, &zero, &dst); - p->to.type = D_OREG; - p->to.offset = 4; - p->scond |= C_PBIT; - p3 = p; - p = gins(ACMP, &dst, N); - raddr(&end, p); - patch(gbranch(ABNE, T, 0), p3); - - // continue with original code. - gins(ANOP, N, N)->link = p2; - pc = P; -} - void gused(Node *n) { diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c index cdc5fdae2e..65d5ad786f 100644 --- a/src/cmd/6g/gsubr.c +++ b/src/cmd/6g/gsubr.c @@ -172,44 +172,6 @@ newplist(void) return pl; } -void -clearstk(void) -{ - Plist *pl; - Prog *p1, *p2; - Node sp, di, cx, con, ax; - - if((uint32)plast->firstpc->to.offset <= 0) - return; - - // reestablish context for inserting code - // at beginning of function. - pl = plast; - p1 = pl->firstpc; - p2 = p1->link; - pc = mal(sizeof(*pc)); - clearp(pc); - p1->link = pc; - - // zero stack frame - nodreg(&sp, types[tptr], D_SP); - nodreg(&di, types[tptr], D_DI); - nodreg(&cx, types[TUINT64], D_CX); - nodconst(&con, types[TUINT64], (uint32)p1->to.offset / widthptr); - gins(ACLD, N, N); - gins(AMOVQ, &sp, &di); - gins(AMOVQ, &con, &cx); - nodconst(&con, types[TUINT64], 0); - nodreg(&ax, types[TUINT64], D_AX); - gins(AMOVQ, &con, &ax); - gins(AREP, N, N); - gins(ASTOSQ, N, N); - - // continue with original code. - gins(ANOP, N, N)->link = p2; - pc = P; -} - void gused(Node *n) { diff --git a/src/cmd/8g/gsubr.c b/src/cmd/8g/gsubr.c index 93cea21469..dbea45a201 100644 --- a/src/cmd/8g/gsubr.c +++ b/src/cmd/8g/gsubr.c @@ -173,44 +173,6 @@ newplist(void) return pl; } -void -clearstk(void) -{ - Plist *pl; - Prog *p1, *p2; - Node sp, di, cx, con, ax; - - if(plast->firstpc->to.offset <= 0) - return; - - // reestablish context for inserting code - // at beginning of function. - pl = plast; - p1 = pl->firstpc; - p2 = p1->link; - pc = mal(sizeof(*pc)); - clearp(pc); - p1->link = pc; - - // zero stack frame - nodreg(&sp, types[tptr], D_SP); - nodreg(&di, types[tptr], D_DI); - nodreg(&cx, types[TUINT32], D_CX); - nodconst(&con, types[TUINT32], p1->to.offset / widthptr); - gins(ACLD, N, N); - gins(AMOVL, &sp, &di); - gins(AMOVL, &con, &cx); - nodconst(&con, types[TUINT32], 0); - nodreg(&ax, types[TUINT32], D_AX); - gins(AMOVL, &con, &ax); - gins(AREP, N, N); - gins(ASTOSL, N, N); - - // continue with original code. - gins(ANOP, N, N)->link = p2; - pc = P; -} - void gused(Node *n) { diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 42319578a8..36bc4b2954 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -937,7 +937,6 @@ EXTERN int funcdepth; EXTERN int typecheckok; EXTERN int compiling_runtime; EXTERN int compiling_wrappers; -EXTERN int zerostack_enabled; EXTERN int nointerface; EXTERN int fieldtrack_enabled; @@ -1093,7 +1092,6 @@ void genlist(NodeList *l); Node* sysfunc(char *name); void tempname(Node *n, Type *t); Node* temp(Type*); -void clearstk(void); /* * init.c diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 8d6487dea7..eabeaeb646 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -41,7 +41,6 @@ static struct { } exper[] = { // {"rune32", &rune32}, {"fieldtrack", &fieldtrack_enabled}, - {"zerostack", &zerostack_enabled}, {nil, nil}, }; diff --git a/src/cmd/gc/pgen.c b/src/cmd/gc/pgen.c index e2cad14398..7be254fff1 100644 --- a/src/cmd/gc/pgen.c +++ b/src/cmd/gc/pgen.c @@ -141,9 +141,6 @@ compile(Node *fn) if(0) frame(0); - if(zerostack_enabled) - clearstk(); - ret: lineno = lno; } -- 2.48.1