Commit graph

85 commits

Author SHA1 Message Date
Leonardo de Moura
224fdc7a78 refactor(library/init/lean/ir): platform dependent IR
Motivation: in 64-bit machines, we can store boxed uint32 values as a
tagged pointer. In 32-bit machines, we need to allocated an object (like
Haskell) to store the uint32 value. So, the generated bytecode is quite
different in each platform.

This change also allow us to simplify the IR. Example: we don't need the
type `sizet` anymore.

Impact: To be able to bootstrap in both platforms,
we will have to store two versions of the generated code: 32 and 64
versions. In principle, we only need to store the 64-bit version,
and use cross-compilation to build the 32-bit version.
2018-05-10 13:15:02 -07:00
Leonardo de Moura
552ca3bb11 feat(library/init/lean/ir): allow uint32 in case instruction 2018-05-10 12:56:55 -07:00
Leonardo de Moura
ad61772c72 feat(library/init/lean/ir): add is_null
We will use this instruction for compiling inductive datatypes such as
`option A` where `A` is represented as an `object`.
In this case, we can represent `some a` as `a` (without any extra memory
allocation), and `none` as the null pointer.
2018-05-10 12:47:44 -07:00
Leonardo de Moura
aba3d08372 fix(library/init/lean/ir/extract_cpp): minor fixes 2018-05-10 10:54:43 -07:00
Leonardo de Moura
9a261975f7 chore(library/init/lean/ir/extract_cpp): cleanup 2018-05-10 10:28:30 -07:00
Leonardo de Moura
e882d9d7cf feat(library/init/lean/ir): add array_size, sarray_size and string_len 2018-05-10 10:02:16 -07:00
Leonardo de Moura
68458aa97b refactor(library/init/lean/ir): array operations 2018-05-10 09:52:00 -07:00
Leonardo de Moura
4862da3fca feat(library/init/lean/ir): add array_pop and sarray_pop 2018-05-10 09:24:48 -07:00
Leonardo de Moura
f1535121b9 refactor(library/init/lean/ir): combine unary instructions 2018-05-10 09:19:13 -07:00
Leonardo de Moura
655cfbf3b0 refactor(library/init/lean/ir): read and sread instructions are now binop 2018-05-10 08:47:16 -07:00
Leonardo de Moura
7b89a8c910 chore(library/init/lean/ir): copy_array ==> array_copy, copy_sarray ==> sarray_copy 2018-05-10 08:36:33 -07:00
Leonardo de Moura
d2c4918ca3 chore(library/init/lean/ir): shared ==> is_shared, scalar ==> is_scalar 2018-05-10 08:30:28 -07:00
Leonardo de Moura
2e0629133f feat(library/init/lean/ir): add emit_lit 2018-05-09 18:29:54 -07:00
Leonardo de Moura
fc840eab3f feat(library/init/lean/ir): add emit_unop 2018-05-09 18:20:46 -07:00
Leonardo de Moura
c7153f7661 chore(library/init/lean/ir/extract_cpp): cleanup 2018-05-09 18:03:00 -07:00
Leonardo de Moura
9345765815 feat(library/init/lean/ir/extract_cpp): start IR => C++ extractor 2018-05-09 17:47:55 -07:00
Leonardo de Moura
7d196f58c3 chore(library/init/lean/ir): remove ashr 2018-05-09 17:43:25 -07:00
Leonardo de Moura
5baae4724f feat(library/init/lean/ir): distinguish free and dealloc 2018-05-09 17:43:12 -07:00
Leonardo de Moura
3be7540efe chore(library/init): use mfor instead of mmap' 2018-05-09 15:41:53 -07:00
Leonardo de Moura
6368d0c5f6 chore(library/init/lean/name_mangling): allow custom prefix when mangling names 2018-05-09 15:01:12 -07:00
Leonardo de Moura
0c0972f317 feat(library/init/lean): name mangling 2018-05-09 09:19:32 -07:00
Leonardo de Moura
3f883bd949 chore(library/init/lean/parser/parser): add monad_fail instance 2018-05-09 09:19:14 -07:00
Leonardo de Moura
874f9caf13 feat(library/init/control/state): modify monad_run instance for state_t
@Kha, I was having to use `(run ...).1` in many places
in my code. So, I changed the instance
```
instance (σ m out) [monad_run out m] : monad_run (λ α, σ → out (α × σ)) (state_t σ m) :=
⟨λ α x, run ∘ (λ σ, x.run σ)⟩
```
to
```
instance (σ : Type u) (m out : Type u → Type v) [functor m] [monad_run out m] : monad_run (λ α, σ → out α) (state_t σ m) :=
⟨λ α x, run ∘ (λ σ, prod.fst <$> (x.run σ))⟩
```
If we want to get the resultant state in an action `act`, we can just
use `run (act >> get) init_state`.
2018-05-08 17:32:54 -07:00
Leonardo de Moura
b0641ba770 feat(frontends/lean/elaborator): add support for definitions such as monad_run.run
cc @Kha
2018-05-08 17:14:52 -07:00
Leonardo de Moura
ab39ef261d refactor(library/init/lean/ir/ssa_check): use format instead of blockid_error 2018-05-08 15:47:02 -07:00
Leonardo de Moura
60a275a464 chore(library/init/lean/ir/elim_phi): use idiom: define run for every monad 2018-05-08 15:46:30 -07:00
Leonardo de Moura
7f85f0893c refactor(library/init/lean/ir): cleanup 2018-05-08 15:38:43 -07:00
Leonardo de Moura
00147df082 chore(library/init/lean/ir/ssa_check): use format for error messages 2018-05-08 14:50:58 -07:00
Leonardo de Moura
9373133800 chore(library/init/lean/ir/type_check): cleanup 2018-05-08 14:50:28 -07:00
Leonardo de Moura
e40f37b08e feat(library/init/lean/ir): add type checker 2018-05-07 18:07:04 -07:00
Leonardo de Moura
f7c4134452 refactor(library/init/lean/ir): we can use the cast instruction for boxing/unboxing 2018-05-07 18:07:04 -07:00
Leonardo de Moura
79f351d177 fix(library/init/lean/ir): parser and test 2018-05-07 18:07:04 -07:00
Leonardo de Moura
0a9bd8caa8 chore(library/init/lean/ir): improve sizet syntax 2018-05-07 18:07:04 -07:00
Leonardo de Moura
e6b509781f feat(library/init/lean/ir/ir): platform independent object size and offset 2018-05-07 18:07:04 -07:00
Leonardo de Moura
883f6923e2 chore(library/init/lean/ir/elim_phi): fix typo 2018-05-06 10:15:17 -07:00
Leonardo de Moura
88082cd16d fix(library/init/lean/ir/parser): case 2018-05-06 10:11:58 -07:00
Leonardo de Moura
e2e124626f feat(library/init/lean/ir): add elim_phi function 2018-05-06 10:07:44 -07:00
Leonardo de Moura
89b4bb7210 feat(library/init/data/hashable): add hashable nat instance 2018-05-06 07:53:29 -07:00
Leonardo de Moura
3079d2d007 feat(library/init/lean/name): add hashable instance 2018-05-06 07:49:17 -07:00
Leonardo de Moura
e64cb10ded feat(library/init): add hashable type class 2018-05-05 20:48:57 -07:00
Leonardo de Moura
d5fe509c36 chore(*): remove end after each match-expression
`end` is not optional anymore
2018-05-04 11:30:06 -07:00
Leonardo de Moura
11a8a7c4f3 feat(library/init): use usize instead of uint32 in the low level array access primitives 2018-05-04 10:40:14 -07:00
Leonardo de Moura
af4f831a9f feat(library/init/data/hashmap): hash function produces an uint32 instead of nat
Most efficient hash functions use uint32/uint64 and produce values
that do not fit in out small nat representation. Thus, GMP big numbers
would have to be created.
2018-05-03 17:56:10 -07:00
Leonardo de Moura
82bf618972 feat(library/init/lean/disjoint_set): disjoint sets
We need this datastructure to eliminate phi nodes from the IR.
The phi nodes need to be eliminated when mapping to C++ and/or
interpreting the IR.
2018-05-02 22:24:33 -07:00
Leonardo de Moura
bf71068b14 feat(library/init/lean/ir): parse IR definitions 2018-05-02 16:59:50 -07:00
Leonardo de Moura
0d49ae3f69 feat(library/init/lean/parser): add not_followed_by and not_followed_by_sat
The new parsers are useful to implement the longest match rule.
2018-05-02 15:55:57 -07:00
Leonardo de Moura
beae2d936b chore(library/init/lean/ir/parser): remove leftover 2018-05-02 12:44:23 -07:00
Leonardo de Moura
f44bfb3e59 feat(library/init/lean/parser/parser): use dlist to implement expected messages
The idiom `p1 <|> p2 <|> ... <|> pn` generates many append operations.
`dlist` provides an O(1) append.
2018-05-02 12:43:21 -07:00
Leonardo de Moura
4d6cbf62a2 refactor(library/init/lean/parser/parser): we don't need to store the whole message in ok_eps
In the original parsec paper, they store messages in OK silent/epsilon
results too. This is not necessary, we only need the "expected" field
for the `ok_eps` constructor.
2018-05-02 11:37:57 -07:00
Leonardo de Moura
6e2ebb5fab feat(library/init/lean/ir): add IR instruction parser 2018-05-01 17:45:50 -07:00