Commit 53061193 authored by Russ Cox's avatar Russ Cox

cmd/gc, runtime: enable precisestack by default

[Repeat of CL 64100044, after 32-bit fix in CL 66170043.]

Precisestack makes stack collection completely precise,
in the sense that there are no "used and not set" errors
in the collection of stack frames, no times where the collector
reads a pointer from a stack word that has not actually been
initialized with a pointer (possibly a nil pointer) in that function.

The most important part is interfaces: precisestack means
that if reading an interface value, the interface value is guaranteed
to be initialized, meaning that the type word can be relied
upon to be either nil or a valid interface type word describing
the data word.

This requires additional zeroing of certain values on the stack
on entry, which right now costs about 5% overall execution
time in all.bash. That cost will come down before Go 1.3
(issue 7345).

There are at least two known garbage collector bugs right now,
issues 7343 and 7344. The first happens even without precisestack.
The second I have only seen with precisestack, but that does not
mean that precisestack is what causes it. In fact it is very difficult
to explain by what precisestack does directly. Precisestack may
be exacerbating an existing problem. Both of those issues are
marked for Go 1.3 as well.

The reasons for enabling precisestack now are to give it more
time to soak and because the copying stack work depends on it.

LGTM=r
R=r
CC=golang-codereviews
https://golang.org/cl/65820044
parent 1ca1cbea
...@@ -60,7 +60,7 @@ static void ...@@ -60,7 +60,7 @@ static void
addexp(char *s) addexp(char *s)
{ {
int i; int i;
for(i=0; exper[i].name != nil; i++) { for(i=0; exper[i].name != nil; i++) {
if(strcmp(exper[i].name, s) == 0) { if(strcmp(exper[i].name, s) == 0) {
*exper[i].val = 1; *exper[i].val = 1;
...@@ -77,7 +77,9 @@ setexp(void) ...@@ -77,7 +77,9 @@ setexp(void)
{ {
char *f[20]; char *f[20];
int i, nf; int i, nf;
precisestack_enabled = 1; // on by default
// The makefile #defines GOEXPERIMENT for us. // The makefile #defines GOEXPERIMENT for us.
nf = getfields(GOEXPERIMENT, f, nelem(f), 1, ","); nf = getfields(GOEXPERIMENT, f, nelem(f), 1, ",");
for(i=0; i<nf; i++) for(i=0; i<nf; i++)
......
...@@ -144,7 +144,7 @@ runtime·schedinit(void) ...@@ -144,7 +144,7 @@ runtime·schedinit(void)
Eface i; Eface i;
runtime·sched.maxmcount = 10000; runtime·sched.maxmcount = 10000;
runtime·precisestack = haveexperiment("precisestack"); runtime·precisestack = true; // haveexperiment("precisestack");
runtime·mallocinit(); runtime·mallocinit();
mcommoninit(m); mcommoninit(m);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment