summaryrefslogtreecommitdiff
path: root/src/cmd/5l/span.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/5l/span.c')
-rw-r--r--src/cmd/5l/span.c21
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;
}
}