wcc/cgen: #119 scalar &fn global DATA via the #117 reloc helper (both-stage)

This commit is contained in:
2026-06-06 20:28:50 +09:00
parent 942abf0482
commit 1b4f25ac45
5 changed files with 94 additions and 9 deletions

View File

@@ -40247,8 +40247,10 @@ fn emitletdataw(c: *cgen, file: *node) void = {
if (sz == 8 && !issg && fsz == 0 && !isarr8 && !istup && !istagged) {
let v: u64 = 0u64;
let ok: bool = true;
let fnp: bool = false;
let r: *node = nil;
if (d.rhs != nil) {
let r: *node = d.rhs;
r = d.rhs;
for (r != nil) {
if (r.kind != nkind.N_CAST) { break; };
r = r.lhs;
@@ -40258,9 +40260,24 @@ fn emitletdataw(c: *cgen, file: *node) void = {
// int leaf folds. `let x: i8 = -1i8;`
// arrives as N_UN(TK_MINUS, N_INTLIT)
// after the typed-AST cast peel.
ok = foldintliteral(r, &v);
// #119: a scalar `&fn` global — the &fn->DATAR
// reloc (the #117 helper at its second consumer).
if (nodefnptr(c, r)) { fnp = true; }
else { ok = foldintliteral(r, &v); };
};
if (ok) {
if (fnp) {
emitline("DATAW ");
emitsymnamehint(c, nm, d.nmod);
emitline("(SB),\"");
let zi: i32 = 0;
for (zi < 8) { emitdatawbyte(0u8); zi += 1; };
emitline("\"\n");
emitline("DATAR ");
emitsymnamehint(c, nm, d.nmod);
emitline("+0(SB),");
emitfnname(c, r.lhs.str, c.curmod);
emitline("(SB)\n");
} else if (ok) {
emitline("DATAW ");
emitsymnamehint(c, nm, d.nmod);
emitline("(SB),\"");

View File

@@ -2693,8 +2693,10 @@ fn emitletdataw(c: *cgen, file: *node) void = {
if (sz == 8 && !issg && fsz == 0 && !isarr8 && !istup && !istagged) {
let v: u64 = 0u64;
let ok: bool = true;
let fnp: bool = false;
let r: *node = nil;
if (d.rhs != nil) {
let r: *node = d.rhs;
r = d.rhs;
for (r != nil) {
if (r.kind != nkind.N_CAST) { break; };
r = r.lhs;
@@ -2704,9 +2706,24 @@ fn emitletdataw(c: *cgen, file: *node) void = {
// int leaf folds. `let x: i8 = -1i8;`
// arrives as N_UN(TK_MINUS, N_INTLIT)
// after the typed-AST cast peel.
ok = foldintliteral(r, &v);
// #119: a scalar `&fn` global — the &fn->DATAR
// reloc (the #117 helper at its second consumer).
if (nodefnptr(c, r)) { fnp = true; }
else { ok = foldintliteral(r, &v); };
};
if (ok) {
if (fnp) {
emitline("DATAW ");
emitsymnamehint(c, nm, d.nmod);
emitline("(SB),\"");
let zi: i32 = 0;
for (zi < 8) { emitdatawbyte(0u8); zi += 1; };
emitline("\"\n");
emitline("DATAR ");
emitsymnamehint(c, nm, d.nmod);
emitline("+0(SB),");
emitfnname(c, r.lhs.str, c.curmod);
emitline("(SB)\n");
} else if (ok) {
emitline("DATAW ");
emitsymnamehint(c, nm, d.nmod);
emitline("(SB),\"");

View File

@@ -40247,8 +40247,10 @@ fn emitletdataw(c: *cgen, file: *node) void = {
if (sz == 8 && !issg && fsz == 0 && !isarr8 && !istup && !istagged) {
let v: u64 = 0u64;
let ok: bool = true;
let fnp: bool = false;
let r: *node = nil;
if (d.rhs != nil) {
let r: *node = d.rhs;
r = d.rhs;
for (r != nil) {
if (r.kind != nkind.N_CAST) { break; };
r = r.lhs;
@@ -40258,9 +40260,24 @@ fn emitletdataw(c: *cgen, file: *node) void = {
// int leaf folds. `let x: i8 = -1i8;`
// arrives as N_UN(TK_MINUS, N_INTLIT)
// after the typed-AST cast peel.
ok = foldintliteral(r, &v);
// #119: a scalar `&fn` global — the &fn->DATAR
// reloc (the #117 helper at its second consumer).
if (nodefnptr(c, r)) { fnp = true; }
else { ok = foldintliteral(r, &v); };
};
if (ok) {
if (fnp) {
emitline("DATAW ");
emitsymnamehint(c, nm, d.nmod);
emitline("(SB),\"");
let zi: i32 = 0;
for (zi < 8) { emitdatawbyte(0u8); zi += 1; };
emitline("\"\n");
emitline("DATAR ");
emitsymnamehint(c, nm, d.nmod);
emitline("+0(SB),");
emitfnname(c, r.lhs.str, c.curmod);
emitline("(SB)\n");
} else if (ok) {
emitline("DATAW ");
emitsymnamehint(c, nm, d.nmod);
emitline("(SB),\"");