Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Armillon Damien
infosec-ecomp
Commits
f035ab58
Commit
f035ab58
authored
Mar 06, 2021
by
Armillon Damien
Browse files
rtl is generated
parent
0c2ae178
Changes
3
Show whitespace changes
Inline
Side-by-side
src/cfg_nop_elim.ml
View file @
f035ab58
...
@@ -84,7 +84,13 @@ let nop_elim_fun ({ cfgfunargs; cfgfunbody; cfgentry } as f: cfg_fun) =
...
@@ -84,7 +84,13 @@ let nop_elim_fun ({ cfgfunargs; cfgfunbody; cfgentry } as f: cfg_fun) =
replace_succs
nop_transf
node
replace_succs
nop_transf
node
)
cfgfunbody
in
)
cfgfunbody
in
let
cfgfunbody
=
Hashtbl
.
filter_map
(
fun
n
node
->
let
cfgfunbody
=
Hashtbl
.
filter_map
(
fun
n
node
->
if
(
Set
.
is_empty
(
preds
cfgfunbody
n
))
then
None
else
Some
node
if
(
Set
.
is_empty
(
preds
cfgfunbody
n
))
then
if
n
=
cfgentry
then
match
node
with
|
Cnop
(
n
)
->
Some
node
|
_
->
Some
node
else
Some
node
else
Some
node
)
cfgfunbody
in
)
cfgfunbody
in
(* La fonction renvoyée est composée du nouveau [cfgfunbody] que l'on vient de
(* La fonction renvoyée est composée du nouveau [cfgfunbody] que l'on vient de
calculer, et le point d'entrée est transformé en conséquence. *)
calculer, et le point d'entrée est transformé en conséquence. *)
...
...
src/elang_run.ml
View file @
f035ab58
...
@@ -42,7 +42,7 @@ let rec eval_eexpr st (e : expr) : int res =
...
@@ -42,7 +42,7 @@ let rec eval_eexpr st (e : expr) : int res =
|
Eunop
(
op
,
expr
)
->
eval_eexpr
st
expr
>>=
fun
value
->
OK
(
eval_unop
op
value
)
|
Eunop
(
op
,
expr
)
->
eval_eexpr
st
expr
>>=
fun
value
->
OK
(
eval_unop
op
value
)
|
Evar
(
str
)
->
|
Evar
(
str
)
->
(
match
Hashtbl
.
find_option
env
str
with
(
match
Hashtbl
.
find_option
env
str
with
|
None
->
Error
(
Format
.
sprintf
"variable
not %s found
"
str
)
|
None
->
Error
(
Format
.
sprintf
"
Unknown
variable
%s
\n
"
str
)
|
Some
(
n
)
->
OK
(
n
))
|
Some
(
n
)
->
OK
(
n
))
|
Eint
(
n
)
->
OK
(
n
)
|
Eint
(
n
)
->
OK
(
n
)
...
...
src/rtl_gen.ml
View file @
f035ab58
...
@@ -43,7 +43,21 @@ let find_var (next_reg, var2reg) v =
...
@@ -43,7 +43,21 @@ let find_var (next_reg, var2reg) v =
- [var2reg] est la nouvelle association nom de variable/registre.
- [var2reg] est la nouvelle association nom de variable/registre.
*)
*)
let
rec
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
(
e
:
expr
)
=
let
rec
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
(
e
:
expr
)
=
(
next_reg
,
[]
,
next_reg
,
var2reg
)
match
e
with
|
Eint
(
n
)
->
(
next_reg
,
[
Rconst
(
next_reg
,
n
)]
,
next_reg
+
1
,
var2reg
)
|
Evar
(
str
)
->
let
(
r'
,
next_reg'
,
var2reg'
)
=
find_var
(
next_reg
,
var2reg
)
str
in
(
r'
,
[]
,
next_reg'
,
var2reg'
)
|
Eunop
(
op
,
expr
)
->
let
(
reg'
,
operations'
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
expr
in
(
next_reg'
,
operations'
@
[
Runop
(
op
,
next_reg'
,
reg'
)]
,
next_reg'
+
1
,
var2reg'
)
|
Ebinop
(
op
,
expr1
,
expr2
)
->
let
(
reg
,
operations
,
next_reg
,
var2reg
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
expr1
in
let
(
reg'
,
operations'
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
expr2
in
(
next_reg'
,
operations
@
operations'
@
[
Rbinop
(
op
,
next_reg'
,
reg
,
reg'
)]
,
next_reg'
+
1
,
var2reg'
)
let
is_cmp_op
=
let
is_cmp_op
=
function
Eclt
->
Some
Rclt
function
Eclt
->
Some
Rclt
...
@@ -62,10 +76,24 @@ let rtl_cmp_of_cfg_expr (e: expr) =
...
@@ -62,10 +76,24 @@ let rtl_cmp_of_cfg_expr (e: expr) =
|
Some
rop
->
(
rop
,
e1
,
e2
))
|
Some
rop
->
(
rop
,
e1
,
e2
))
|
_
->
(
Rcne
,
e
,
Eint
0
)
|
_
->
(
Rcne
,
e
,
Eint
0
)
let
rtl_instrs_of_cfg_node
((
next_reg
:
int
)
,
(
var2reg
:
(
string
*
int
)
list
))
(
c
:
cfg_node
)
=
let
rtl_instrs_of_cfg_node
((
next_reg
:
int
)
,
(
var2reg
:
(
string
*
int
)
list
))
(
c
:
cfg_node
)
=
(* TODO *)
match
c
with
([]
,
next_reg
,
var2reg
)
|
Cassign
(
str
,
e
,
s
)
->
let
(
rres
,
l
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
e
in
let
(
rvar
,
next_reg'
,
var2reg'
)
=
find_var
(
next_reg'
,
var2reg'
)
str
in
(*create var register if needed*)
(
l
@
[
Rmov
(
rvar
,
rres
);
Rjmp
(
s
)]
,
next_reg'
,
var2reg'
)
|
Ccmp
(
e
,
s1
,
s2
)
->
let
(
rop
,
e1
,
e2
)
=
rtl_cmp_of_cfg_expr
e
in
let
(
rres1
,
l1
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
e1
in
let
(
rres2
,
l2
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg'
,
var2reg'
)
e2
in
(
l1
@
l2
@
[
Rbranch
(
rop
,
rres1
,
rres2
,
s1
);
Rjmp
(
s2
)]
,
next_reg'
,
var2reg'
)
|
Creturn
(
e
)
->
let
(
rres
,
l
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
e
in
(
l
@
[
Rret
(
rres
)]
,
next_reg'
,
var2reg'
)
|
Cprint
(
e
,
s
)
->
let
(
rres
,
l
,
next_reg'
,
var2reg'
)
=
rtl_instrs_of_cfg_expr
(
next_reg
,
var2reg
)
e
in
(
l
@
[
Rprint
(
rres
);
Rjmp
(
s
)]
,
next_reg'
,
var2reg'
)
|
Cnop
(
s
)
->
([
Rjmp
(
s
)]
,
next_reg
,
var2reg
)
let
rtl_instrs_of_cfg_fun
cfgfunname
({
cfgfunargs
;
cfgfunbody
;
cfgentry
}
:
cfg_fun
)
=
let
rtl_instrs_of_cfg_fun
cfgfunname
({
cfgfunargs
;
cfgfunbody
;
cfgentry
}
:
cfg_fun
)
=
let
(
rargs
,
next_reg
,
var2reg
)
=
let
(
rargs
,
next_reg
,
var2reg
)
=
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment