* remember to update the version in moon.mod when you edit this file


2026.8.24: v0.1.0
    finish x86-64 backend

2026.8.24: v0.2.0
    fix some bug and add some tests

2026.8.28: v0.3.0
    finish wasm backend

2026.9.5: v0.4.0
    finish risc-v64 backend
    
2026.9.5: v0.5.0
    finish wasm stack machine polish and docs

2026.9.13: v0.6.0
    finish loongarch64 (la64, LP64D) backend with data/float-pool emission
    add SSA interpreter (interp package) with builtin runtime and CLI --run
    fix rv64 port: isel write-back, comparison lowering, call cty return
    register encoding, conditional-branch fall-through semantics

2026.9.13: v0.7.0
    finish arm64 (AArch64, AAPCS64 ELF) backend: target constants, ABI
    lowering, instruction selection and GAS emission (emit_arm64)
    byte-exact vs vendor/qbe -t arm64: IR 5684/5684, asm 406/406
    add CLI -t arm64, compile_arm64/compile_arm64_debug API, snapshots and
    docs; make live/spill/rega target-aware (rglob, nrsave, retregs/argregs)


2026.9.19: v0.8.0
    refactor documents
    refactor repo package
    refactor float in backends

2026.9.19: v0.9.0
    rv64: emit data segments and floating-point constant pool byte-identical
    to vendor/qbe -t rv64; thread -G gas settings; unique cross-function labels
    compare.py: diff stderr for debug dumps (the old stdout compare was a no-op)
    debug dumps: drop the export keyword, canonical stage headers, fix phiins
    temp naming (Tmp.bid + single-definition early-out)
    parser errors: qbe:<file>:<line>: format, reference token names and messages
    add tools/check_rv64_asm.py independent RISC-V encodability gate

2026.9.20: v0.10.0
    align with the frozen vendor/qbe reference (ripe-lang master 661ceb2)
    debug dumps: port parse.c typecheck() (operand/jump/undefined-block checks,
    clsmerge); front-end flags now 406/406 on all three targets, differential
    matrix 99.7%
    port simpl.c blit expansion; add blit0/blit1 pseudo-ops, reqz/rnez; rv64
    vararg lowering, aggregate Cptr blobs, compare operand classes
    assembly: .text/.balign/endbr64+hint#34/.p2align/.type/.size/GNU-stack,
    leaf-function %rsp framing, reference fp-constant rodata layout, quoted
    local symbols; amd64 263/336, arm64 252/336, rv64 224/336 byte-identical

2026.9.24: v0.11.0
    complete byte-for-byte alignment with vendor/qbe (661ceb2) on amd64/arm64/rv64
    debug dumps: 12096/12096 (12 flags x 3 targets); emitted assembly:
    1008/1008 (336 compilable tests x 3 targets) byte-identical
    rega: live-out registers mapped before allocation; section-3 bshas guard
    amd64: xsel "mov" suffix, non-leaf frame parity, leaf epilogue addq,
    shift-argument fixarg; arm64: ctoa negated table, Cptr call cty bit;
    rv64: argsclass ngp check, fpstruct field classes, struct-return blobs,
    extension constant class, alloc slots grouped by alignment class
    loadopt: stable phi ordering; CI now gates every debug flag and assembly

2026.9.24: v0.12.0
    compare.py: reference and port now get their own flagsets; -G m maps to the
    matching Mach-O reference target (amd64_apple/arm64_apple) and is skipped
    for targets without one (the blanket amd64_apple mapping was wrong)
    amd64 Mach-O (-G m): byte-identical to vendor/qbe -t amd64_apple (336/336);
    no .type/.size/.note.GNU-stack, __TEXT literal sections, "_" data refs;
    CI gates it
    arm64 Mach-O: labels, sym@page/@pageoff, .balign 4, "_" prefixes and
    literal sections implemented; the Apple ABI (4-byte non-wide stack slots,
    apple_selvastart/apple_selvaarg/apple_extsb) is still pending, so arm64
    -G m is reported but not gated
    docs (en+zh): retract the previously unverified "406/406 (-G e and -G m)"
    
2026.9.24: v0.13.0
    arm64 Mach-O (-G m) now byte-identical to vendor/qbe -t arm64_apple
    (336/336; compare.py 406/406): ported the Apple ABI path -- 4-byte stack
    slots for non-wide scalars (T.apple && !KWIDE), arguments after the
    ellipsis forced to 8-byte stack slots, apple_selvastart/apple_selvaarg,
    no vararg register-save area/slot bias, and a true 16-byte stack align
    (the old stk + (stk & 15) only worked for 8-byte-aligned stacks);
    apple_extsb is a no-op here (no narrow parsb..paruh/argsb..arguh forms)
    CI now gates the Mach-O flavor on both amd64 and arm64

