aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-03-14 17:27:37 +0100
committerlemon <lsof@mailbox.org>2026-03-14 17:46:54 +0100
commit42ce457bba06bd3607fc04700a919b6c395f22c3 (patch)
tree77a3f2230324248055a69a41d12b18471d56fe4f /ir
parent1f3ebe69478f245f69cd6f77db946226557085d2 (diff)
c: static eval refactoring
Explicit node for static symbol (addresses). Should not break with edge cases like the previous ad-hoc approach. And some other bugfixes
Diffstat (limited to 'ir')
-rw-r--r--ir/ir.c8
-rw-r--r--ir/ir.h3
2 files changed, 7 insertions, 4 deletions
diff --git a/ir/ir.c b/ir/ir.c
index bb75d4b..626311e 100644
--- a/ir/ir.c
+++ b/ir/ir.c
@@ -159,10 +159,12 @@ mksymref(internstr s, enum symflags symflags)
}
union ref
-mkdatref(internstr 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, bool funclocal)
{
- 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;
+ struct irdat dat = { .ctype = ctype, .align = align, .siz = siz, .name = name, .section = Srodata };
+ if (funclocal && objout.code && align >= 4 && align <= targ_primsizes[TYPTR] && siz <= 16)
+ dat.section = Stext;
assert(n <= siz && siz && align);
if (!name) {
diff --git a/ir/ir.h b/ir/ir.h
index 39fa116..a4da8ad 100644
--- a/ir/ir.h
+++ b/ir/ir.h
@@ -265,7 +265,8 @@ union ref mkfltcon(enum irclass, double);
#define intconval(r) ((r).t == RICON ? (r).i : contab.p[(r).i].i)
#define fltconval(r) ((r).t == RICON ? (r).i : contab.p[(r).i].f)
union ref mksymref(internstr, enum symflags);
-union ref mkdatref(internstr name, union type ctype, uint siz, uint align, const void *, uint n, bool deref);
+union ref mkdatref(internstr sym, union type ctype, uint siz, uint align,
+ const void *, uint n, bool deref, bool funclocal);
internstr xcon2sym(int ref);
struct instr mkalloca(uint siz, uint align);
union ref mkcallarg(union irtype ret, uint narg, int vararg);