aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/5l
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-07-16 16:23:11 -0400
committerRuss Cox <rsc@golang.org>2013-07-16 16:23:11 -0400
commit567818224edce362fa040ee89e9597982f2bcdf6 (patch)
tree77605ec3fd6e6b2e54343aae26f72e63446616a9 /src/cmd/5l
parent8fb6c3ac25f077f5207215dc4868014a29e61759 (diff)
downloadgo-567818224edce362fa040ee89e9597982f2bcdf6.tar.xz
cmd/5l, cmd/6l, cmd/8l: accept PCDATA instruction in input
The portable code in cmd/ld already knows how to process it, we just have to ignore it during code generation. R=ken2 CC=golang-dev https://golang.org/cl/11363043
Diffstat (limited to 'src/cmd/5l')
-rw-r--r--src/cmd/5l/noop.c8
-rw-r--r--src/cmd/5l/optab.c2
-rw-r--r--src/cmd/5l/span.c6
3 files changed, 13 insertions, 3 deletions
diff --git a/src/cmd/5l/noop.c b/src/cmd/5l/noop.c
index 88bff318d1..e8d09160e6 100644
--- a/src/cmd/5l/noop.c
+++ b/src/cmd/5l/noop.c
@@ -58,6 +58,7 @@ noops(void)
{
Prog *p, *q, *q1, *q2;
int o;
+ int32 arg;
Prog *pmorestack;
Sym *symmorestack;
@@ -272,7 +273,12 @@ noops(void)
p->as = AMOVW;
p->scond = C_SCOND_LS;
p->from.type = D_CONST;
- p->from.offset = (cursym->text->to.offset2 + 3) & ~3;
+ arg = cursym->text->to.offset2;
+ if(arg == 1) // special marker for known 0
+ arg = 0;
+ if(arg&3)
+ diag("misaligned argument size in stack split");
+ p->from.offset = arg;
p->to.type = D_REG;
p->to.reg = 2;
diff --git a/src/cmd/5l/optab.c b/src/cmd/5l/optab.c
index 46982ad727..91cadbdf45 100644
--- a/src/cmd/5l/optab.c
+++ b/src/cmd/5l/optab.c
@@ -246,6 +246,8 @@ Optab optab[] =
{ AMULAWT, C_REG, C_REG, C_REGREG2, 99, 4, 0 },
{ AUSEFIELD, C_ADDR, C_NONE, C_NONE, 0, 0, 0 },
+ { APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0 },
+ { AFUNCDATA, C_LCON, C_NONE, C_ADDR, 0, 0, 0 },
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
diff --git a/src/cmd/5l/span.c b/src/cmd/5l/span.c
index a5afa02e79..96138b2663 100644
--- a/src/cmd/5l/span.c
+++ b/src/cmd/5l/span.c
@@ -141,7 +141,7 @@ span(void)
if(checkpool(op, p->as == ACASE ? casesz(p) : m))
c = p->pc = scan(op, p, c);
}
- if(m == 0) {
+ if(m == 0 && (p->as != AFUNCDATA && p->as != APCDATA)) {
diag("zero-width instruction\n%P", p);
continue;
}
@@ -211,7 +211,7 @@ span(void)
}
*/
m = o->size;
- if(m == 0) {
+ if(m == 0 && (p->as != AFUNCDATA && p->as != APCDATA)) {
if(p->as == ATEXT) {
autosize = p->to.offset + 4;
if(p->from.sym != S)
@@ -890,6 +890,8 @@ buildop(void)
case APLD:
case AUNDEF:
case ACLZ:
+ case AFUNCDATA:
+ case APCDATA:
break;
}
}