]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cc, cmd/gc: stop generating 'argsize' PCDATA
authorRuss Cox <rsc@golang.org>
Fri, 12 Sep 2014 11:51:00 +0000 (07:51 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 12 Sep 2014 11:51:00 +0000 (07:51 -0400)
The argsize PCDATA was specifying the number of
bytes passed to a function call, so that if the function
did not specify its argument count, the garbage collector
could use the call site information to scan those bytes
conservatively. We don't do that anymore, so stop
generating the information.

LGTM=khr
R=khr
CC=golang-codereviews
https://golang.org/cl/139530043

13 files changed:
src/cmd/5c/cgen.c
src/cmd/5g/gg.h
src/cmd/5g/ggen.c
src/cmd/5g/gsubr.c
src/cmd/6c/cgen.c
src/cmd/6g/gg.h
src/cmd/6g/ggen.c
src/cmd/6g/gsubr.c
src/cmd/8c/cgen.c
src/cmd/8g/gg.h
src/cmd/8g/ggen.c
src/cmd/8g/gsubr.c
src/runtime/funcdata.h

index 9be10bf452a1941a98d002a15a4540e4e6d81489..5a049ae628be3bb7a774144cd30b007ba976b0d6 100644 (file)
@@ -366,14 +366,12 @@ _cgen(Node *n, Node *nn, int inrel)
                if(REGARG >= 0)
                        o = reg[REGARG];
                gargs(r, &nod, &nod1);
-               gpcdata(PCDATA_ArgSize, curarg);
                if(l->addable < INDEXED) {
                        reglcgen(&nod, l, Z);
                        gopcode(OFUNC, Z, Z, &nod);
                        regfree(&nod);
                } else
                        gopcode(OFUNC, Z, Z, l);
-               gpcdata(PCDATA_ArgSize, -1);
                if(REGARG >= 0)
                        if(o != reg[REGARG])
                                reg[REGARG]--;
index 62f73c8659fdf43f05d036a4fe5ab3b8048ad5c8..00914bfa34cafb5d3c317edb542a4e01c2356d41 100644 (file)
@@ -109,7 +109,6 @@ void        split64(Node*, Node*, Node*);
 void   splitclean(void);
 Node*  ncon(uint32 i);
 void   gtrack(Sym*);
-void   gargsize(int32);
 
 /*
  * obj.c
index 6174e760c48d37f6b6ac684ac0b81817c57dafe5..53cddb760550f3b23d9712d57692e104bd479c97 100644 (file)
@@ -179,28 +179,12 @@ fixautoused(Prog* p)
 void
 ginscall(Node *f, int proc)
 {
-       int32 arg;
        Prog *p;
        Node n1, r, r1, con;
 
        if(f->type != T)
                setmaxarg(f->type);
 
-       arg = -1;
-       // Most functions have a fixed-size argument block, so traceback uses that during unwind.
-       // Not all, though: there are some variadic functions in package runtime,
-       // and for those we emit call-specific metadata recorded by caller.
-       // Reflect generates functions with variable argsize (see reflect.methodValueCall/makeFuncStub),
-       // so we do this for all indirect calls as well.
-       if(f->type != T && (f->sym == S || (f->sym != S && f->sym->pkg == runtimepkg) || proc == 1 || proc == 2)) {
-               arg = f->type->argwid;
-               if(proc == 1 || proc == 2)
-                       arg += 3*widthptr;
-       }
-
-       if(arg != -1)
-               gargsize(arg);
-
        switch(proc) {
        default:
                fatal("ginscall: bad proc %d", proc);
@@ -297,9 +281,6 @@ ginscall(Node *f, int proc)
                }
                break;
        }
-       
-       if(arg != -1)
-               gargsize(-1);
 }
 
 /*
index ebd2c70a0547855f6c6a056adc0b6b95fbc45d47..93bfafef66fcde4560251eafb3c41f2240fd5157 100644 (file)
@@ -205,16 +205,6 @@ ggloblnod(Node *nam)
                p->reg |= NOPTR;
 }
 
-void
-gargsize(int32 size)
-{
-       Node n1, n2;
-       
-       nodconst(&n1, types[TINT32], PCDATA_ArgSize);
-       nodconst(&n2, types[TINT32], size);
-       gins(APCDATA, &n1, &n2);
-}
-
 void
 ggloblsym(Sym *s, int32 width, int8 flags)
 {
index bb09ec05d3aa64cc36842b69831c67776c783b80..68dd7bb5fab89a4c3e75ee6b8a0651f45c9318d5 100644 (file)
@@ -945,7 +945,6 @@ cgen(Node *n, Node *nn)
                        return;
                }
                gargs(r, &nod, &nod1);
-               gpcdata(PCDATA_ArgSize, curarg);
                if(l->addable < INDEXED) {
                        reglcgen(&nod, l, nn);
                        nod.op = OREGISTER;
@@ -953,12 +952,9 @@ cgen(Node *n, Node *nn)
                        regfree(&nod);
                } else
                        gopcode(OFUNC, n->type, Z, l);
-               gpcdata(PCDATA_ArgSize, -1);
                if(REGARG >= 0 && reg[REGARG])
                        reg[REGARG]--;
                regret(&nod, n, l->type, 1); // update maxarg if nothing else
-               gpcdata(PCDATA_ArgSize, curarg);
-               gpcdata(PCDATA_ArgSize, -1);
                if(nn != Z)
                        gmove(&nod, nn);
                if(nod.op == OREGISTER)
index 27f6c01fee7210f75028c93fb1f5835871fa444a..fe69d5c968d0cd27d951ee0ca31e1a41b9ed305e 100644 (file)
@@ -99,7 +99,6 @@ int   sudoaddable(int, Node*, Addr*);
 void   afunclit(Addr*, Node*);
 void   nodfconst(Node*, Type*, Mpflt*);
 void   gtrack(Sym*);
-void   gargsize(vlong);
 void   fixlargeoffset(Node *n);
 
 /*
index 5a9b8418c4c09e4b516f56417a18826bfc8467d3..987473ccab60908acd7d4cbea6fe74c8bbd79c90 100644 (file)
@@ -175,7 +175,6 @@ fixautoused(Prog *p)
 void
 ginscall(Node *f, int proc)
 {
-       int32 arg;
        Prog *p;
        Node reg, con;
        Node r1;
@@ -183,21 +182,6 @@ ginscall(Node *f, int proc)
        if(f->type != T)
                setmaxarg(f->type);
 
-       arg = -1;
-       // Most functions have a fixed-size argument block, so traceback uses that during unwind.
-       // Not all, though: there are some variadic functions in package runtime,
-       // and for those we emit call-specific metadata recorded by caller.
-       // Reflect generates functions with variable argsize (see reflect.methodValueCall/makeFuncStub),
-       // so we do this for all indirect calls as well.
-       if(f->type != T && (f->sym == S || (f->sym != S && f->sym->pkg == runtimepkg) || proc == 1 || proc == 2)) {
-               arg = f->type->argwid;
-               if(proc == 1 || proc == 2)
-                       arg += 2*widthptr;
-       }
-
-       if(arg != -1)
-               gargsize(arg);
-
        switch(proc) {
        default:
                fatal("ginscall: bad proc %d", proc);
@@ -275,9 +259,6 @@ ginscall(Node *f, int proc)
                }
                break;
        }
-
-       if(arg != -1)
-               gargsize(-1);
 }
 
 /*
index e1ed3b3b86fafcf262dd9458fa804dd93fce677b..5bd9246607f6b70cfabd6393d6d76679a503c042 100644 (file)
@@ -214,16 +214,6 @@ gtrack(Sym *s)
        p->from.sym = linksym(s);
 }
 
-void
-gargsize(vlong size)
-{
-       Node n1, n2;
-       
-       nodconst(&n1, types[TINT32], PCDATA_ArgSize);
-       nodconst(&n2, types[TINT32], size);
-       gins(APCDATA, &n1, &n2);
-}
-
 void
 ggloblsym(Sym *s, int32 width, int8 flags)
 {
index 6f0f7c97febef2cce4624c2e5ba9319e3a5285b7..87e8fdad8b2397ff03d15c8b0ec14b1f74928669 100644 (file)
@@ -938,7 +938,6 @@ cgen(Node *n, Node *nn)
                        return;
                }
                gargs(r, &nod, &nod1);
-               gpcdata(PCDATA_ArgSize, curarg);
                if(l->addable < INDEXED) {
                        reglcgen(&nod, l, nn);
                        nod.op = OREGISTER;
@@ -946,7 +945,6 @@ cgen(Node *n, Node *nn)
                        regfree(&nod);
                } else
                        gopcode(OFUNC, n->type, Z, l);
-               gpcdata(PCDATA_ArgSize, -1);
                if(REGARG >= 0 && reg[REGARG])
                        reg[REGARG]--;
                regret(&nod, n, l->type, 1); // update maxarg if nothing else
index bdefa93b5b65ffe3d578e9a87f2485d08f739f41..238f9276567d85c3f3c93c51a1acbb798b163dcd 100644 (file)
@@ -114,7 +114,6 @@ void        split64(Node*, Node*, Node*);
 void   splitclean(void);
 void   nswap(Node*, Node*);
 void   gtrack(Sym*);
-void   gargsize(int32);
 /*
  * cplx.c
  */
index 6038731f7b2152108a686a0338fdd7f797b7bca9..a095be36e969da3daced3480e6399ec7ff3ed659 100644 (file)
@@ -217,21 +217,6 @@ ginscall(Node *f, int proc)
        if(f->type != T)
                setmaxarg(f->type);
 
-       arg = -1;
-       // Most functions have a fixed-size argument block, so traceback uses that during unwind.
-       // Not all, though: there are some variadic functions in package runtime,
-       // and for those we emit call-specific metadata recorded by caller.
-       // Reflect generates functions with variable argsize (see reflect.methodValueCall/makeFuncStub),
-       // so we do this for all indirect calls as well.
-       if(f->type != T && (f->sym == S || (f->sym != S && f->sym->pkg == runtimepkg) || proc == 1 || proc == 2)) {
-               arg = f->type->argwid;
-               if(proc == 1 || proc == 2)
-                       arg += 2*widthptr;
-       }
-
-       if(arg != -1)
-               gargsize(arg);
-
        switch(proc) {
        default:
                fatal("ginscall: bad proc %d", proc);
@@ -293,9 +278,6 @@ ginscall(Node *f, int proc)
                }
                break;
        }
