From 2131ae0deed26041bea6379d47bbbf0059fb544b Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Tue, 2 Jun 2026 20:41:51 +0900 Subject: [PATCH] w6a,w6l: char-literals for ELF/archive magic bytes (Wave-1) byte-id-neutral: every magic-decimal sub is value-equivalent to its ASCII char-literal. 0x7F (ELF byte-0), ELFCLASS64=2, NUL sentinels, and hex/itoa radix arithmetic kept decimal (no char identity). Regenerated w6a/w6l main.combined.ww (the only two embedders). --- selfhost/cmd/w6a/main.combined.ww | 70 +++++++++++++------------- selfhost/cmd/w6a/parse.ww | 70 +++++++++++++------------- selfhost/cmd/w6l/dyn.ww | 8 +-- selfhost/cmd/w6l/main.combined.ww | 82 +++++++++++++++---------------- selfhost/cmd/w6l/main.ww | 44 ++++++++--------- selfhost/cmd/w6l/obj.ww | 30 +++++------ 6 files changed, 152 insertions(+), 152 deletions(-) diff --git a/selfhost/cmd/w6a/main.combined.ww b/selfhost/cmd/w6a/main.combined.ww index 952dc159..461a521c 100644 --- a/selfhost/cmd/w6a/main.combined.ww +++ b/selfhost/cmd/w6a/main.combined.ww @@ -3328,7 +3328,7 @@ fn nextline(a: *asm_) (*u8, u64) = { if (a.pos >= a.srclen) { return nil, 0u64; }; let start: u64 = a.pos; for (a.pos < a.srclen) { - if (a.src[a.pos] == 10u8) { a.pos = a.pos; a.pos += 0u64; } // no-op; explicit break via condition + if (a.src[a.pos] == '\n') { a.pos = a.pos; a.pos += 0u64; } // no-op; explicit break via condition else { a.pos += 1u64; continue; }; // hit newline let n: u64 = a.pos - start; @@ -3352,7 +3352,7 @@ fn nextline(a: *asm_) (*u8, u64) = { fn skipws(p: *u8, off: u64, n: u64) u64 = { let i: u64 = off; for (i < n) { - if (p[i] != 32u8) { if (p[i] != 9u8) { return i; }; }; + if (p[i] != ' ') { if (p[i] != '\t') { return i; }; }; i += 1u64; }; return i; @@ -3372,7 +3372,7 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { let c0: u8 = p[off]; // $NUM - if (c0 == 36u8) { // '$' + if (c0 == '$') { off += 1u64; let v: i64; let used: u64; @@ -3383,11 +3383,11 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { }; // (REG) - if (c0 == 40u8) { // '(' + if (c0 == '(') { off += 1u64; let rstart: u64 = off; for (off < n) { - if (p[off] == 41u8) { off = off; off += 0u64; } // no-op marker + if (p[off] == ')') { off = off; off += 0u64; } // no-op marker else { off += 1u64; continue; }; let rn: u64 = off - rstart; let r: i32 = reglookup(p + rstart, rn); @@ -3405,19 +3405,19 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { let cur: u64 = off; let isnum: bool = false; if (cur < n) { - if (p[cur] == 45u8) { isnum = true; } - else { if (p[cur] >= 48u8) { if (p[cur] <= 57u8) { isnum = true; }; }; }; + if (p[cur] == '-') { isnum = true; } + else { if (p[cur] >= '0') { if (p[cur] <= '9') { isnum = true; }; }; }; }; if (isnum) { let v: i64; let used: u64; v, used = parsenum(p + off, n - off); let after: u64 = off + used; - if (after < n) { if (p[after] == 40u8) { // '(' + if (after < n) { if (p[after] == '(') { let rstart: u64 = after + 1u64; let cur2: u64 = rstart; for (cur2 < n) { - if (p[cur2] == 41u8) { cur2 = cur2; cur2 += 0u64; } + if (p[cur2] == ')') { cur2 = cur2; cur2 += 0u64; } else { cur2 += 1u64; continue; }; let rn: u64 = cur2 - rstart; let r: i32 = reglookup(p + rstart, rn); @@ -3446,7 +3446,7 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { // by DATAR to address bytes within a previously-defined // .data slot (e.g. `DATAR s+8(SB),...`). let symdisp: i64 = 0i64; - if (off < n) { if (p[off] == 43u8) { // '+' + if (off < n) { if (p[off] == '+') { off += 1u64; let v: i64; let used: u64; @@ -3455,11 +3455,11 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { off += used; };}; // IDENT(SB) — external - if (off < n) { if (p[off] == 40u8) { // '(' + if (off < n) { if (p[off] == '(') { let rstart: u64 = off + 1u64; let cur2: u64 = rstart; for (cur2 < n) { - if (p[cur2] == 41u8) { cur2 = cur2; cur2 += 0u64; } + if (p[cur2] == ')') { cur2 = cur2; cur2 += 0u64; } else { cur2 += 1u64; continue; }; let rn: u64 = cur2 - rstart; let r: i32 = reglookup(p + rstart, rn); @@ -3525,7 +3525,7 @@ export fn parse(a: *asm_) i32 = { // blank or //-comment if (i >= n) { a.line += 1; continue; }; if (i + 1u64 < n) { - if (line[i] == 47u8) { if (line[i + 1u64] == 47u8) { + if (line[i] == '/') { if (line[i + 1u64] == '/') { a.line += 1; continue; };}; }; @@ -3534,7 +3534,7 @@ export fn parse(a: *asm_) i32 = { // Only if the identifier is followed by ':'. Otherwise, fall // through to mnemonic parsing so e.g. `TEXT foo,$0` (which // also starts with an idchar in column 0) gets parsed. - if (line[0u64] != 9u8) { + if (line[0u64] != '\t') { if (isidstart(line[i]: i32)) { let q: u64 = i; let scanid: bool = true; @@ -3543,7 +3543,7 @@ export fn parse(a: *asm_) i32 = { else { if (isidcont(line[q]: i32)) { q += 1u64; } else { scanid = false; }; }; }; - if (q < n) { if (line[q] == 58u8) { // ':' + if (q < n) { if (line[q] == ':') { let nm: str = dupstr(line + i, q - i); // Pending label gets a NOP prog so addresses pin. if (pending.len > 0) { @@ -3563,8 +3563,8 @@ export fn parse(a: *asm_) i32 = { let scan: bool = true; for (scan) { if (m >= n) { scan = false; } - else { if (line[m] == 32u8) { scan = false; } - else { if (line[m] == 9u8) { scan = false; } + else { if (line[m] == ' ') { scan = false; } + else { if (line[m] == '\t') { scan = false; } else { m += 1u64; }; }; }; }; let mlen: u64 = m - mstart; @@ -3590,7 +3590,7 @@ export fn parse(a: *asm_) i32 = { let scant: bool = true; for (scant) { if (q >= n) { scant = false; } - else { if (line[q] == 44u8) { commapos = q; scant = false; } + else { if (line[q] == ',') { commapos = q; scant = false; } else { q += 1u64; }; }; }; let toop: *aoperand = pr.to; @@ -3599,7 +3599,7 @@ export fn parse(a: *asm_) i32 = { if (commapos < n) { let p2: u64 = commapos + 1u64; p2 = skipws(line, p2, n); - if (p2 < n) { if (line[p2] == 36u8) { p2 += 1u64; }; }; + if (p2 < n) { if (line[p2] == '$') { p2 += 1u64; }; }; let v: i64; let used: u64; v, used = parsenum(line + p2, n - p2); @@ -3618,7 +3618,7 @@ export fn parse(a: *asm_) i32 = { let scand: bool = true; for (scand) { if (q >= n) { scand = false; } - else { if (line[q] == 40u8) { lparen = q; scand = false; } + else { if (line[q] == '(') { lparen = q; scand = false; } else { q += 1u64; }; }; }; let toop: *aoperand = pr.to; @@ -3629,41 +3629,41 @@ export fn parse(a: *asm_) i32 = { let scand2: bool = true; for (scand2) { if (p2 >= n) { scand2 = false; } - else { if (line[p2] == 41u8) { p2 += 1u64; scand2 = false; } + else { if (line[p2] == ')') { p2 += 1u64; scand2 = false; } else { p2 += 1u64; }; }; }; // Skip ws / ',' / tab between `)` and the `"`. let scand3: bool = true; for (scand3) { if (p2 >= n) { scand3 = false; } - else { if (line[p2] == 32u8) { p2 += 1u64; } - else { if (line[p2] == 44u8) { p2 += 1u64; } - else { if (line[p2] == 9u8) { p2 += 1u64; } + else { if (line[p2] == ' ') { p2 += 1u64; } + else { if (line[p2] == ',') { p2 += 1u64; } + else { if (line[p2] == '\t') { p2 += 1u64; } else { scand3 = false; }; }; }; }; }; if (p2 >= n) { perr(a, "DATA missing payload"); a.line += 1; continue; }; - if (line[p2] != 34u8) { perr(a, "DATA expects \"...\""); a.line += 1; continue; }; + if (line[p2] != '"') { perr(a, "DATA expects \"...\""); a.line += 1; continue; }; p2 += 1u64; // past opening " // Parse escape sequence into a fresh growable buffer. let cap: u64 = 32u64; let blen: u64 = 0u64; let dbuf: []u8 = alloc([], cap)!; for (p2 < n) { - if (line[p2] == 34u8) { p2 = p2; p2 += 0u64; p2 = n + 1u64; } + if (line[p2] == '"') { p2 = p2; p2 += 0u64; p2 = n + 1u64; } else { let ch: u8 = line[p2]; p2 += 1u64; - if (ch == 92u8) { // '\' + if (ch == '\\') { if (p2 < n) { let e: u8 = line[p2]; p2 += 1u64; - if (e == 110u8) { ch = 10u8; } // 'n' - else { if (e == 116u8) { ch = 9u8; } - else { if (e == 114u8) { ch = 13u8; } - else { if (e == 92u8) { ch = 92u8; } - else { if (e == 34u8) { ch = 34u8; } - else { if (e == 48u8) { ch = 0u8; } - else { if (e == 120u8) { // 'x' + if (e == 'n') { ch = '\n'; } + else { if (e == 't') { ch = '\t'; } + else { if (e == 'r') { ch = '\r'; } + else { if (e == '\\') { ch = '\\'; } + else { if (e == '"') { ch = '"'; } + else { if (e == '0') { ch = '\0'; } + else { if (e == 'x') { if (p2 + 1u64 < n) { let hi: u8 = line[p2]; let lo: u8 = line[p2 + 1u64]; @@ -3702,7 +3702,7 @@ export fn parse(a: *asm_) i32 = { let comma: i64 = -1i64; let q: u64 = r0; for (q < n) { - if (line[q] == 44u8) { + if (line[q] == ',') { if (comma < 0i64) { comma = q: i64; }; }; q += 1u64; diff --git a/selfhost/cmd/w6a/parse.ww b/selfhost/cmd/w6a/parse.ww index 7207147e..085c4751 100644 --- a/selfhost/cmd/w6a/parse.ww +++ b/selfhost/cmd/w6a/parse.ww @@ -195,7 +195,7 @@ fn nextline(a: *asm_) (*u8, u64) = { if (a.pos >= a.srclen) { return nil, 0u64; }; let start: u64 = a.pos; for (a.pos < a.srclen) { - if (a.src[a.pos] == 10u8) { a.pos = a.pos; a.pos += 0u64; } // no-op; explicit break via condition + if (a.src[a.pos] == '\n') { a.pos = a.pos; a.pos += 0u64; } // no-op; explicit break via condition else { a.pos += 1u64; continue; }; // hit newline let n: u64 = a.pos - start; @@ -219,7 +219,7 @@ fn nextline(a: *asm_) (*u8, u64) = { fn skipws(p: *u8, off: u64, n: u64) u64 = { let i: u64 = off; for (i < n) { - if (p[i] != 32u8) { if (p[i] != 9u8) { return i; }; }; + if (p[i] != ' ') { if (p[i] != '\t') { return i; }; }; i += 1u64; }; return i; @@ -239,7 +239,7 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { let c0: u8 = p[off]; // $NUM - if (c0 == 36u8) { // '$' + if (c0 == '$') { off += 1u64; let v: i64; let used: u64; @@ -250,11 +250,11 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { }; // (REG) - if (c0 == 40u8) { // '(' + if (c0 == '(') { off += 1u64; let rstart: u64 = off; for (off < n) { - if (p[off] == 41u8) { off = off; off += 0u64; } // no-op marker + if (p[off] == ')') { off = off; off += 0u64; } // no-op marker else { off += 1u64; continue; }; let rn: u64 = off - rstart; let r: i32 = reglookup(p + rstart, rn); @@ -272,19 +272,19 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { let cur: u64 = off; let isnum: bool = false; if (cur < n) { - if (p[cur] == 45u8) { isnum = true; } - else { if (p[cur] >= 48u8) { if (p[cur] <= 57u8) { isnum = true; }; }; }; + if (p[cur] == '-') { isnum = true; } + else { if (p[cur] >= '0') { if (p[cur] <= '9') { isnum = true; }; }; }; }; if (isnum) { let v: i64; let used: u64; v, used = parsenum(p + off, n - off); let after: u64 = off + used; - if (after < n) { if (p[after] == 40u8) { // '(' + if (after < n) { if (p[after] == '(') { let rstart: u64 = after + 1u64; let cur2: u64 = rstart; for (cur2 < n) { - if (p[cur2] == 41u8) { cur2 = cur2; cur2 += 0u64; } + if (p[cur2] == ')') { cur2 = cur2; cur2 += 0u64; } else { cur2 += 1u64; continue; }; let rn: u64 = cur2 - rstart; let r: i32 = reglookup(p + rstart, rn); @@ -313,7 +313,7 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { // by DATAR to address bytes within a previously-defined // .data slot (e.g. `DATAR s+8(SB),...`). let symdisp: i64 = 0i64; - if (off < n) { if (p[off] == 43u8) { // '+' + if (off < n) { if (p[off] == '+') { off += 1u64; let v: i64; let used: u64; @@ -322,11 +322,11 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = { off += used; };}; // IDENT(SB) — external - if (off < n) { if (p[off] == 40u8) { // '(' + if (off < n) { if (p[off] == '(') { let rstart: u64 = off + 1u64; let cur2: u64 = rstart; for (cur2 < n) { - if (p[cur2] == 41u8) { cur2 = cur2; cur2 += 0u64; } + if (p[cur2] == ')') { cur2 = cur2; cur2 += 0u64; } else { cur2 += 1u64; continue; }; let rn: u64 = cur2 - rstart; let r: i32 = reglookup(p + rstart, rn); @@ -392,7 +392,7 @@ export fn parse(a: *asm_) i32 = { // blank or //-comment if (i >= n) { a.line += 1; continue; }; if (i + 1u64 < n) { - if (line[i] == 47u8) { if (line[i + 1u64] == 47u8) { + if (line[i] == '/') { if (line[i + 1u64] == '/') { a.line += 1; continue; };}; }; @@ -401,7 +401,7 @@ export fn parse(a: *asm_) i32 = { // Only if the identifier is followed by ':'. Otherwise, fall // through to mnemonic parsing so e.g. `TEXT foo,$0` (which // also starts with an idchar in column 0) gets parsed. - if (line[0u64] != 9u8) { + if (line[0u64] != '\t') { if (isidstart(line[i]: i32)) { let q: u64 = i; let scanid: bool = true; @@ -410,7 +410,7 @@ export fn parse(a: *asm_) i32 = { else { if (isidcont(line[q]: i32)) { q += 1u64; } else { scanid = false; }; }; }; - if (q < n) { if (line[q] == 58u8) { // ':' + if (q < n) { if (line[q] == ':') { let nm: str = dupstr(line + i, q - i); // Pending label gets a NOP prog so addresses pin. if (pending.len > 0) { @@ -430,8 +430,8 @@ export fn parse(a: *asm_) i32 = { let scan: bool = true; for (scan) { if (m >= n) { scan = false; } - else { if (line[m] == 32u8) { scan = false; } - else { if (line[m] == 9u8) { scan = false; } + else { if (line[m] == ' ') { scan = false; } + else { if (line[m] == '\t') { scan = false; } else { m += 1u64; }; }; }; }; let mlen: u64 = m - mstart; @@ -457,7 +457,7 @@ export fn parse(a: *asm_) i32 = { let scant: bool = true; for (scant) { if (q >= n) { scant = false; } - else { if (line[q] == 44u8) { commapos = q; scant = false; } + else { if (line[q] == ',') { commapos = q; scant = false; } else { q += 1u64; }; }; }; let toop: *aoperand = pr.to; @@ -466,7 +466,7 @@ export fn parse(a: *asm_) i32 = { if (commapos < n) { let p2: u64 = commapos + 1u64; p2 = skipws(line, p2, n); - if (p2 < n) { if (line[p2] == 36u8) { p2 += 1u64; }; }; + if (p2 < n) { if (line[p2] == '$') { p2 += 1u64; }; }; let v: i64; let used: u64; v, used = parsenum(line + p2, n - p2); @@ -485,7 +485,7 @@ export fn parse(a: *asm_) i32 = { let scand: bool = true; for (scand) { if (q >= n) { scand = false; } - else { if (line[q] == 40u8) { lparen = q; scand = false; } + else { if (line[q] == '(') { lparen = q; scand = false; } else { q += 1u64; }; }; }; let toop: *aoperand = pr.to; @@ -496,41 +496,41 @@ export fn parse(a: *asm_) i32 = { let scand2: bool = true; for (scand2) { if (p2 >= n) { scand2 = false; } - else { if (line[p2] == 41u8) { p2 += 1u64; scand2 = false; } + else { if (line[p2] == ')') { p2 += 1u64; scand2 = false; } else { p2 += 1u64; }; }; }; // Skip ws / ',' / tab between `)` and the `"`. let scand3: bool = true; for (scand3) { if (p2 >= n) { scand3 = false; } - else { if (line[p2] == 32u8) { p2 += 1u64; } - else { if (line[p2] == 44u8) { p2 += 1u64; } - else { if (line[p2] == 9u8) { p2 += 1u64; } + else { if (line[p2] == ' ') { p2 += 1u64; } + else { if (line[p2] == ',') { p2 += 1u64; } + else { if (line[p2] == '\t') { p2 += 1u64; } else { scand3 = false; }; }; }; }; }; if (p2 >= n) { perr(a, "DATA missing payload"); a.line += 1; continue; }; - if (line[p2] != 34u8) { perr(a, "DATA expects \"...\""); a.line += 1; continue; }; + if (line[p2] != '"') { perr(a, "DATA expects \"...\""); a.line += 1; continue; }; p2 += 1u64; // past opening " // Parse escape sequence into a fresh growable buffer. let cap: u64 = 32u64; let blen: u64 = 0u64; let dbuf: []u8 = alloc([], cap)!; for (p2 < n) { - if (line[p2] == 34u8) { p2 = p2; p2 += 0u64; p2 = n + 1u64; } + if (line[p2] == '"') { p2 = p2; p2 += 0u64; p2 = n + 1u64; } else { let ch: u8 = line[p2]; p2 += 1u64; - if (ch == 92u8) { // '\' + if (ch == '\\') { if (p2 < n) { let e: u8 = line[p2]; p2 += 1u64; - if (e == 110u8) { ch = 10u8; } // 'n' - else { if (e == 116u8) { ch = 9u8; } - else { if (e == 114u8) { ch = 13u8; } - else { if (e == 92u8) { ch = 92u8; } - else { if (e == 34u8) { ch = 34u8; } - else { if (e == 48u8) { ch = 0u8; } - else { if (e == 120u8) { // 'x' + if (e == 'n') { ch = '\n'; } + else { if (e == 't') { ch = '\t'; } + else { if (e == 'r') { ch = '\r'; } + else { if (e == '\\') { ch = '\\'; } + else { if (e == '"') { ch = '"'; } + else { if (e == '0') { ch = '\0'; } + else { if (e == 'x') { if (p2 + 1u64 < n) { let hi: u8 = line[p2]; let lo: u8 = line[p2 + 1u64]; @@ -569,7 +569,7 @@ export fn parse(a: *asm_) i32 = { let comma: i64 = -1i64; let q: u64 = r0; for (q < n) { - if (line[q] == 44u8) { + if (line[q] == ',') { if (comma < 0i64) { comma = q: i64; }; }; q += 1u64; diff --git a/selfhost/cmd/w6l/dyn.ww b/selfhost/cmd/w6l/dyn.ww index 75aa93eb..19b1ff90 100644 --- a/selfhost/cmd/w6l/dyn.ww +++ b/selfhost/cmd/w6l/dyn.ww @@ -120,7 +120,7 @@ fn dbasename(p: *u8) *u8 = { let i: u64 = n; for (i > 0u64) { i -= 1u64; - if (p[i] == 47u8) { // '/' + if (p[i] == '/') { return p + i + 1u64; }; }; @@ -191,9 +191,9 @@ export fn loadso(l: *lnk, path: *u8) i32 = { return -1; }; if (buf[0u64] != 127u8) { return soerr("not ELF"); }; - if (buf[1u64] != 69u8) { return soerr("not ELF"); }; - if (buf[2u64] != 76u8) { return soerr("not ELF"); }; - if (buf[3u64] != 70u8) { return soerr("not ELF"); }; + if (buf[1u64] != 'E') { return soerr("not ELF"); }; + if (buf[2u64] != 'L') { return soerr("not ELF"); }; + if (buf[3u64] != 'F') { return soerr("not ELF"); }; if (buf[4u64] != 2u8) { return soerr("not ELFCLASS64"); }; if (du16(buf, EH_EMACHINE) != EM_X86_64_SO) { return soerr("not amd64"); diff --git a/selfhost/cmd/w6l/main.combined.ww b/selfhost/cmd/w6l/main.combined.ww index 43d846b9..866819da 100644 --- a/selfhost/cmd/w6l/main.combined.ww +++ b/selfhost/cmd/w6l/main.combined.ww @@ -3156,14 +3156,14 @@ type armember = struct { fn isarchive(p: *u8, len: u64) bool = { if (len < 8u64) { return false; }; - if (p[0u64] != 33u8) { return false; }; // '!' - if (p[1u64] != 60u8) { return false; }; // '<' - if (p[2u64] != 97u8) { return false; }; // 'a' - if (p[3u64] != 114u8) { return false; }; // 'r' - if (p[4u64] != 99u8) { return false; }; // 'c' - if (p[5u64] != 104u8) { return false; }; // 'h' - if (p[6u64] != 62u8) { return false; }; // '>' - if (p[7u64] != 10u8) { return false; }; // '\n' + if (p[0u64] != '!') { return false; }; + if (p[1u64] != '<') { return false; }; + if (p[2u64] != 'a') { return false; }; + if (p[3u64] != 'r') { return false; }; + if (p[4u64] != 'c') { return false; }; + if (p[5u64] != 'h') { return false; }; + if (p[6u64] != '>') { return false; }; + if (p[7u64] != '\n') { return false; }; return true; }; @@ -3187,9 +3187,9 @@ fn arfield(p: *u8, n: u64) u64 = { fn elfglobals(buf: *u8, len: u64) *defent = { if (len < EHDR_SIZE) { return nil; }; if (buf[0u64] != 127u8) { return nil; }; - if (buf[1u64] != 69u8) { return nil; }; - if (buf[2u64] != 76u8) { return nil; }; - if (buf[3u64] != 70u8) { return nil; }; + if (buf[1u64] != 'E') { return nil; }; + if (buf[2u64] != 'L') { return nil; }; + if (buf[3u64] != 'F') { return nil; }; let shoff: u64 = rdu64(buf, EHDR_SHOFF); let shnum: u32 = rdu16(buf, EHDR_SHNUM): u32; @@ -3291,7 +3291,7 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = { let first: u8 = buf[pos]; // Skip the symbol table ('/'), long-name table ('//'), and // any padding entries (NUL or space leading byte). - if (first != 47u8) { if (first != 0u8) { if (first != 32u8) { + if (first != '/') { if (first != 0u8) { if (first != ' ') { let m: *armember = alloc(armember { size = hdrsize })!; let mbs: []u8 = alloc([], hdrsize)!; let mb: *u8 = mbs.ptr; @@ -3349,9 +3349,9 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = { if (len < EHDR_SIZE) { return -1; }; // magic: 0x7f, 'E', 'L', 'F' if (buf[0u64] != 127u8) { return -1; }; - if (buf[1u64] != 69u8) { return -1; }; - if (buf[2u64] != 76u8) { return -1; }; - if (buf[3u64] != 70u8) { return -1; }; + if (buf[1u64] != 'E') { return -1; }; + if (buf[2u64] != 'L') { return -1; }; + if (buf[3u64] != 'F') { return -1; }; if (buf[4u64] != 2u8) { return -1; }; // ELFCLASS64 if (rdu16(buf, EHDR_TYPE) != ET_REL: u16) { return -1; }; if (rdu16(buf, EHDR_MACHINE) != EM_X86_64: u16) { return -1; }; @@ -3684,7 +3684,7 @@ fn dbasename(p: *u8) *u8 = { let i: u64 = n; for (i > 0u64) { i -= 1u64; - if (p[i] == 47u8) { // '/' + if (p[i] == '/') { return p + i + 1u64; }; }; @@ -3755,9 +3755,9 @@ export fn loadso(l: *lnk, path: *u8) i32 = { return -1; }; if (buf[0u64] != 127u8) { return soerr("not ELF"); }; - if (buf[1u64] != 69u8) { return soerr("not ELF"); }; - if (buf[2u64] != 76u8) { return soerr("not ELF"); }; - if (buf[3u64] != 70u8) { return soerr("not ELF"); }; + if (buf[1u64] != 'E') { return soerr("not ELF"); }; + if (buf[2u64] != 'L') { return soerr("not ELF"); }; + if (buf[3u64] != 'F') { return soerr("not ELF"); }; if (buf[4u64] != 2u8) { return soerr("not ELFCLASS64"); }; if (du16(buf, EH_EMACHINE) != EM_X86_64_SO) { return soerr("not amd64"); @@ -5078,13 +5078,13 @@ fn buildpath(dst: *u8, dir: *u8, name: *u8, ext: str) u64 = { let nn: u64 = cstrlen(name); let k: u64 = 0u64; for (k < dn) { dst[i] = dir[k]; i += 1u64; k += 1u64; }; - dst[i] = 47u8; // '/' + dst[i] = '/'; i += 1u64; - dst[i] = 108u8; // 'l' + dst[i] = 'l'; i += 1u64; - dst[i] = 105u8; // 'i' + dst[i] = 'i'; i += 1u64; - dst[i] = 98u8; // 'b' + dst[i] = 'b'; i += 1u64; k = 0u64; for (k < nn) { dst[i] = name[k]; i += 1u64; k += 1u64; }; @@ -5128,13 +5128,13 @@ fn buildpathv(dst: *u8, dir: *u8, name: *u8, v: u64) u64 = { let nn: u64 = cstrlen(name); let k: u64 = 0u64; for (k < dn) { dst[i] = dir[k]; i += 1u64; k += 1u64; }; - dst[i] = 47u8; i += 1u64; - dst[i] = 108u8; i += 1u64; - dst[i] = 105u8; i += 1u64; - dst[i] = 98u8; i += 1u64; + dst[i] = '/'; i += 1u64; + dst[i] = 'l'; i += 1u64; + dst[i] = 'i'; i += 1u64; + dst[i] = 'b'; i += 1u64; k = 0u64; for (k < nn) { dst[i] = name[k]; i += 1u64; k += 1u64; }; - dst[i] = 46u8; i += 1u64; dst[i] = 115u8; i += 1u64; dst[i] = 111u8; i += 1u64; dst[i] = 46u8; i += 1u64; + dst[i] = '.'; i += 1u64; dst[i] = 's'; i += 1u64; dst[i] = 'o'; i += 1u64; dst[i] = '.'; i += 1u64; i = appenddec(dst, i, v); dst[i] = 0u8; return i; @@ -5150,18 +5150,18 @@ fn islinkable(path: *u8) bool = { if (n < 4i64) { return false; }; // archive: "!\n" if (n >= 8i64) { - if (mp[0u64] == 33u8) { if (mp[1u64] == 60u8) { - if (mp[2u64] == 97u8) { if (mp[3u64] == 114u8) { - if (mp[4u64] == 99u8) { if (mp[5u64] == 104u8) { - if (mp[6u64] == 62u8) { if (mp[7u64] == 10u8) { + if (mp[0u64] == '!') { if (mp[1u64] == '<') { + if (mp[2u64] == 'a') { if (mp[3u64] == 'r') { + if (mp[4u64] == 'c') { if (mp[5u64] == 'h') { + if (mp[6u64] == '>') { if (mp[7u64] == '\n') { return true; }; }; }; }; }; }; }; }; }; // ELF: "\x7fELF" if (mp[0u64] == 127u8) { - if (mp[1u64] == 69u8) { - if (mp[2u64] == 76u8) { - if (mp[3u64] == 70u8) { return true; }; + if (mp[1u64] == 'E') { + if (mp[2u64] == 'L') { + if (mp[3u64] == 'F') { return true; }; }; }; }; @@ -5219,9 +5219,9 @@ fn isso(path: *u8) i32 = { os.close(fd); if (n < 20i64) { return 0; }; if (mp[0u64] != 127u8) { return 0; }; - if (mp[1u64] != 69u8) { return 0; }; - if (mp[2u64] != 76u8) { return 0; }; - if (mp[3u64] != 70u8) { return 0; }; + if (mp[1u64] != 'E') { return 0; }; + if (mp[2u64] != 'L') { return 0; }; + if (mp[3u64] != 'F') { return 0; }; // e_type at offset 16, u16 little-endian let t: u16 = (mp[16u64]: u16) | ((mp[17u64]: u16) << 8u16); if (t == 3u16) { return 1; }; @@ -5267,9 +5267,9 @@ export fn main(argc: i32, argv: **u8) i32 = { }; lflags[nlflags] = argv[i]; nlflags += 1; - } else { if (a[0u64] == 45u8) { + } else { if (a[0u64] == '-') { // -L joined form. - if (a[1u64] == 76u8) { + if (a[1u64] == 'L') { if (a[2u64] != 0u8) { libdirs[nlibdirs] = a + 2u64; nlibdirs += 1; @@ -5277,7 +5277,7 @@ export fn main(argc: i32, argv: **u8) i32 = { os.write(2, "w6l: bare -L\n".ptr, 12u64); return 2; }; - } else { if (a[1u64] == 108u8) { + } else { if (a[1u64] == 'l') { if (a[2u64] != 0u8) { lflags[nlflags] = a + 2u64; nlflags += 1; diff --git a/selfhost/cmd/w6l/main.ww b/selfhost/cmd/w6l/main.ww index 9c428c06..8bc7d0d3 100644 --- a/selfhost/cmd/w6l/main.ww +++ b/selfhost/cmd/w6l/main.ww @@ -36,13 +36,13 @@ fn buildpath(dst: *u8, dir: *u8, name: *u8, ext: str) u64 = { let nn: u64 = cstrlen(name); let k: u64 = 0u64; for (k < dn) { dst[i] = dir[k]; i += 1u64; k += 1u64; }; - dst[i] = 47u8; // '/' + dst[i] = '/'; i += 1u64; - dst[i] = 108u8; // 'l' + dst[i] = 'l'; i += 1u64; - dst[i] = 105u8; // 'i' + dst[i] = 'i'; i += 1u64; - dst[i] = 98u8; // 'b' + dst[i] = 'b'; i += 1u64; k = 0u64; for (k < nn) { dst[i] = name[k]; i += 1u64; k += 1u64; }; @@ -86,13 +86,13 @@ fn buildpathv(dst: *u8, dir: *u8, name: *u8, v: u64) u64 = { let nn: u64 = cstrlen(name); let k: u64 = 0u64; for (k < dn) { dst[i] = dir[k]; i += 1u64; k += 1u64; }; - dst[i] = 47u8; i += 1u64; - dst[i] = 108u8; i += 1u64; - dst[i] = 105u8; i += 1u64; - dst[i] = 98u8; i += 1u64; + dst[i] = '/'; i += 1u64; + dst[i] = 'l'; i += 1u64; + dst[i] = 'i'; i += 1u64; + dst[i] = 'b'; i += 1u64; k = 0u64; for (k < nn) { dst[i] = name[k]; i += 1u64; k += 1u64; }; - dst[i] = 46u8; i += 1u64; dst[i] = 115u8; i += 1u64; dst[i] = 111u8; i += 1u64; dst[i] = 46u8; i += 1u64; + dst[i] = '.'; i += 1u64; dst[i] = 's'; i += 1u64; dst[i] = 'o'; i += 1u64; dst[i] = '.'; i += 1u64; i = appenddec(dst, i, v); dst[i] = 0u8; return i; @@ -108,18 +108,18 @@ fn islinkable(path: *u8) bool = { if (n < 4i64) { return false; }; // archive: "!\n" if (n >= 8i64) { - if (mp[0u64] == 33u8) { if (mp[1u64] == 60u8) { - if (mp[2u64] == 97u8) { if (mp[3u64] == 114u8) { - if (mp[4u64] == 99u8) { if (mp[5u64] == 104u8) { - if (mp[6u64] == 62u8) { if (mp[7u64] == 10u8) { + if (mp[0u64] == '!') { if (mp[1u64] == '<') { + if (mp[2u64] == 'a') { if (mp[3u64] == 'r') { + if (mp[4u64] == 'c') { if (mp[5u64] == 'h') { + if (mp[6u64] == '>') { if (mp[7u64] == '\n') { return true; }; }; }; }; }; }; }; }; }; // ELF: "\x7fELF" if (mp[0u64] == 127u8) { - if (mp[1u64] == 69u8) { - if (mp[2u64] == 76u8) { - if (mp[3u64] == 70u8) { return true; }; + if (mp[1u64] == 'E') { + if (mp[2u64] == 'L') { + if (mp[3u64] == 'F') { return true; }; }; }; }; @@ -177,9 +177,9 @@ fn isso(path: *u8) i32 = { os.close(fd); if (n < 20i64) { return 0; }; if (mp[0u64] != 127u8) { return 0; }; - if (mp[1u64] != 69u8) { return 0; }; - if (mp[2u64] != 76u8) { return 0; }; - if (mp[3u64] != 70u8) { return 0; }; + if (mp[1u64] != 'E') { return 0; }; + if (mp[2u64] != 'L') { return 0; }; + if (mp[3u64] != 'F') { return 0; }; // e_type at offset 16, u16 little-endian let t: u16 = (mp[16u64]: u16) | ((mp[17u64]: u16) << 8u16); if (t == 3u16) { return 1; }; @@ -225,9 +225,9 @@ export fn main(argc: i32, argv: **u8) i32 = { }; lflags[nlflags] = argv[i]; nlflags += 1; - } else { if (a[0u64] == 45u8) { + } else { if (a[0u64] == '-') { // -L joined form. - if (a[1u64] == 76u8) { + if (a[1u64] == 'L') { if (a[2u64] != 0u8) { libdirs[nlibdirs] = a + 2u64; nlibdirs += 1; @@ -235,7 +235,7 @@ export fn main(argc: i32, argv: **u8) i32 = { os.write(2, "w6l: bare -L\n".ptr, 12u64); return 2; }; - } else { if (a[1u64] == 108u8) { + } else { if (a[1u64] == 'l') { if (a[2u64] != 0u8) { lflags[nlflags] = a + 2u64; nlflags += 1; diff --git a/selfhost/cmd/w6l/obj.ww b/selfhost/cmd/w6l/obj.ww index c2392ec2..6b1cd336 100644 --- a/selfhost/cmd/w6l/obj.ww +++ b/selfhost/cmd/w6l/obj.ww @@ -209,14 +209,14 @@ type armember = struct { fn isarchive(p: *u8, len: u64) bool = { if (len < 8u64) { return false; }; - if (p[0u64] != 33u8) { return false; }; // '!' - if (p[1u64] != 60u8) { return false; }; // '<' - if (p[2u64] != 97u8) { return false; }; // 'a' - if (p[3u64] != 114u8) { return false; }; // 'r' - if (p[4u64] != 99u8) { return false; }; // 'c' - if (p[5u64] != 104u8) { return false; }; // 'h' - if (p[6u64] != 62u8) { return false; }; // '>' - if (p[7u64] != 10u8) { return false; }; // '\n' + if (p[0u64] != '!') { return false; }; + if (p[1u64] != '<') { return false; }; + if (p[2u64] != 'a') { return false; }; + if (p[3u64] != 'r') { return false; }; + if (p[4u64] != 'c') { return false; }; + if (p[5u64] != 'h') { return false; }; + if (p[6u64] != '>') { return false; }; + if (p[7u64] != '\n') { return false; }; return true; }; @@ -240,9 +240,9 @@ fn arfield(p: *u8, n: u64) u64 = { fn elfglobals(buf: *u8, len: u64) *defent = { if (len < EHDR_SIZE) { return nil; }; if (buf[0u64] != 127u8) { return nil; }; - if (buf[1u64] != 69u8) { return nil; }; - if (buf[2u64] != 76u8) { return nil; }; - if (buf[3u64] != 70u8) { return nil; }; + if (buf[1u64] != 'E') { return nil; }; + if (buf[2u64] != 'L') { return nil; }; + if (buf[3u64] != 'F') { return nil; }; let shoff: u64 = rdu64(buf, EHDR_SHOFF); let shnum: u32 = rdu16(buf, EHDR_SHNUM): u32; @@ -344,7 +344,7 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = { let first: u8 = buf[pos]; // Skip the symbol table ('/'), long-name table ('//'), and // any padding entries (NUL or space leading byte). - if (first != 47u8) { if (first != 0u8) { if (first != 32u8) { + if (first != '/') { if (first != 0u8) { if (first != ' ') { let m: *armember = alloc(armember { size = hdrsize })!; let mbs: []u8 = alloc([], hdrsize)!; let mb: *u8 = mbs.ptr; @@ -402,9 +402,9 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = { if (len < EHDR_SIZE) { return -1; }; // magic: 0x7f, 'E', 'L', 'F' if (buf[0u64] != 127u8) { return -1; }; - if (buf[1u64] != 69u8) { return -1; }; - if (buf[2u64] != 76u8) { return -1; }; - if (buf[3u64] != 70u8) { return -1; }; + if (buf[1u64] != 'E') { return -1; }; + if (buf[2u64] != 'L') { return -1; }; + if (buf[3u64] != 'F') { return -1; }; if (buf[4u64] != 2u8) { return -1; }; // ELFCLASS64 if (rdu16(buf, EHDR_TYPE) != ET_REL: u16) { return -1; }; if (rdu16(buf, EHDR_MACHINE) != EM_X86_64: u16) { return -1; };