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
14
arm64/emit.c
14
arm64/emit.c
|
@ -247,10 +247,10 @@ loadaddr(Con *c, char *rn, E *e)
|
|||
{
|
||||
char *p, *l, *s;
|
||||
|
||||
switch (c->reloc) {
|
||||
switch (c->sym.type) {
|
||||
default:
|
||||
die("unreachable");
|
||||
case RelDef:
|
||||
case SGlo:
|
||||
if (T.apple)
|
||||
s = "\tadrp\tR, S@pageO\n"
|
||||
"\tadd\tR, R, S@pageoffO\n";
|
||||
|
@ -258,7 +258,7 @@ loadaddr(Con *c, char *rn, E *e)
|
|||
s = "\tadrp\tR, SO\n"
|
||||
"\tadd\tR, R, #:lo12:SO\n";
|
||||
break;
|
||||
case RelThr:
|
||||
case SThr:
|
||||
if (T.apple)
|
||||
s = "\tadrp\tR, S@tlvppage\n"
|
||||
"\tldr\tR, [R, S@tlvppageoff]\n";
|
||||
|
@ -269,7 +269,7 @@ loadaddr(Con *c, char *rn, E *e)
|
|||
break;
|
||||
}
|
||||
|
||||
l = str(c->label);
|
||||
l = str(c->sym.id);
|
||||
p = l[0] == '"' ? "" : T.assym;
|
||||
for (; *s; s++)
|
||||
switch (*s) {
|
||||
|
@ -431,9 +431,11 @@ emitins(Ins *i, E *e)
|
|||
if (rtype(i->arg[0]) != RCon)
|
||||
goto Table;
|
||||
c = &e->fn->con[i->arg[0].val];
|
||||
if (c->type != CAddr || c->bits.i)
|
||||
if (c->type != CAddr
|
||||
|| c->sym.type != SGlo
|
||||
|| c->bits.i)
|
||||
die("invalid call argument");
|
||||
l = str(c->label);
|
||||
l = str(c->sym.id);
|
||||
p = l[0] == '"' ? "" : T.assym;
|
||||
fprintf(e->f, "\tbl\t%s%s\n", p, l);
|
||||
break;
|
||||
|
|
|
@ -80,7 +80,7 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
|
|||
c = &fn->con[r0.val];
|
||||
if (T.apple
|
||||
&& c->type == CAddr
|
||||
&& c->reloc == RelThr) {
|
||||
&& c->sym.type == SThr) {
|
||||
r1 = newtmp("isel", Kl, fn);
|
||||
*pr = r1;
|
||||
if (c->bits.i) {
|
||||
|
@ -114,7 +114,7 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
|
|||
c = &fn->con[fn->ncon-1];
|
||||
sprintf(buf, "\"%sfp%d\"", T.asloc, n);
|
||||
*c = (Con){.type = CAddr};
|
||||
c->label = intern(buf);
|
||||
c->sym.id = intern(buf);
|
||||
r2 = newtmp("isel", Kl, fn);
|
||||
emit(Oload, k, r1, r2, R);
|
||||
emit(Ocopy, Kl, r2, CON(c-fn->con), R);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue