diff options
author | Russ Cox <rsc@golang.org> | 2013-07-16 16:24:43 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2013-07-16 16:24:43 -0400 |
commit | d509fcb571316971fe8cf1ade6f12744b8dec8b4 (patch) | |
tree | 1c7d5623daa1e1ef382a936df2720a921276028e /src/cmd/5c | |
parent | c71f0e458019672a66932e70d20d2604cfaa23f5 (diff) | |
download | go-d509fcb571316971fe8cf1ade6f12744b8dec8b4.tar.gz |
cmd/5c, cmd/6c, cmd/8c: record arg size for every call
R=ken2
CC=golang-dev
https://codereview.appspot.com/11364043
Diffstat (limited to 'src/cmd/5c')
-rw-r--r-- | src/cmd/5c/cgen.c | 4 | ||||
-rw-r--r-- | src/cmd/5c/gc.h | 1 | ||||
-rw-r--r-- | src/cmd/5c/sgen.c | 7 | ||||
-rw-r--r-- | src/cmd/5c/txt.c | 9 |
4 files changed, 19 insertions, 2 deletions
diff --git a/src/cmd/5c/cgen.c b/src/cmd/5c/cgen.c index 5ff4f633d..08ed36055 100644 --- a/src/cmd/5c/cgen.c +++ b/src/cmd/5c/cgen.c @@ -28,8 +28,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. - #include "gc.h" +#include "../../pkg/runtime/funcdata.h" void _cgen(Node *n, Node *nn, int inrel) @@ -366,12 +366,14 @@ _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]--; diff --git a/src/cmd/5c/gc.h b/src/cmd/5c/gc.h index a0fc63c60..084da7e6a 100644 --- a/src/cmd/5c/gc.h +++ b/src/cmd/5c/gc.h @@ -298,6 +298,7 @@ int sconst(Node*); int sval(int32); void gpseudo(int, Sym*, Node*); void gprefetch(Node*); +void gpcdata(int, int); /* * swt.c diff --git a/src/cmd/5c/sgen.c b/src/cmd/5c/sgen.c index 92a0f64f8..948791dbb 100644 --- a/src/cmd/5c/sgen.c +++ b/src/cmd/5c/sgen.c @@ -37,8 +37,13 @@ gtext(Sym *s, int32 stkoff) int32 a; a = 0; - if(!(textflag & NOSPLIT)) + if(!(textflag & NOSPLIT) || !hasdotdotdot()) { a = argsize(); + // Change argsize 0 to 1 to be mark that + // the argument size is present. + if(a == 0) + a = 1; + } else if(stkoff >= 128) yyerror("stack frame too large for NOSPLIT function"); diff --git a/src/cmd/5c/txt.c b/src/cmd/5c/txt.c index 8dfd586fd..81da9fb80 100644 --- a/src/cmd/5c/txt.c +++ b/src/cmd/5c/txt.c @@ -1198,6 +1198,15 @@ gpseudo(int a, Sym *s, Node *n) } void +gpcdata(int index, int value) +{ + Node n1; + + n1 = *nodconst(index); + gins(APCDATA, &n1, nodconst(value)); +} + +void gprefetch(Node *n) { Node n1; |