-       
-       if(arg != -1)
-               gargsize(-1);
 }
 
 /*
index 9f923cc9aa5eedcf4f254c502e8a34f72d14668a..a83d048f40c1ae48b8d7cdfe74dde7002acc1187 100644 (file)
@@ -205,16 +205,6 @@ ggloblnod(Node *nam)
                p->from.scale |= NOPTR;
 }
 
-void
-gargsize(int32 size)
-{
-       Node n1, n2;
-       
-       nodconst(&n1, types[TINT32], PCDATA_ArgSize);
-       nodconst(&n2, types[TINT32], size);
-       gins(APCDATA, &n1, &n2);
-}
-
 void
 ggloblsym(Sym *s, int32 width, int8 flags)
 {
index 5ddc877c2b40ac6ecd1682d9067e0b7b194ce5dc..a2667a4c027e803ba47d1945d0b278cc2ab6132c 100644 (file)
@@ -9,18 +9,12 @@
 //
 // symtab.go also contains a copy of these constants.
 
-// TODO(rsc): Remove PCDATA_ArgSize, renumber StackMapIndex to 0.
-#define PCDATA_ArgSize 0 /* argument size at CALL instruction */
-#define PCDATA_StackMapIndex 1
+#define PCDATA_StackMapIndex 0
 
 #define FUNCDATA_ArgsPointerMaps 0 /* garbage collector blocks */
 #define FUNCDATA_LocalsPointerMaps 1
 #define FUNCDATA_DeadValueMaps 2
 
-// TODO(rsc): Remove ARGSIZE.
-// To be used in assembly.
-#define ARGSIZE(n) PCDATA $PCDATA_ArgSize, $n
-
 // Pseudo-assembly statements.
 
 // GO_ARGS, GO_RESULTS_INITIALIZED, and NO_LOCAL_POINTERS are macros