use a new struct for symbols

Symbols are a useful abstraction
that occurs in both Con and Alias.
In this patch they get their own
struct. This new struct packages
a symbol name and a type; the type
tells us where the symbol name
must be interpreted (currently, in
gobal memory or in thread-local
storage).

The refactor fixed a bug in
addcon(), proving the value of
packaging symbol names with their
type.
This commit is contained in:
Quentin Carbonneaux 2022-11-22 21:44:44 +01:00
parent 04e2640901
commit cbee74bdb4
12 changed files with 68 additions and 58 deletions

View file

@ -165,9 +165,9 @@ emitcon(Con *con, FILE *f)
switch (con->type) {
case CAddr:
l = str(con->label);
l = str(con->sym.id);
p = l[0] == '"' ? "" : T.assym;
if (con->reloc == RelThr) {
if (con->sym.type == SThr) {
if (T.apple)
fprintf(f, "%s%s@TLVP", p, l);
else
@ -344,7 +344,7 @@ Next:
off = fn->con[ref.val];
emitcon(&off, f);
if (off.type == CAddr)
if (off.reloc != RelThr || T.apple)
if (off.sym.type != SThr || T.apple)
fprintf(f, "(%%rip)");
break;
case RTmp:

View file

@ -81,7 +81,7 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn)
a.offset.type = CAddr;
n = stashbits(&fn->con[r0.val].bits, KWIDE(k) ? 8 : 4);
sprintf(buf, "\"%sfp%d\"", T.asloc, n);
a.offset.label = intern(buf);
a.offset.sym.id = intern(buf);
fn->mem[fn->nmem-1] = a;
}
else if (op != Ocopy && k == Kl && noimm(r0, fn)) {
@ -124,7 +124,7 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn)
}
} else if (T.apple && rtype(r0) == RCon
&& (c = &fn->con[r0.val])->type == CAddr
&& c->reloc == RelThr) {
&& c->sym.type == SThr) {
r1 = newtmp("isel", Kl, fn);
if (c->bits.i) {
r2 = newtmp("isel", Kl, fn);
@ -612,7 +612,8 @@ amatch(Addr *a, Ref r, int n, ANum *ai, Fn *fn)
if (rtype(r) == RCon) {
if (!addcon(&a->offset, &fn->con[r.val]))
err("unlikely sum of $%s and $%s",
str(a->offset.label), str(fn->con[r.val].label));
str(a->offset.sym.id),
str(fn->con[r.val].sym.id));
return 1;
}
assert(rtype(r) == RTmp);