From 9f76e816d7e1fc944c9d67f883444aeceae5a197 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Wed, 3 Jun 2026 01:45:47 +0900 Subject: [PATCH] w6l: pass reloc-kind + dyn vidx if-ladders -> switch (Wave-2 structural) relocate() reloc-kind ladder -> switch(k): PC32+PLT32 share a byte-identical body (comma-case), R_X86_64_64 absolute, default = unsupported-reloc errs+=1. loadso() vidx ladder -> switch(vidx): LOCAL not-exported, GLOBAL+BASE(1) unversioned (comma-case), default = verdef name lookup. Regenerated w6l/main.combined.ww. --- selfhost/cmd/w6l/dyn.ww | 18 ++++++++---------- selfhost/cmd/w6l/main.combined.ww | 31 +++++++++++++------------------ selfhost/cmd/w6l/pass.ww | 13 +++++-------- 3 files changed, 26 insertions(+), 36 deletions(-) diff --git a/selfhost/cmd/w6l/dyn.ww b/selfhost/cmd/w6l/dyn.ww index 19b1ff90..09d0aad8 100644 --- a/selfhost/cmd/w6l/dyn.ww +++ b/selfhost/cmd/w6l/dyn.ww @@ -326,22 +326,20 @@ export fn loadso(l: *lnk, path: *u8) i32 = { keep = 0; // non-default } else { let vidx: u16 = v & VERSYM_VERSION_C; - if (vidx == VER_NDX_LOCAL_C) { + switch (vidx) { + case VER_NDX_LOCAL_C: keep = 0; // not exported - } else { if (vidx == VER_NDX_GLOBAL_C) { + case VER_NDX_GLOBAL_C,1u16: + // glibc's BASE entry (vidx==1): treat as + // unversioned. (The C version notes that + // vidx==1 in Verdef maps to the SONAME BASE.) vernamecs = nil; - } else { if (vidx == 1u16) { - // glibc's BASE entry: treat as - // unversioned. (The C version - // notes that vidx==1 in Verdef - // maps to the SONAME BASE.) - vernamecs = nil; - } else { + case: if (verstr != nil) { let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx); vernamecs = nm; }; - }; }; }; + }; }; }; diff --git a/selfhost/cmd/w6l/main.combined.ww b/selfhost/cmd/w6l/main.combined.ww index 10dbffa5..129d09b1 100644 --- a/selfhost/cmd/w6l/main.combined.ww +++ b/selfhost/cmd/w6l/main.combined.ww @@ -3888,22 +3888,20 @@ export fn loadso(l: *lnk, path: *u8) i32 = { keep = 0; // non-default } else { let vidx: u16 = v & VERSYM_VERSION_C; - if (vidx == VER_NDX_LOCAL_C) { + switch (vidx) { + case VER_NDX_LOCAL_C: keep = 0; // not exported - } else { if (vidx == VER_NDX_GLOBAL_C) { + case VER_NDX_GLOBAL_C,1u16: + // glibc's BASE entry (vidx==1): treat as + // unversioned. (The C version notes that + // vidx==1 in Verdef maps to the SONAME BASE.) vernamecs = nil; - } else { if (vidx == 1u16) { - // glibc's BASE entry: treat as - // unversioned. (The C version - // notes that vidx==1 in Verdef - // maps to the SONAME BASE.) - vernamecs = nil; - } else { + case: if (verstr != nil) { let nm: *u8 = vdnameat(buf, verdefoff, verdefsize, verstr, vidx); vernamecs = nm; }; - }; }; }; + }; }; }; @@ -4074,15 +4072,12 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { let symva: u64 = textva + r.sym.val; if (r.sym.indata != 0) { symva = datava + r.sym.val; }; let k: i32 = r.kind; - if (k == R_X86_64_PC32) { + switch (k) { + case R_X86_64_PC32,R_X86_64_PLT32: let site: u64 = textva + r.off; let rel: i64 = (symva: i64 - site: i64) + r.addend; patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_PLT32) { - let site: u64 = textva + r.off; - let rel: i64 = (symva: i64 - site: i64) + r.addend; - patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_64) { + case R_X86_64_64: // Absolute 64-bit. Currently used only // for DATAR slots in .data. let v: u64 = (symva: i64 + r.addend): u64; @@ -4091,10 +4086,10 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { } else { patchu64(l.text + r.off, v); }; - } else { + case: os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64); l.errs += 1; - };};}; + }; }; }; r = r.rnext; diff --git a/selfhost/cmd/w6l/pass.ww b/selfhost/cmd/w6l/pass.ww index 928e883d..dae017c0 100644 --- a/selfhost/cmd/w6l/pass.ww +++ b/selfhost/cmd/w6l/pass.ww @@ -105,15 +105,12 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { let symva: u64 = textva + r.sym.val; if (r.sym.indata != 0) { symva = datava + r.sym.val; }; let k: i32 = r.kind; - if (k == R_X86_64_PC32) { + switch (k) { + case R_X86_64_PC32,R_X86_64_PLT32: let site: u64 = textva + r.off; let rel: i64 = (symva: i64 - site: i64) + r.addend; patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_PLT32) { - let site: u64 = textva + r.off; - let rel: i64 = (symva: i64 - site: i64) + r.addend; - patchu32(l.text + r.off, rel: u32); - } else { if (k == R_X86_64_64) { + case R_X86_64_64: // Absolute 64-bit. Currently used only // for DATAR slots in .data. let v: u64 = (symva: i64 + r.addend): u64; @@ -122,10 +119,10 @@ export fn relocate(l: *lnk, textva: u64, datava: u64) i32 = { } else { patchu64(l.text + r.off, v); }; - } else { + case: os.write(2, "w6l: unsupported reloc kind\n".ptr, 27u64); l.errs += 1; - };};}; + }; }; }; r = r.rnext;