Both stages emitted fn TEXT labels by leaf only; lib/os and lib/io
exporting the same leaves (read, write, close) collided at link.
lib/fmt + lib/log worked around with @symbol("rt_syscall") stubs.
Drop d->export from the fn skip rule in mod_collect (both stages) so
exported fns mangle as <module>.<name>. Let/def/type keep current
behavior. Skip retained for {@symbol, main, empty-module}.
Add cur_mod thread through cgfn + mod_lookup_for_fn(name, hint) at
all 4 label-emit sites (TEXT def, LEAQ N_IDENT, CALL N_IDENT, CALL
N_DOT). Wwstage mirror: emitfnname + modlookupforfn + curmod.
Invariant comment pinned in both stages.
ww2 == ww3 == ww4 byte-identical at the new label format.
706_fnlabel_mangle covers same-leaf cross-module CALL + private-leaf
cur_mod disambiguation through a fn-pointer rvalue.
Wwstage LEAQ-of-fn N_DOT (`let p = mod.fn` rvalue) is a pre-existing
gap; deferred to a follow-up. fmt/log rt_syscall stubs untouched
here; cleanup follows.
12 lines
293 B
Plaintext
12 lines
293 B
Plaintext
// Sibling of mod1.ww — same leaves (`ping`, `helper`, `fpi`),
|
|
// distinct values. See mod1.ww for the coverage-rationale comment.
|
|
|
|
fn helper() i32 = { return 13i32; };
|
|
|
|
fn fpi() i32 = {
|
|
let h: fn() i32 = helper;
|
|
return h();
|
|
};
|
|
|
|
export fn ping() i32 = { return 5i32 + helper() + fpi(); };
|