intern symbol names

Symbols in the source file are still limited in
length because the rest of the code assumes that
strings always fit in NString bytes.

Regardless, there is already a benefit because
comparing/copying symbol names does not require
using strcmp()/strcpy() anymore.
This commit is contained in:
Quentin Carbonneaux 2017-05-17 09:40:07 -04:00
parent 2d02070af0
commit a3a1451c5f
10 changed files with 143 additions and 87 deletions

View file

@ -161,12 +161,12 @@ slot(int s, Fn *fn)
static void
emitcon(Con *con, FILE *f)
{
char *p;
switch (con->type) {
case CAddr:
if (con->local)
fprintf(f, "%s%s", gasloc, con->label);
else
fprintf(f, "%s%s", gassym, con->label);
p = con->local ? gasloc : gassym;
fprintf(f, "%s%s", p, str(con->label));
if (con->bits.i)
fprintf(f, "%+"PRId64, con->bits.i);
break;

View file

@ -61,6 +61,7 @@ rslot(Ref r, Fn *fn)
static void
fixarg(Ref *r, int k, int op, Fn *fn)
{
char buf[32];
Addr a, *m;
Ref r0, r1;
int s, n, cpy, mem;
@ -80,7 +81,8 @@ fixarg(Ref *r, int k, int op, Fn *fn)
a.offset.type = CAddr;
a.offset.local = 1;
n = gasstashfp(fn->con[r0.val].bits.i, KWIDE(k));
sprintf(a.offset.label, "fp%d", n);
sprintf(buf, "fp%d", n);
a.offset.label = intern(buf);
fn->mem[fn->nmem-1] = a;
}
else if (!cpy && k == Kl && noimm(r0, fn)) {