Skip to content

v0.76.0 — madc's first public macOS release

Latest

Choose a tag to compare

@derekbsnider derekbsnider released this 11 Aug 20:13

Release v0.76.0 — 2026-08-11

madc's first public macOS release. The tarballs
(madc-0.76.0-macos-{arm64,x86_64}.tar.gz) run on a header-less Mac —
JIT, packed C/C++ standard-library forest, and native AOT -o that now
covers C and C++ programs — and every byte they embed is
provenance-clean: the darwin C prelude is flattened from Apple's own
APSL/BSD-licensed headers as publicly shipped by the Zig project, with
the binary naming its own prelude input and the release gate refusing
anything else. Underneath sits the release's deepest fix: on AArch64 the
hidden result pointer of a by-value class return rides x8, not the
first argument register, and madc now lets the target place it.

  • Public macOS tarballs (arm64 + x86_64) — stripped, ad-hoc-signed
    hosted binaries carrying the compressed frozen forest (<string>,
    containers, streams, <algorithm> compile straight from the image);
    THIRD_PARTY_NOTICES/ ships the per-file license audit (213 APSL,
    21 BSD, 1 public domain) and the canonical APSL-2.0 text.
  • Darwin AOT for C++madc -static-libmadc -o prog prog.mad
    emits a runnable, self-signed Mach-O executable: the fork's writer
    binds imports flat-namespace when extra dylibs are present, and
    madc puts libc++.1.dylib on the load list whenever the import set
    is Itanium-mangled. Runtime-free C and C-lane-runtime (try/catch,
    VLA) static images were already covered.
  • libmadc_rt for emitted C — the tarballs ship the C-lane runtime
    archive; cc -std=c11 program.c -L<dir>/lib -lmadc_rt -lc++ links
    madc's --emit=c11 output on a stock Mac.
  • The AArch64 indirect-return ABI fix — by-value class returns
    (std::locale, ostringstream::str()) declared their hidden result
    pointer as a first argument, an x86-64-only shape that read garbage
    this pointers on Apple arm64. The parameter is now marked
    (__attribute__((ret_addr))MIR_T_RBLK) and placed per target;
    CirBuilder::retbuf_param is its single producer.
  • Target-neutral emitted C for >16-byte class returns — the
    emit-time pre-pass fuses declaration and call into
    struct __madc_ret_K X = SYM(args);, the one C spelling both ABIs
    compile to the C++ convention.
  • An unprototyped call is not a variadic call (fork) — C89
    implicit-declaration calls now build their proto from the call
    site's promoted argument types; fatal on Apple arm64 before, where
    varargs are stack-banished.
  • Forest fidelity under libc++ — container v39 transports the
    owner-derived Itanium symbol for bound static data members, minted
    __fwd alias tags reach the type arena, __need-protocol servings
    form no husk units, and binding is machine-portable (include-spelling
    path-tail match).
  • Embedded headers rounded outstdint.h is the complete C11
    7.20 surface, #include_next/__has_include_next answer honestly,
    and the glibc __need protocol is honoured through PCH and forest.
  • Compiler fixes surfaced by the lane — file-scope static class
    objects no longer collapse to static int (one type-spec derivation
    for all storage shapes); the --emit lane opens the stdlib-flavor
    runtime before tree build, fixing facet-id externs under libc++.
  • Suite grows to 1019 integration tests (JIT, EXE, OBJ, release,
    packed all 0-failure) and 1015/0 on the libc++ flavor lane; the
    on-Mac evidence battery runs 10 checks (the two fails are the named
    known-opens: groves alias-husk completion, darwin madc::value).

See CHANGELOG.md for full details.