aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir/ir.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-15 22:39:52 +0100
committerlemon <lsof@mailbox.org>2025-12-15 22:39:52 +0100
commit302e24671942051d70707586cf8c605a5815edac (patch)
tree51e25fb6cd7e828c82ce5f17ffc775117121acee /ir/ir.c
parentc6c0f2ef35175075e91169113cfe856f29b3eb9a (diff)
create distinct interned string type
Interned strings are used pervasively, so it's a good idea to add a layer of type safety to differentiate them from general cstrs and avoid potential bugs from comparing non-interned and interned strings. Not that that's happened so far that I can remember, but it could. I'm 90% sure it's legal to alias `struct {char c;}` pointers with `char` pointers. This specific typedef gives type safety but with a simple one-way `internstr -> const char *` typecast (with `&istr->c`). Converting the other way around is more intentional: a straight up cast `(internstr)cstr` which sticks out as unchecked and probably wrong, or calling the intern(cstr) function, which is the right way.
Diffstat (limited to 'ir/ir.c')
-rw-r--r--ir/ir.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/ir/ir.c b/ir/ir.c
index d932121..883e728 100644
--- a/ir/ir.c
+++ b/ir/ir.c
@@ -138,14 +138,14 @@ mkfltcon(enum irclass k, double f)
}
union ref
-mksymref(const char *s, bool isfunc)
+mksymref(internstr s, bool isfunc)
{
struct xcon con = { .issym = 1, .sym = s, .isfunc = isfunc };
return mkref(RXCON, addcon(&con));
}
union ref
-mkdatref(const char *name, union type ctype, uint siz, uint align, const void *bytes, uint n, bool deref)
+mkdatref(internstr name, union type ctype, uint siz, uint align, const void *bytes, uint n, bool deref)
{
struct irdat dat = { .ctype = ctype, .align = align, .siz = siz, .name = name };
dat.section = objout.code && align >= 4 && align <= targ_primsizes[TYPTR] && siz <= 16 ? Stext : Srodata;
@@ -168,7 +168,7 @@ mkdatref(const char *name, union type ctype, uint siz, uint align, const void *b
return mkref(RXCON, addcon(&(struct xcon){.isdat = 1, .deref = deref, .dat = dattab.n - 1}));
}
-const char *
+internstr
xcon2sym(int ref)
{
struct xcon con = conht[ref];