summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Naur <elias.naur@gmail.com>2013-02-01 08:35:33 -0800
committerElias Naur <elias.naur@gmail.com>2013-02-01 08:35:33 -0800
commit3630b4bd29e40e84b7a00ca0af6fc037edd6a309 (patch)
treee8126aa02d64534797dddab4af58acda23a7bcc4
parentef949bdad8314d06b919565d21256226ed12561a (diff)
downloadgo-3630b4bd29e40e84b7a00ca0af6fc037edd6a309.tar.gz
cmd/6c, cmd/6g: add flag to support large-model code generation
Added the -pic flag to 6c and 6g to avoid assembler instructions that cannot?use RIP-relative adressing. This is needed to support the -shared mode in 6l. See also: https://codereview.appspot.com/6926049 https://codereview.appspot.com/6822078 R=golang-dev, rsc CC=golang-dev https://codereview.appspot.com/7064048 Committer: Russ Cox <rsc@golang.org>
-rw-r--r--src/cmd/6c/sgen.c5
-rw-r--r--src/cmd/6g/cgen.c8
-rw-r--r--src/cmd/6g/ggen.c10
-rw-r--r--src/cmd/6g/gsubr.c4
-rw-r--r--src/cmd/cc/cc.h1
-rw-r--r--src/cmd/cc/lex.c2
-rw-r--r--src/cmd/gc/go.h1
-rw-r--r--src/cmd/gc/lex.c2
-rwxr-xr-xsrc/make.bash7
9 files changed, 34 insertions, 6 deletions
diff --git a/src/cmd/6c/sgen.c b/src/cmd/6c/sgen.c
index 42045f8fa..2402a020d 100644
--- a/src/cmd/6c/sgen.c
+++ b/src/cmd/6c/sgen.c
@@ -126,7 +126,10 @@ xcom(Node *n)
break;
case ONAME:
- n->addable = 10;
+ if(flag_largemodel)
+ n->addable = 9;
+ else
+ n->addable = 10;
if(n->class == CPARAM || n->class == CAUTO)
n->addable = 11;
break;
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index 41694100b..0fa773052 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -737,8 +737,12 @@ agenr(Node *n, Node *a, Node *res)
regalloc(&n3, types[tptr], res);
p1 = gins(ALEAQ, N, &n3);
datastring(nl->val.u.sval->s, nl->val.u.sval->len, &p1->from);
- p1->from.scale = 1;
- p1->from.index = n2.val.u.reg;
+ if(flag_largemodel) {
+ gins(AADDQ, &n2, &n3);
+ } else {
+ p1->from.scale = 1;
+ p1->from.index = n2.val.u.reg;
+ }
goto indexdone;
}
diff --git a/src/cmd/6g/ggen.c b/src/cmd/6g/ggen.c
index d8ac6cef6..4cb8244f0 100644
--- a/src/cmd/6g/ggen.c
+++ b/src/cmd/6g/ggen.c
@@ -59,6 +59,7 @@ ginscall(Node *f, int proc)
{
Prog *p;
Node reg, con;
+ Node r1;
switch(proc) {
default:
@@ -76,7 +77,14 @@ ginscall(Node *f, int proc)
case 1: // call in new proc (go)
case 2: // deferred call (defer)
nodreg(&reg, types[TINT64], D_CX);
- gins(APUSHQ, f, N);
+ if(flag_largemodel) {
+ regalloc(&r1, f->type, f);
+ gmove(f, &r1);
+ gins(APUSHQ, &r1, N);
+ regfree(&r1);
+ } else {
+ gins(APUSHQ, f, N);
+ }
nodconst(&con, types[TINT32], argsize(f->type));
gins(APUSHQ, &con, N);
if(proc == 1)
diff --git a/src/cmd/6g/gsubr.c b/src/cmd/6g/gsubr.c
index 65d5ad786..61a8d96d5 100644
--- a/src/cmd/6g/gsubr.c
+++ b/src/cmd/6g/gsubr.c
@@ -554,6 +554,10 @@ ismem(Node *n)
case ONAME:
case OPARAM:
return 1;
+ case OADDR:
+ if(flag_largemodel)
+ return 1;
+ break;
}
return 0;
}
diff --git a/src/cmd/cc/cc.h b/src/cmd/cc/cc.h
index f9e1546ca..5cad8d92b 100644
--- a/src/cmd/cc/cc.h
+++ b/src/cmd/cc/cc.h
@@ -528,6 +528,7 @@ EXTERN int packflg;
EXTERN int fproundflg;
EXTERN int textflag;
EXTERN int dataflag;
+EXTERN int flag_largemodel;
EXTERN int ncontin;
EXTERN int canreach;
EXTERN int warnreach;
diff --git a/src/cmd/cc/lex.c b/src/cmd/cc/lex.c
index b5408cf9e..16238153e 100644
--- a/src/cmd/cc/lex.c
+++ b/src/cmd/cc/lex.c
@@ -174,6 +174,8 @@ main(int argc, char *argv[])
flagcount("t", "debug code generation", &debug['t']);
flagcount("w", "enable warnings", &debug['w']);
flagcount("v", "increase debug verbosity", &debug['v']);
+ if(thechar == '6')
+ flagcount("largemodel", "generate code that assumes a large memory model", &flag_largemodel);
flagparse(&argc, &argv, usage);
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index 1afd1ca56..9d2ff4d46 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -941,6 +941,7 @@ EXTERN int compiling_runtime;
EXTERN int compiling_wrappers;
EXTERN int pure_go;
EXTERN int flag_race;
+EXTERN int flag_largemodel;
EXTERN int nointerface;
EXTERN int fieldtrack_enabled;
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c
index d50b07ddc..9a0176849 100644
--- a/src/cmd/gc/lex.c
+++ b/src/cmd/gc/lex.c
@@ -257,6 +257,8 @@ main(int argc, char *argv[])
flagcount("w", "debug type checking", &debug['w']);
flagcount("x", "debug lexer", &debug['x']);
flagcount("y", "debug declarations in canned imports (with -d)", &debug['y']);
+ if(thechar == '6')
+ flagcount("largemodel", "generate code that assumes a large memory model", &flag_largemodel);
flagparse(&argc, &argv, usage);
diff --git a/src/make.bash b/src/make.bash
index 1190b93ff..6c78f93ce 100755
--- a/src/make.bash
+++ b/src/make.bash
@@ -23,6 +23,9 @@
# GO_LDFLAGS: Additional 5l/6l/8l arguments to use when
# building the commands.
#
+# GO_CCFLAGS: Additional 5c/6c/8c arguments to use when
+# building.
+#
# CGO_ENABLED: Controls cgo usage during the build. Set it to 1
# to include all cgo related files, .c and .go file with "cgo"
# build directive, in the build. Set it to 0 to ignore them.
@@ -129,12 +132,12 @@ echo
if [ "$GOHOSTARCH" != "$GOARCH" -o "$GOHOSTOS" != "$GOOS" ]; then
echo "# Building packages and commands for host, $GOHOSTOS/$GOHOSTARCH."
GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH \
- "$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
+ "$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
echo
fi
echo "# Building packages and commands for $GOOS/$GOARCH."
-"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
+"$GOTOOLDIR"/go_bootstrap install $GO_FLAGS -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
echo
rm -f "$GOTOOLDIR"/go_bootstrap