diff options
| author | Russ Cox <rsc@golang.org> | 2013-07-16 16:23:11 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-07-16 16:23:11 -0400 |
| commit | 567818224edce362fa040ee89e9597982f2bcdf6 (patch) | |
| tree | 77605ec3fd6e6b2e54343aae26f72e63446616a9 /src/cmd/5l | |
| parent | 8fb6c3ac25f077f5207215dc4868014a29e61759 (diff) | |
| download | go-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.c | 8 | ||||
| -rw-r--r-- | src/cmd/5l/optab.c | 2 | ||||
| -rw-r--r-- | src/cmd/5l/span.c | 6 |
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; } } |
