]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6c, cmd/6g: add flag to support large-model code generation
authorElias Naur <elias.naur@gmail.com>
Fri, 1 Feb 2013 16:35:33 +0000 (08:35 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 1 Feb 2013 16:35:33 +0000 (08:35 -0800)
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://golang.org/cl/6926049
https://golang.org/cl/6822078

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7064048

src/cmd/6c/sgen.c
src/cmd/6g/cgen.c
src/cmd/6g/ggen.c
src/cmd/6g/gsubr.c
src/cmd/cc/cc.h
src/cmd/cc/lex.c
src/cmd/gc/go.h
src/cmd/gc/lex.c
src/make.bash

index 42045f8fa16431bc74deaaf890dabadcd1a5d219..2402a020da34e78f2a4c0219431a3da273db4efa 100644 (file)
@@ -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;
index 41694100b563160064c11ba6e9b2429590df33a5..0fa773052166fdb830b04d1dc72a9f994dede3d9 100644 (file)
@@ -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;
                }
 
index d8ac6cef639cb09ce1f3962c997cb288c41f33ca..4cb8244f056fdb71793d9640edf62a902f314be6 100644 (file)
@@ -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)
index 65d5ad786fa5413130f664d80ce91df1f50c54dd..61a8d96d5343b734b144f8e8c62d8b208be4c01c 100644 (file)
@@ -554,6 +554,10 @@ ismem(Node *n)
        case ONAME:
        case OPARAM:
                return 1;
+       case OADDR:
+               if(flag_largemodel)
+                       return 1;
+               break;
        }
        return 0;
 }
index f9e1546ca3148ecc02b22d2ea9490db284d3f6dc..5cad8d92b415601f3065bda476520538e4917594 100644 (file)
@@ -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;
index b5408cf9ecce615368f098f4d3de4aa66282924a..16238153ec0c91a8a211087b28e5c29ea2552687 100644 (file)
@@ -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);
 
index 1afd1ca56e53fcf3f8c7dd02bdc34cda5b7f5e95..9d2ff4d466e6a797b21d45e87b215c7b8e468696 100644 (file)
@@ -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;
index d50b07ddca969b6089f88b80c792759328643a35..9a017684931788ef5e1ec2de558491808ded2743 100644 (file)
@@ -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);
 
index 1190b93ffaee03acf7cf9f653232f8996027f651..6c78f93ce61831a0b9cd28b20d0794945330ddae 100755 (executable)
@@ -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