2026.9.25: v0.14.0
    programmatic QBE IL builder (ir_builder) + C ABI (ir_builder_capi,
    include/qbe_builder.h): build IL, print it back, emit arm64 asm / Mach-O
    object / JIT image; C demo (demo/12_builder_capi.c)
    Rust glue layer (rust/, crate qbe-builder) over the C ABI, with a
    Cranelift/inkwell-style API, including an in-memory JIT
    (qbe_jit_load/symbol/global/free; Module::jit / JitModule::get_fn)

2026.9.25: v0.15.0
    in-memory JIT resolves external symbols (libc printf/putchar/malloc/sqrt)
    with dlsym(RTLD_DEFAULT); far calls go through in-image veneers
    (adrp x16; add x16; br x16) and external data addresses are patched in
    place; --run-asm and the C-ABI/Rust JIT all use it
    binary/object/JIT string data now decodes assembler escapes (\n, \t, ...),
    so route B matches route A and demo 11 runs under the JIT

2026.9.25: v0.16.0
    arm64 JIT: external calls use 64-bit veneers (movz/movk x16 + br), removing
    the +/-4GB limit; host callbacks (qbe_jit_symbol_define / Rust
    jit_with_symbols) let JIT code call back into the host; external data
    adrp range is checked
    --run-asm dispatches on the function signature (0..8 integer or 0..8 float
    arguments, result printed by type)

2026.9.25: v0.17.0
    CLI split: --jit is the in-memory JIT (route B, no toolchain, resolves libc
    and host callbacks); --run-asm now assembles/links with clang and runs
    (route A); --clang only selects the clang backend for --emit obj

2026.9.25: v0.18.0
    split the arm64 runtime into three packages: native/ (OS primitives + C
    shim: mmap/mprotect, symbol lookup, temp files, process spawn, dynamic
    linking), jit/ (ExecBlock/JitModule), and run_asm/ (clang route A + wasm
    runner); no behaviour change, tests moved to the matching package

2026.9.25: v0.18.1
    condense the README into a features/status/roadmap list and drop the stale
    differential counters; fix the literal '{entry}' placeholder in the --jit
    argument-count error message

2026.9.25: v0.18.2
    docs: replace the stale 5684/5684 debug-dump counter (measured with 14
    flags) with flag-independent wording in doc/README, doc/guide, doc/abi_arm64
    and their zh versions; test/README: --asm covers 406/406, not 336/336

2026.9.25: v0.19.0
    debug info (line tables): implement the upstream `dbgfile "path"` and
    `dbgloc LINE[,COL]` IL statements; emit `.file <n> "path"` (dedup +
    numbering) and `.loc` in the amd64/arm64/rv64/la64 GAS backends. Output is
    byte-identical to vendor/qbe on every debug flag; `dbgloc` is a no-op for
    --jit/--run-asm/--emit obj/the interpreter. New test/dbg corpus, parser and
    util unit tests, doc/debug_info.md (+zh)

2026.9.25: v0.20.0
    debug info (CFI): new -g/--debug-info flag emits DWARF call-frame
    information for amd64 (push rbp/sub rsp/callee pushes, leave/add rsp) and
    arm64 (stp x29,x30 frame, mov x29,sp, x19..x28/d8..d15 saves), so the
    assembler produces .eh_frame/.debug_frame; off by default, so the plain
    output stays byte-identical to the reference; arm64/amd64 emitter tests
    and doc/debug_info.md (+zh) updated

2026.9.25: v0.21.0
    debug info (compilation unit): -g also emits a minimal DWARF5 CU
    (.debug_abbrev/.debug_info/.debug_addr) covering the module text; the CU's
    low/high PC use DW_FORM_addrx so .debug_info has no Mach-O relocations and
    the linker debug map relocates .debug_addr (same as clang). macOS lldb now
    sets source breakpoints and unwinds from assembly-only objects; ELF/arm64
    verified with llvm-dwarfdump --verify; off by default; docs (+zh) updated

2026.9.25: v0.21.1
    add scripts/run_dbg_demo.sh: emit -g arm64 assembly, link it, and assert
    that lldb sets a source breakpoint and unwinds; wired into the macOS CI job

2026.9.25: v0.21.2
    debug info: emit DWARF4 instead of DWARF5 for the compilation unit; Apple's
    lldb rejects version 5 (the macOS CI smoke test caught it). low/high PC are
    plain DW_FORM_addr values relocated by the linker debug map; .debug_addr is
    gone; verified with llvm-dwarfdump --verify on ELF and Mach-O
