Skip to main content

cljrs_compiler/
lib.rs

1#![allow(clippy::result_large_err)]
2
3//! Program analysis and optimization for clojurust.
4//!
5//! This crate provides:
6//! - **IR** — intermediate representation (ANF/SSA) for analysis
7//! - **ANF lowering** — convert `Form` AST to IR instructions (Rust + Clojure front-ends)
8//! - **Escape analysis** — track value flow and identify non-escaping allocations
9//! - **IR conversion** — Clojure Value data → Rust IR types
10//!
11//! The Clojure front-end (`cljrs.compiler.anf`, `cljrs.compiler.escape`) produces
12//! IR as plain Clojure data. The `ir_convert` module translates this back to the
13//! Rust `IrFunction` structs that `codegen.rs` consumes.
14
15pub mod aot;
16pub mod codegen;
17pub mod escape;
18pub mod ir;
19pub mod rt_abi;
20
21/// Register all compiler Clojure source files as builtin sources in the
22/// given `GlobalEnv`, so that `require` can load them without filesystem access.
23pub fn register_compiler_sources(globals: &std::sync::Arc<cljrs_env::env::GlobalEnv>) {
24    globals.register_builtin_source("cljrs.compiler.ir", cljrs_ir::COMPILER_IR_SOURCE);
25    globals.register_builtin_source("cljrs.compiler.known", cljrs_ir::COMPILER_KNOWN_SOURCE);
26    globals.register_builtin_source("cljrs.compiler.anf", cljrs_ir::COMPILER_ANF_SOURCE);
27    globals.register_builtin_source("cljrs.compiler.escape", cljrs_ir::COMPILER_ESCAPE_SOURCE);
28    globals.register_builtin_source(
29        "cljrs.compiler.optimize",
30        cljrs_ir::COMPILER_OPTIMIZE_SOURCE,
31    );
32}