lean4-htt/src/Lean/Compiler/LCNF.lean
Henrik Böving 52b1b342ab
feat: zero cost BaseIO (#10625)
This PR implements zero cost `BaseIO` by erasing the `IO.RealWorld`
parameter from argument lists and structures. This is a **major breaking
change for FFI**.

Concretely:
- `BaseIO` is defined in terms of `ST IO.RealWorld`
- `EIO` (and thus `IO`) is defined in terms of `EST IO.RealWorld`
- The opaque `Void` type is introduced and the trivial structure
optimization updated to account for it. Furthermore, arguments of type
`Void s` are removed from the argument lists of the C functions.
- `ST` is redefined as `Void s -> ST.Out s a` where `ST.Out` is a pair
of `Void s` and `a`

This together has the following major effects on our generated code:
- Functions that return `BaseIO`/`ST`/`EIO`/`IO`/`EST` now do not take
the dummy world parameter anymore. To account for this FFI code needs to
delete the dummy world parameter from the argument lists.
- Functions that return `BaseIO`/`ST` now return their wrapped value
directly. In particular `BaseIO UInt32` now returns a `uint32_t` instead
of a `lean_object*`. To account for this FFI code might have to change
the return type and does not need to call `lean_io_result_mk_ok` anymore
but can instead just `return` values right away (same with extracting
values from `BaseIO` computations.
- Functions that return `EIO`/`IO`/`EST` now only return the equivalent
of an `Except` node which reduces the allocation size. The
`lean_io_result_mk_ok`/`lean_io_result_mk_error` functions were updated
to account for this already so no change is required.

Besides improving performance by dropping allocation (sizes) we can now
also do fun new things such as:
```lean
@[extern "malloc"]
opaque malloc (size : USize) : BaseIO USize
```
2025-10-22 10:55:12 +02:00

47 lines
1.8 KiB
Text

/-
Copyright (c) 2022 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
module
prelude
public import Lean.Compiler.LCNF.AlphaEqv
public import Lean.Compiler.LCNF.Basic
public import Lean.Compiler.LCNF.Bind
public import Lean.Compiler.LCNF.Check
public import Lean.Compiler.LCNF.CompilerM
public import Lean.Compiler.LCNF.CSE
public import Lean.Compiler.LCNF.DependsOn
public import Lean.Compiler.LCNF.ElimDead
public import Lean.Compiler.LCNF.FixedParams
public import Lean.Compiler.LCNF.InferType
public import Lean.Compiler.LCNF.JoinPoints
public import Lean.Compiler.LCNF.LCtx
public import Lean.Compiler.LCNF.Level
public import Lean.Compiler.LCNF.Main
public import Lean.Compiler.LCNF.Passes
public import Lean.Compiler.LCNF.PassManager
public import Lean.Compiler.LCNF.PhaseExt
public import Lean.Compiler.LCNF.PrettyPrinter
public import Lean.Compiler.LCNF.PullFunDecls
public import Lean.Compiler.LCNF.PullLetDecls
public import Lean.Compiler.LCNF.ReduceJpArity
public import Lean.Compiler.LCNF.Simp
public import Lean.Compiler.LCNF.Specialize
public import Lean.Compiler.LCNF.SpecInfo
public import Lean.Compiler.LCNF.Testing
public import Lean.Compiler.LCNF.ToDecl
public import Lean.Compiler.LCNF.ToExpr
public import Lean.Compiler.LCNF.ToLCNF
public import Lean.Compiler.LCNF.Types
public import Lean.Compiler.LCNF.Util
public import Lean.Compiler.LCNF.ConfigOptions
public import Lean.Compiler.LCNF.MonoTypes
public import Lean.Compiler.LCNF.ToMono
public import Lean.Compiler.LCNF.MonadScope
public import Lean.Compiler.LCNF.Closure
public import Lean.Compiler.LCNF.LambdaLifting
public import Lean.Compiler.LCNF.ReduceArity
public import Lean.Compiler.LCNF.Probing
public import Lean.Compiler.LCNF.Irrelevant