diff options
Diffstat (limited to 'src/cmd/5l/span.c')
-rw-r--r-- | src/cmd/5l/span.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/cmd/5l/span.c b/src/cmd/5l/span.c index a5afa02e7..e7cc0b4b1 100644 --- a/src/cmd/5l/span.c +++ b/src/cmd/5l/span.c @@ -90,7 +90,7 @@ span(void) int32 c, otxt, out[6]; Section *sect; uchar *bp; - Sym *sub; + Sym *sub, *gmsym; if(debug['v']) Bprint(&bso, "%5.2f span\n", cputime()); @@ -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) @@ -237,6 +237,9 @@ span(void) * code references to be relocated too, and then * perhaps we'd be able to parallelize the span loop above. */ + gmsym = S; + if(linkmode == LinkExternal) + gmsym = lookup("runtime.tlsgm", 0); for(cursym = textp; cursym != nil; cursym = cursym->next) { p = cursym->text; if(p == P || p->link == P) @@ -249,7 +252,7 @@ span(void) pc = p->pc; curp = p; o = oplook(p); - asmout(p, o, out); + asmout(p, o, out, gmsym); for(i=0; i<o->size/4; i++) { v = out[i]; *bp++ = v; @@ -574,10 +577,7 @@ aclass(Adr *a) if(s == S) break; instoffset = 0; // s.b. unused but just in case - if(flag_shared) - return C_LCONADDR; - else - return C_LCON; + return C_LCONADDR; case D_AUTO: instoffset = autosize + a->offset; @@ -813,8 +813,10 @@ buildop(void) break; case AMOVW: case AMOVB: + case AMOVBS: case AMOVBU: case AMOVH: + case AMOVHS: case AMOVHU: break; case ASWPW: @@ -830,7 +832,6 @@ buildop(void) case ARFE: case ATEXT: case AUSEFIELD: - case ALOCALS: case ACASE: case ABCASE: case ATYPE: @@ -890,6 +891,8 @@ buildop(void) case APLD: case AUNDEF: case ACLZ: + case AFUNCDATA: + case APCDATA: break; } } |