summaryrefslogtreecommitdiff
path: root/src/cmd/5c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-07-16 16:24:43 -0400
committerRuss Cox <rsc@golang.org>2013-07-16 16:24:43 -0400
commitd509fcb571316971fe8cf1ade6f12744b8dec8b4 (patch)
tree1c7d5623daa1e1ef382a936df2720a921276028e /src/cmd/5c
parentc71f0e458019672a66932e70d20d2604cfaa23f5 (diff)
downloadgo-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.c4
-rw-r--r--src/cmd/5c/gc.h1
-rw-r--r--src/cmd/5c/sgen.c7
-rw-r--r--src/cmd/5c/txt.c9
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;