Developer documentation

These pages are for people changing RepliBuild, not for people wrapping a library. The user manual is the rest of this site, starting at Home.

The architecture essays below are conserved from the previous manual. They are deliberately not on the user path.

Architecture

PageWhat it is
ABI marshalling as compiler IRThe JLCS dialect: why marshalling is compiled, the thunk contract, the op reference, SysV lowering, gdb inside generated MLIR
The inheritance ABIMental model for MI and virtual inheritance: upcast helpers, class-local vcall
Internals & dispatchPipeline stages, the three calling paths, module-by-module map
Tier 1 (experimental)Per-function llvmcall slices, and why whole-module enable_lto stays off

In the repository, not on this site

PathWhat it is
docs/updates/Dated engineering notes (MI/vcall, virtual inheritance, audits, release write-ups)
CHANGELOG.mdFull version history
CLAUDE.mdContributor operating notes: API, ingest doctrine, Hub rules, known-unbuilt ledger

Tests

julia --project=. test/runtests.jl     # CI suite, no C++ toolchain
julia --project=. test/devtests.jl     # full integration, needs the C++ bucket

Dialect and ABI truth lives in test/test_mlir_templates.jl, test/test_jlcs_invariants.jl, test/test_jlcs_producers.jl, test/test_struct_abi.jl, test/mi_test/, test/vi_test/.

Debugging a generated thunk

D = RepliBuild.Debug
D.thunks("path/to/project")
D.walk("path/to/project", "some_symbol_thunk")    # dialect + asm

ENV["REPLIBUILD_JIT_OBJDUMP"] = "1" must be set before the wrapper loads for the disassembly path. gdb inside the emitted MLIR: Debugging a thunk.