A work-in-progress LLVM interface for Lean 4.
Inspired by lean-llvm
, which is Copyright (c) 2019 Galois, Inc. and released under the Apache 2.0 license, which can be found here: http://www.apache.org/licenses/LICENSE-2.0.
More documentation will come as development progresses. In fact, the source files are pretty well documented already (if I do say so myself), so feel free to take a look at them.
In addition to Lean/C bindings to LLVM, Papyrus also provides a DSL for writing and interacting with LLVM IR. It is still very much a work-in-progress, but here is a little sample of what it can do at the moment:
import Papyrus
open Papyrus Script
llvm module lean_hello do
declare %lean_object* @lean_mk_string(i8*)
declare %lean_object* @l_IO_println___at_Lean_instEval___spec__1(%lean_object*, %lean_object*)
define i32 @main() do
%hello = call @lean_mk_string("Hello World!"*)
call @l_IO_println___at_Lean_instEval___spec__1(%hello, inttoptr (i32 1 to %lean_object*))
ret i32 0
#dump lean_hello -- Prints the module's IR
#verify lean_hello -- Checks that the IR is valid
#jit lean_hello -- JITs the `main` function
/- #jit:
Hello World
Exited with code 0
-/
Note: To run this code, you will need to provide the PapyrusPlugin
shared library (located at papyrus/plugin/build
after a build) to Lean as a plugin (e.g., by providing --plugin papyrus/plugin/build/PapyrusPlugin
as an argument).