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:
parent
04e2640901
commit
cbee74bdb4
12 changed files with 68 additions and 58 deletions
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue