summaryrefslogtreecommitdiff
path: root/arm64
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin@c9x.me>2022-11-22 21:44:44 +0100
committerQuentin Carbonneaux <quentin@c9x.me>2022-11-22 21:56:21 +0100
commitcbee74bdb4f85d6d8d4f192f0018ea023418e216 (patch)
tree4ea3eb41265e44336d81fecf719193c67540f3d3 /arm64
parent04e26409011389f7b5759114905195a4fb0b0286 (diff)
downloadroux-cbee74bdb4f85d6d8d4f192f0018ea023418e216.tar.gz
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.
Diffstat (limited to 'arm64')
-rw-r--r--arm64/emit.c14
-rw-r--r--arm64/isel.c4
2 files changed, 10 insertions, 8 deletions
diff --git a/arm64/emit.c b/arm64/emit.c
index 292dc79..38b7e1a 100644
--- a/arm64/emit.c
+++ b/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;
diff --git a/arm64/isel.c b/arm64/isel.c
index 31ef242..9b062d8 100644
--- a/arm64/isel.c
+++ b/arm64/isel.c
@@ -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);