diff options
| author | Russ Cox <rsc@golang.org> | 2015-01-16 19:22:58 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2015-01-21 00:44:18 +0000 |
| commit | dba9eb336930ccddafb4bec2ca67d6ea125b1f02 (patch) | |
| tree | cfcbc7b73287ac5f120ca5538b46e6b8f8be486b /src/liblink | |
| parent | 8bf6e09f4cbb0242039dd4602f1f2d58e30e0f26 (diff) | |
| download | go-dba9eb336930ccddafb4bec2ca67d6ea125b1f02.tar.xz | |
build: implement GOEXPERIMENT again in runtime, and add to liblink
For Austin's framepointer experiment.
Change-Id: I81b6f414943b3578924f853300b9193684f79bf4
Reviewed-on: https://go-review.googlesource.com/2994
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/liblink')
| -rw-r--r-- | src/liblink/go.c | 60 | ||||
| -rw-r--r-- | src/liblink/sym.c | 1 |
2 files changed, 61 insertions, 0 deletions
diff --git a/src/liblink/go.c b/src/liblink/go.c index 9f5a423d38..e31c71ab92 100644 --- a/src/liblink/go.c +++ b/src/liblink/go.c @@ -9,6 +9,66 @@ #include <bio.h> #include <link.h> +int framepointer_enabled; +int fieldtrack_enabled; + +// Toolchain experiments. +// These are controlled by the GOEXPERIMENT environment +// variable recorded when the toolchain is built. +// This list is also known to cmd/gc. +static struct { + char *name; + int *val; +} exper[] = { + {"fieldtrack", &fieldtrack_enabled}, + {"basepointer", &framepointer_enabled}, +}; + +static void +addexp(char *s) +{ + int i; + + for(i=0; i < nelem(exper); i++ ) { + if(strcmp(exper[i].name, s) == 0) { + if(exper[i].val != nil) + *exper[i].val = 1; + return; + } + } + + print("unknown experiment %s\n", s); + exits("unknown experiment"); +} + +void +linksetexp(void) +{ + char *f[20]; + int i, nf; + + // cmd/dist #defines GOEXPERIMENT for us. + nf = getfields(GOEXPERIMENT, f, nelem(f), 1, ","); + for(i=0; i<nf; i++) + addexp(f[i]); +} + +char* +expstring(void) +{ + int i; + static char buf[512]; + + strcpy(buf, "X"); + for(i=0; i<nelem(exper); i++) + if(*exper[i].val) + seprint(buf+strlen(buf), buf+sizeof buf, ",%s", exper[i].name); + if(strlen(buf) == 1) + strcpy(buf, "X,none"); + buf[1] = ':'; + return buf; +} + // replace all "". with pkg. char* expandpkg(char *t0, char *pkg) diff --git a/src/liblink/sym.c b/src/liblink/sym.c index e06837118a..35b88f44a2 100644 --- a/src/liblink/sym.c +++ b/src/liblink/sym.c @@ -90,6 +90,7 @@ linknew(LinkArch *arch) char *p; char buf[1024]; + linksetexp(); nuxiinit(arch); ctxt = emallocz(sizeof *ctxt); |
