diff options
author | Elias Naur <elias.naur@gmail.com> | 2013-02-01 08:35:33 -0800 |
---|---|---|
committer | Elias Naur <elias.naur@gmail.com> | 2013-02-01 08:35:33 -0800 |
commit | 3630b4bd29e40e84b7a00ca0af6fc037edd6a309 (patch) | |
tree | e8126aa02d64534797dddab4af58acda23a7bcc4 | |
parent | ef949bdad8314d06b919565d21256226ed12561a (diff) | |
download | go-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.c | 5 | ||||
-rw-r--r-- | src/cmd/6g/cgen.c | 8 | ||||
-rw-r--r-- | src/cmd/6g/ggen.c | 10 | ||||
-rw-r--r-- | src/cmd/6g/gsubr.c | 4 | ||||
-rw-r--r-- | src/cmd/cc/cc.h | 1 | ||||
-rw-r--r-- | src/cmd/cc/lex.c | 2 | ||||
-rw-r--r-- | src/cmd/gc/go.h | 1 | ||||
-rw-r--r-- | src/cmd/gc/lex.c | 2 | ||||
-rwxr-xr-x | src/make.bash | 7 |
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(®, 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 |