aboutsummaryrefslogtreecommitdiff
path: root/src/liblink
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2015-01-16 19:22:58 -0500
committerRuss Cox <rsc@golang.org>2015-01-21 00:44:18 +0000
commitdba9eb336930ccddafb4bec2ca67d6ea125b1f02 (patch)
treecfcbc7b73287ac5f120ca5538b46e6b8f8be486b /src/liblink
parent8bf6e09f4cbb0242039dd4602f1f2d58e30e0f26 (diff)
downloadgo-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.c60
-rw-r--r--src/liblink/sym.c1
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);