toolchain: banner purge + WHY-only comment sweep (rule 8)
selfhost/, cmd/, internal/ join the tree-wide sweep: every section banner dies (91 selfhost + the cmd C-style dividers -> 0); narration and stale contracts deleted (pre-#22 bundler notes, retired single-PT_LOAD and no-archive claims, superseded ABI tables); every ref/harec/qbe cite, task cite, encoding/ELF contract, and rule-10 twin pointer kept; lost lifetime/rationale lines restored where the sweep over-cut (elf_globals ownership, kwtab linear-scan). Comment- only proven: all five wwstage tool binaries byte-identical across the sweep; test-commit, test-byteid (161+1399, 0 pinned-divergent), and test-bootstrap (fixed point + 991-995 byte-id) all exit 0. The read-through banked 66 latent-bug leads (checkpoint).
This commit is contained in:
@@ -1,14 +1,3 @@
|
||||
// selfhost/cmd/wcc/cgenutil.ww — split out of cgen.ww.
|
||||
//
|
||||
// General helpers used across cgenexpr / cgenstmt / cgendecl:
|
||||
// - pushargsrev: per-call arg pushing
|
||||
// - type predicates: isstr*/isslice*/istagged*/nodeis* families
|
||||
// - field ops: fieldloadop, fieldstoreop
|
||||
// - index helpers: elemsizeof, elemsizeofc
|
||||
// - slot sizing: structlookup, primsize, slotsize, fieldsize,
|
||||
// registerstruct, collectstructs
|
||||
// - rhs helpers: taggedvariantindex
|
||||
//
|
||||
// Bundler pulls this in transitively via cgen.ww; consumers don't
|
||||
// need to `use cgenutil;` directly.
|
||||
|
||||
@@ -18,8 +7,6 @@ import os;
|
||||
import syntax;
|
||||
import strconv;
|
||||
|
||||
// ---- variadic-call helpers (Hare-style `T...` param) -----------------
|
||||
|
||||
// slicewrap — synthesise an N_TSLICE node wrapping the given element
|
||||
// type AST. Used by the Hare-style variadic path so the local entry
|
||||
// for the param (callee side) and the call-site slice descriptor
|
||||
@@ -263,8 +250,6 @@ fn calleecvariadic(c: *cgen, callee: *syntax.node, nfixed_out: *i32) bool = {
|
||||
return false;
|
||||
};
|
||||
|
||||
// ---- expression cgen -------------------------------------------------
|
||||
|
||||
// pushargsrev — recursively walks the arg list, evaluates rightmost
|
||||
// first, and pushes. str args take two slots (ptr in AX, len in BX);
|
||||
// the order on the stack so a left-to-right pop into argregs lands
|
||||
@@ -787,7 +772,6 @@ fn pushargsrev(c: *cgen, arg: *syntax.node, param: *syntax.node, memphase: bool,
|
||||
let es60: *syntax.tinfo = tichase(bu60.sub);
|
||||
if (es60 != nil) { esz = es60.size: i32; };
|
||||
};
|
||||
// base address → push
|
||||
if (baselocal != nil) {
|
||||
let tn: *syntax.node = baselocal.tnode;
|
||||
let isarr60: bool = false;
|
||||
@@ -828,7 +812,6 @@ fn pushargsrev(c: *cgen, arg: *syntax.node, param: *syntax.node, memphase: bool,
|
||||
cgexpr(c, base);
|
||||
};};};
|
||||
emitline("\tPUSHQ\tAX\n");
|
||||
// hi (default base length) → push
|
||||
if (hi != nil) {
|
||||
cgexpr(c, hi);
|
||||
} else { if (baselocal != nil) {
|
||||
@@ -945,7 +928,6 @@ fn pushargsrev(c: *cgen, arg: *syntax.node, param: *syntax.node, memphase: bool,
|
||||
emitline("\tMOVQ\t$0, AX\n");
|
||||
};};};};};
|
||||
emitline("\tPUSHQ\tAX\n");
|
||||
// lo (default 0) → AX
|
||||
if (lo != nil) { cgexpr(c, lo); }
|
||||
else { emitline("\tMOVQ\t$0, AX\n"); };
|
||||
emitline("\tPOPQ\tBX\n"); // hi
|
||||
@@ -2098,14 +2080,9 @@ fn elemsizeofc(c: *cgen, t: *syntax.node) i32 = {
|
||||
return slotsize(c, elem);
|
||||
};
|
||||
|
||||
// nodeisunsigned — best-effort cgen-time inference from the AST. We
|
||||
// walk surface nodes (N_DOT now reads n.type_ — #55 A.6.3g):
|
||||
// nkind.N_INTLIT — never marked unsigned (no tsuffix plumbing yet)
|
||||
// nkind.N_IDENT — look up the local's declared type
|
||||
// nkind.N_DOT — read the checker-stamped n.type_ (#55 A.6.3g)
|
||||
// nkind.N_BIN / nkind.N_UN — recurse: unsigned if either operand is unsigned
|
||||
// nkind.N_CAST — use the cast target type
|
||||
//
|
||||
// nodeisunsigned — best-effort cgen-time inference from the AST
|
||||
// (N_DOT reads the checker-stamped n.type_ — #55 A.6.3g).
|
||||
// nkind.N_INTLIT is never marked unsigned (no tsuffix plumbing yet).
|
||||
// Conservative: if we can't tell, return false (signed). The cost of
|
||||
// being wrong here is byte-different asm vs C, not bad runtime.
|
||||
fn nodeisunsigned(c: *cgen, n: *syntax.node) bool = {
|
||||
@@ -2191,8 +2168,6 @@ fn nodeprimwidth(c: *cgen, n: *syntax.node) i32 = {
|
||||
return 0;
|
||||
};
|
||||
|
||||
// ---- type-driven slot sizing ----------------------------------------
|
||||
|
||||
// structnaturalsize — type-natural size of `si`, i.e. max(foff +
|
||||
// fsz) across declared fields, UNROUNDED. This is the memory-copy
|
||||
// extent: cstage copies exactly these bytes for the >24B sret
|
||||
@@ -2594,11 +2569,8 @@ fn structsamemod(c: *cgen, name: str) *structinfo = {
|
||||
return nil;
|
||||
};
|
||||
|
||||
// primsize — size in bytes of a primitive type name (or 0 if not
|
||||
// recognised as a primitive — the caller falls back to other paths).
|
||||
// fldnumidx — parse a tuple field name like "0" / "1" / "12" into an
|
||||
// index, or -1 if not all-digits. Used by cgdot to dispatch
|
||||
// `t.0` / `t.1` against an nkind.N_TTUPLE local without pulling in strconv.
|
||||
// fldnumidx — used by cgdot to dispatch `t.0` / `t.1` against an
|
||||
// nkind.N_TTUPLE local without pulling in strconv.
|
||||
fn fldnumidx(s: str) i32 = {
|
||||
if (s.len == 0) { return -1; };
|
||||
let r: i32 = 0;
|
||||
@@ -5141,7 +5113,6 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *syntax.tinfo, src: *syntax.node, slot_of
|
||||
}; };
|
||||
};
|
||||
};
|
||||
// Struct payload (literal or ident).
|
||||
let sname: str = rhsstructpayload(c, src);
|
||||
if (sname.len > 0) {
|
||||
let si: *structinfo = structlookup(c, sname);
|
||||
|
||||
Reference in New Issue
Block a user