more fixes

This commit is contained in:
Quentin Carbonneaux 2026-04-29 10:15:11 +02:00
parent 6abea36b9b
commit 63bb04f759
4 changed files with 27 additions and 37 deletions

13
all.h
View File

@ -292,16 +292,11 @@ struct Use {
}; };
struct Sym { struct Sym {
/* SGlo = 0 (direct access)
* SThr = 1 (local-exec TLS)
* SExt = 2 (GOT/PLT access)
* SExt|SThr = 3 (initial-exec TLS)
*/
enum { enum {
SGlo = 0, SGlo = 0, /* direct access */
SThr = 1, SThr = 1, /* local-exec TLS */
SExt = 2, SExt = 2, /* GOT/PLT access */
SExtThr = SExt|SThr, SExtThr = SExt|SThr, /* initial-exec TLS */
} type; } type;
uint32_t id; uint32_t id;
}; };

View File

@ -534,12 +534,12 @@ emitins(Ins i, E *e)
case Oaddr: case Oaddr:
if (rtype(i.arg[0]) != RCon) if (rtype(i.arg[0]) != RCon)
goto Table; goto Table;
assert(isreg(i.to));
con = &e->fn->con[i.arg[0].val]; con = &e->fn->con[i.arg[0].val];
assert(isreg(i.to) && con->type == CAddr);
sym = str(con->sym.id); sym = str(con->sym.id);
if (T.apple && (con->sym.type & SThr)) { if (T.apple && (con->sym.type & SThr)) {
fprintf(e->f, fprintf(e->f,
"\tmovq %s%s@TLVP(%%rip), %%%s\n", "\tmovq %s%s@tlvp(%%rip), %%%s\n",
sym[0] == '"' ? "" : T.assym, sym, sym[0] == '"' ? "" : T.assym, sym,
regtoa(i.to.val, SLong)); regtoa(i.to.val, SLong));
break; break;

29
parse.c
View File

@ -429,11 +429,10 @@ static Ref
parseref() parseref()
{ {
Con c; Con c;
int tok;
memset(&c, 0, sizeof c); memset(&c, 0, sizeof c);
switch (next()) { switch ((tok = next())) {
default:
return R;
case Ttmp: case Ttmp:
return tmpref(tokval.str); return tmpref(tokval.str);
case Tint: case Tint:
@ -450,20 +449,22 @@ parseref()
c.bits.d = tokval.fltd; c.bits.d = tokval.fltd;
c.flt = 2; c.flt = 2;
break; break;
case Textern: default:
c.sym.type = SExt; for (;; tok=next()) {
if (peek() == Tthread) { switch (tok) {
next(); case Textern:
c.sym.type |= SThr; c.sym.type |= SExt;
continue;
case Tthread:
c.sym.type |= SThr;
continue;
}
break;
} }
expect(Tglo); if (tok != Tglo)
goto Glo; return R;
case Tthread:
c.sym.type = SThr;
expect(Tglo);
/* fall through */ /* fall through */
case Tglo: case Tglo:
Glo:
c.type = CAddr; c.type = CAddr;
c.sym.id = intern(tokval.str); c.sym.id = intern(tokval.str);
break; break;

View File

@ -131,7 +131,7 @@ slot(Ref r, Fn *fn)
static void static void
emitaddr(Con *c, FILE *f) emitaddr(Con *c, FILE *f)
{ {
assert(c->sym.type == SGlo || c->sym.type == SExt); assert((c->sym.type & ~SExt) == SGlo);
fputs(str(c->sym.id), f); fputs(str(c->sym.id), f);
if (c->bits.i) if (c->bits.i)
fprintf(f, "+%"PRIi64, c->bits.i); fprintf(f, "+%"PRIi64, c->bits.i);
@ -232,6 +232,11 @@ loadaddr(Con *c, char *rn, FILE *f)
char off[32]; char off[32];
switch (c->sym.type) { switch (c->sym.type) {
default:
fprintf(f, "\tla %s, ", rn);
emitaddr(c, f);
fputc('\n', f);
break;
case SThr: case SThr:
if (c->bits.i) if (c->bits.i)
sprintf(off, "+%"PRIi64, c->bits.i); sprintf(off, "+%"PRIi64, c->bits.i);
@ -244,19 +249,8 @@ loadaddr(Con *c, char *rn, FILE *f)
fprintf(f, "\taddi %s, %s, %%tprel_lo(%s)%s\n", fprintf(f, "\taddi %s, %s, %%tprel_lo(%s)%s\n",
rn, rn, str(c->sym.id), off); rn, rn, str(c->sym.id), off);
break; break;
case SExt:
fprintf(f, "\tla %s, ", rn);
emitaddr(c, f);
fputc('\n', f);
break;
case SExtThr: case SExtThr:
die("extern thread unavailable on rv64"); die("extern thread unavailable on rv64");
break;
default:
fprintf(f, "\tla %s, ", rn);
emitaddr(c, f);
fputc('\n', f);
break;
} }
} }