mirror of
https://github.com/leanprover/lean4.git
synced 2026-03-20 20:04:23 +00:00
Compare commits
4 Commits
replaceExp
...
initMacros
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd676a23a2 | ||
|
|
5069c82581 | ||
|
|
404cc2f7a4 | ||
|
|
1466a15a99 |
@@ -19,11 +19,16 @@ open ExplicitBoxing (requiresBoxedVersion mkBoxedName isBoxedName)
|
||||
def leanMainFn := "_lean_main"
|
||||
|
||||
structure Context where
|
||||
env : Environment
|
||||
modName : Name
|
||||
jpMap : JPParamsMap := {}
|
||||
mainFn : FunId := arbitrary
|
||||
mainParams : Array Param := #[]
|
||||
env : Environment
|
||||
modName : Name
|
||||
jpMap : JPParamsMap := {}
|
||||
mainFn : FunId := arbitrary
|
||||
mainParams : Array Param := #[]
|
||||
/- We are regularly hitting the maximum number of symbols exportable from a Windows DLL/PE (2^16).
|
||||
See issue #466. So, to save symbols, we create initialization macros instead of initialization functions
|
||||
for extracted close terms. This is a bit hackish, but after we refactor the compiler we will seldom need
|
||||
initialization functions and we will be able to remove this hack. -/
|
||||
initMacro? : Option String := none
|
||||
|
||||
abbrev M := ReaderT Context (EStateM String String)
|
||||
|
||||
@@ -35,11 +40,19 @@ def getDecl (n : Name) : M Decl := do
|
||||
| some d => pure d
|
||||
| none => throw s!"unknown declaration '{n}'"
|
||||
|
||||
@[inline] def emit {α : Type} [ToString α] (a : α) : M Unit :=
|
||||
def emit {α : Type} [ToString α] (a : α) : M Unit :=
|
||||
modify fun out => out ++ toString a
|
||||
|
||||
@[inline] def emitLn {α : Type} [ToString α] (a : α) : M Unit := do
|
||||
emit a; emit "\n"
|
||||
def emitLn {α : Type} [ToString α] (a : α) : M Unit := do
|
||||
emit a;
|
||||
if let some _ := (← read).initMacro? then
|
||||
emit "\\"
|
||||
emit "\n"
|
||||
|
||||
def emitJP (j : JoinPointId) : M Unit := do
|
||||
match (← read).initMacro? with
|
||||
| some macroName => emit macroName; emit "_"; emit j
|
||||
| _ => emit j
|
||||
|
||||
def emitLns {α : Type} [ToString α] (as : List α) : M Unit :=
|
||||
as.forM fun a => emitLn a
|
||||
@@ -311,7 +324,7 @@ def emitJmp (j : JoinPointId) (xs : Array Arg) : M Unit := do
|
||||
let p := ps[i]
|
||||
let x := xs[i]
|
||||
emit p.x; emit " = "; emitArg x; emitLn ";"
|
||||
emit "goto "; emit j; emitLn ";"
|
||||
emit "goto "; emitJP j; emitLn ";"
|
||||
|
||||
def emitLhs (z : VarId) : M Unit := do
|
||||
emit z; emit " = "
|
||||
@@ -604,13 +617,16 @@ partial def emitBlock (b : FnBody) : M Unit := do
|
||||
| FnBody.uset x i y b => emitUSet x i y; emitBlock b
|
||||
| FnBody.sset x i o y t b => emitSSet x i o y t; emitBlock b
|
||||
| FnBody.mdata _ b => emitBlock b
|
||||
| FnBody.ret x => emit "return "; emitArg x; emitLn ";"
|
||||
| FnBody.case _ x xType alts => emitCase x xType alts
|
||||
| FnBody.jmp j xs => emitJmp j xs
|
||||
| FnBody.unreachable => emitLn "lean_internal_panic_unreachable();"
|
||||
| FnBody.ret x =>
|
||||
match (← read).initMacro? with
|
||||
| some macroName => emit "__INIT_VAR__ = "; emitArg x; emit "; goto "; emit macroName; emitLn "_end;"
|
||||
| none => emit "return "; emitArg x; emitLn ";"
|
||||
|
||||
partial def emitJPs : FnBody → M Unit
|
||||
| FnBody.jdecl j xs v b => do emit j; emitLn ":"; emitFnBody v; emitJPs b
|
||||
| FnBody.jdecl j xs v b => do emitJP j; emitLn ":"; emitFnBody v; emitJPs b
|
||||
| e => do unless e.isTerminal do emitJPs e.body
|
||||
|
||||
partial def emitFnBody (b : FnBody) : M Unit := do
|
||||
@@ -631,10 +647,8 @@ def emitDeclAux (d : Decl) : M Unit := do
|
||||
match d with
|
||||
| Decl.fdecl (f := f) (xs := xs) (type := t) (body := b) .. =>
|
||||
let baseName ← toCName f;
|
||||
if xs.size == 0 then
|
||||
emit "static "
|
||||
emit (toCType t); emit " ";
|
||||
if xs.size > 0 then
|
||||
emit (toCType t); emit " ";
|
||||
emit baseName;
|
||||
emit "(";
|
||||
if xs.size > closureMaxArgs && isBoxedName d.name then
|
||||
@@ -645,16 +659,19 @@ def emitDeclAux (d : Decl) : M Unit := do
|
||||
let x := xs[i]
|
||||
emit (toCType x.ty); emit " "; emit x.x
|
||||
emit ")"
|
||||
emitLn " {";
|
||||
if xs.size > closureMaxArgs && isBoxedName d.name then
|
||||
xs.size.forM fun i => do
|
||||
let x := xs[i]
|
||||
emit "lean_object* "; emit x.x; emit " = _args["; emit i; emitLn "];"
|
||||
emitLn "_start:";
|
||||
withReader (fun ctx => { ctx with mainFn := f, mainParams := xs }) (emitFnBody b);
|
||||
emitLn "}"
|
||||
else
|
||||
emit ("_init_" ++ baseName ++ "()")
|
||||
emitLn " {";
|
||||
if xs.size > closureMaxArgs && isBoxedName d.name then
|
||||
xs.size.forM fun i => do
|
||||
let x := xs[i]
|
||||
emit "lean_object* "; emit x.x; emit " = _args["; emit i; emitLn "];"
|
||||
emitLn "_start:";
|
||||
withReader (fun ctx => { ctx with mainFn := f, mainParams := xs }) (emitFnBody b);
|
||||
emitLn "}"
|
||||
emit "#define ";
|
||||
emitLn ("_init_" ++ baseName ++ "(__INIT_VAR__) { \\")
|
||||
withReader (fun ctx => { ctx with initMacro? := baseName }) do emitFnBody b
|
||||
emit baseName; emit "_end: ((void) 0);"; emitLn "}"
|
||||
| _ => pure ()
|
||||
|
||||
def emitDecl (d : Decl) : M Unit := do
|
||||
@@ -691,7 +708,7 @@ def emitDeclInit (d : Decl) : M Unit := do
|
||||
emitMarkPersistent d n
|
||||
emitLn "lean_dec_ref(res);"
|
||||
| _ =>
|
||||
emitCName n; emit " = "; emitCInitName n; emitLn "();"; emitMarkPersistent d n
|
||||
emitCInitName n; emit "("; emitCName n; emitLn ");"; emitMarkPersistent d n
|
||||
|
||||
def emitInitFn : M Unit := do
|
||||
let env ← getEnv
|
||||
|
||||
BIN
stage0/src/CMakeLists.txt
generated
BIN
stage0/src/CMakeLists.txt
generated
Binary file not shown.
BIN
stage0/src/Init/Data/String/Basic.lean
generated
BIN
stage0/src/Init/Data/String/Basic.lean
generated
Binary file not shown.
BIN
stage0/src/Init/System/IO.lean
generated
BIN
stage0/src/Init/System/IO.lean
generated
Binary file not shown.
BIN
stage0/src/Init/System/Platform.lean
generated
BIN
stage0/src/Init/System/Platform.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Compiler/IR/EmitC.lean
generated
BIN
stage0/src/Lean/Compiler/IR/EmitC.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Elab/Command.lean
generated
BIN
stage0/src/Lean/Elab/Command.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Elab/PreDefinition/Structural.lean
generated
BIN
stage0/src/Lean/Elab/PreDefinition/Structural.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Elab/Tactic/Basic.lean
generated
BIN
stage0/src/Lean/Elab/Tactic/Basic.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Elab/Term.lean
generated
BIN
stage0/src/Lean/Elab/Term.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Elab/Util.lean
generated
BIN
stage0/src/Lean/Elab/Util.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/KeyedDeclsAttribute.lean
generated
BIN
stage0/src/Lean/KeyedDeclsAttribute.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Meta/IndPredBelow.lean
generated
BIN
stage0/src/Lean/Meta/IndPredBelow.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/Meta/Match/Match.lean
generated
BIN
stage0/src/Lean/Meta/Match/Match.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/PrettyPrinter/Delaborator/Basic.lean
generated
BIN
stage0/src/Lean/PrettyPrinter/Delaborator/Basic.lean
generated
Binary file not shown.
BIN
stage0/src/Lean/PrettyPrinter/Delaborator/Builtins.lean
generated
BIN
stage0/src/Lean/PrettyPrinter/Delaborator/Builtins.lean
generated
Binary file not shown.
BIN
stage0/src/bin/leanc.in
generated
BIN
stage0/src/bin/leanc.in
generated
Binary file not shown.
BIN
stage0/src/lean.mk.in
generated
BIN
stage0/src/lean.mk.in
generated
Binary file not shown.
BIN
stage0/src/library/compiler/ir_interpreter.cpp
generated
BIN
stage0/src/library/compiler/ir_interpreter.cpp
generated
Binary file not shown.
BIN
stage0/src/runtime/io.cpp
generated
BIN
stage0/src/runtime/io.cpp
generated
Binary file not shown.
BIN
stage0/src/runtime/platform.cpp
generated
BIN
stage0/src/runtime/platform.cpp
generated
Binary file not shown.
BIN
stage0/src/runtime/stack_overflow.cpp
generated
BIN
stage0/src/runtime/stack_overflow.cpp
generated
Binary file not shown.
BIN
stage0/src/shell/CMakeLists.txt
generated
BIN
stage0/src/shell/CMakeLists.txt
generated
Binary file not shown.
BIN
stage0/src/shell/lean.cpp
generated
BIN
stage0/src/shell/lean.cpp
generated
Binary file not shown.
BIN
stage0/src/stdlib.make.in
generated
BIN
stage0/src/stdlib.make.in
generated
Binary file not shown.
BIN
stage0/stdlib/CMakeLists.txt
generated
BIN
stage0/stdlib/CMakeLists.txt
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Classical.c
generated
BIN
stage0/stdlib/Init/Classical.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Coe.c
generated
BIN
stage0/stdlib/Init/Coe.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/Basic.c
generated
BIN
stage0/stdlib/Init/Control/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/EState.c
generated
BIN
stage0/stdlib/Init/Control/EState.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/Except.c
generated
BIN
stage0/stdlib/Init/Control/Except.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/ExceptCps.c
generated
BIN
stage0/stdlib/Init/Control/ExceptCps.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/Id.c
generated
BIN
stage0/stdlib/Init/Control/Id.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/Option.c
generated
BIN
stage0/stdlib/Init/Control/Option.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/Reader.c
generated
BIN
stage0/stdlib/Init/Control/Reader.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/StateCps.c
generated
BIN
stage0/stdlib/Init/Control/StateCps.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Control/StateRef.c
generated
BIN
stage0/stdlib/Init/Control/StateRef.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Core.c
generated
BIN
stage0/stdlib/Init/Core.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Array/Basic.c
generated
BIN
stage0/stdlib/Init/Data/Array/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Array/Subarray.c
generated
BIN
stage0/stdlib/Init/Data/Array/Subarray.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/ByteArray/Basic.c
generated
BIN
stage0/stdlib/Init/Data/ByteArray/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Char/Basic.c
generated
BIN
stage0/stdlib/Init/Data/Char/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Float.c
generated
BIN
stage0/stdlib/Init/Data/Float.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/FloatArray/Basic.c
generated
BIN
stage0/stdlib/Init/Data/FloatArray/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Format/Basic.c
generated
BIN
stage0/stdlib/Init/Data/Format/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Format/Instances.c
generated
BIN
stage0/stdlib/Init/Data/Format/Instances.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Format/Macro.c
generated
BIN
stage0/stdlib/Init/Data/Format/Macro.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Format/Syntax.c
generated
BIN
stage0/stdlib/Init/Data/Format/Syntax.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Int/Basic.c
generated
BIN
stage0/stdlib/Init/Data/Int/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/List/Basic.c
generated
BIN
stage0/stdlib/Init/Data/List/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/List/BasicAux.c
generated
BIN
stage0/stdlib/Init/Data/List/BasicAux.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/List/Control.c
generated
BIN
stage0/stdlib/Init/Data/List/Control.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Nat/Bitwise.c
generated
BIN
stage0/stdlib/Init/Data/Nat/Bitwise.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Nat/Div.c
generated
BIN
stage0/stdlib/Init/Data/Nat/Div.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Option/Basic.c
generated
BIN
stage0/stdlib/Init/Data/Option/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Option/BasicAux.c
generated
BIN
stage0/stdlib/Init/Data/Option/BasicAux.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Ord.c
generated
BIN
stage0/stdlib/Init/Data/Ord.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Random.c
generated
BIN
stage0/stdlib/Init/Data/Random.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Range.c
generated
BIN
stage0/stdlib/Init/Data/Range.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/Repr.c
generated
BIN
stage0/stdlib/Init/Data/Repr.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/String/Basic.c
generated
BIN
stage0/stdlib/Init/Data/String/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/String/Extra.c
generated
BIN
stage0/stdlib/Init/Data/String/Extra.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/ToString/Basic.c
generated
BIN
stage0/stdlib/Init/Data/ToString/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/ToString/Macro.c
generated
BIN
stage0/stdlib/Init/Data/ToString/Macro.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Data/UInt.c
generated
BIN
stage0/stdlib/Init/Data/UInt.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Meta.c
generated
BIN
stage0/stdlib/Init/Meta.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Notation.c
generated
BIN
stage0/stdlib/Init/Notation.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/NotationExtra.c
generated
BIN
stage0/stdlib/Init/NotationExtra.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Prelude.c
generated
BIN
stage0/stdlib/Init/Prelude.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/SizeOf.c
generated
BIN
stage0/stdlib/Init/SizeOf.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/System/FilePath.c
generated
BIN
stage0/stdlib/Init/System/FilePath.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/System/IO.c
generated
BIN
stage0/stdlib/Init/System/IO.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/System/IOError.c
generated
BIN
stage0/stdlib/Init/System/IOError.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/System/Platform.c
generated
BIN
stage0/stdlib/Init/System/Platform.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/System/ST.c
generated
BIN
stage0/stdlib/Init/System/ST.c
generated
Binary file not shown.
BIN
stage0/stdlib/Init/Util.c
generated
BIN
stage0/stdlib/Init/Util.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Attributes.c
generated
BIN
stage0/stdlib/Lean/Attributes.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/AuxRecursor.c
generated
BIN
stage0/stdlib/Lean/AuxRecursor.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Class.c
generated
BIN
stage0/stdlib/Lean/Class.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/BorrowedAnnotation.c
generated
BIN
stage0/stdlib/Lean/Compiler/BorrowedAnnotation.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/ClosedTermCache.c
generated
BIN
stage0/stdlib/Lean/Compiler/ClosedTermCache.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/ConstFolding.c
generated
BIN
stage0/stdlib/Lean/Compiler/ConstFolding.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/ExportAttr.c
generated
BIN
stage0/stdlib/Lean/Compiler/ExportAttr.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/ExternAttr.c
generated
BIN
stage0/stdlib/Lean/Compiler/ExternAttr.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/Basic.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/Basic.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/Borrow.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/Borrow.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/Boxing.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/Boxing.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/Checker.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/Checker.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/CompilerM.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/CompilerM.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/CtorLayout.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/CtorLayout.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/ElimDeadBranches.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/ElimDeadBranches.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/EmitC.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/EmitC.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/EmitUtil.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/EmitUtil.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/ExpandResetReuse.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/ExpandResetReuse.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/Format.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/Format.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/FreeVars.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/FreeVars.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/LiveVars.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/LiveVars.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/NormIds.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/NormIds.c
generated
Binary file not shown.
BIN
stage0/stdlib/Lean/Compiler/IR/RC.c
generated
BIN
stage0/stdlib/Lean/Compiler/IR/RC.c
generated
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user