Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
infosec-ecomp
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
cidre-public
Compilation
infosec-ecomp
Commits
ab96f24f
Commit
ab96f24f
authored
5 years ago
by
Wilke Pierre
Browse files
Options
Downloads
Patches
Plain Diff
Sujet TP - CFG - Vivacité - Élimination de code mort
parent
a9b39aaf
No related branches found
No related tags found
No related merge requests found
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
Sujet.pdf
+0
-0
0 additions, 0 deletions
Sujet.pdf
src/cfg_dead_assign.ml
+16
-5
16 additions, 5 deletions
src/cfg_dead_assign.ml
src/cfg_liveness.ml
+25
-31
25 additions, 31 deletions
src/cfg_liveness.ml
src/e_regexp.ml
+1
-1
1 addition, 1 deletion
src/e_regexp.ml
src/test_lexer.ml
+3
-9
3 additions, 9 deletions
src/test_lexer.ml
with
45 additions
and
46 deletions
Sujet.pdf
+
0
−
0
View file @
ab96f24f
No preview for this file type
This diff is collapsed.
Click to expand it.
src/cfg_dead_assign.ml
+
16
−
5
View file @
ab96f24f
...
...
@@ -3,21 +3,32 @@ open Cfg
open
Prog
open
Utils
open
Cfg_liveness
(* Dead Assign Elimination *)
(* [dead_assign_elimination_fun f] performs DAE on function [f]. *)
(* Dead Assign Elimination -- Élimination des affectations mortes *)
(* [dead_assign_elimination_fun f] élimine les affectations mortes dans la
function [f]. Cette fonction renvoie un couple [(f',c)] oú [f'] est la
nouvelle fonction, et [c] est un booléen qui indique si du progrès a été
fait. *)
let
dead_assign_elimination_fun
({
cfgfunargs
;
cfgfunbody
;
cfgentry
}
as
f
:
cfg_fun
)
=
let
changed
=
ref
false
in
let
cfgfunbody
=
Hashtbl
.
map
(
fun
(
n
:
int
)
(
m
:
cfg_node
)
->
match
m
with
(* TODO *)
|
_
->
m
)
cfgfunbody
in
{
f
with
cfgfunbody
}
({
f
with
cfgfunbody
}
,
!
changed
)
(* Applique l'élimination de code mort autant de fois que nécessaire. Testez
notamment sur le fichier de test [basic/useless_assigns.e]. *)
let
rec
iter_dead_assign_elimination_fun
f
=
let
f
,
c
=
dead_assign_elimination_fun
f
in
(* TODO *)
f
let
dead_assign_elimination_gdef
=
function
Gfun
f
->
Gfun
(
dead_assign_elimination_fun
f
)
Gfun
f
->
Gfun
(
iter_
dead_assign_elimination_fun
f
)
let
dead_assign_elimination
p
=
assoc_map
dead_assign_elimination_gdef
p
This diff is collapsed.
Click to expand it.
src/cfg_liveness.ml
+
25
−
31
View file @
ab96f24f
...
...
@@ -3,48 +3,42 @@ open Cfg
open
Prog
open
Utils
(*
Liveness analysis
*)
(*
Analyse de vivacité
*)
(* [vars_in_expr e] re
turns the set of
variables app
e
ar
ing in
[e]. *)
(* [vars_in_expr e] re
nvoie l'ensemble des
variables
qui
appar
aissent dans
[e]. *)
let
rec
vars_in_expr
(
e
:
expr
)
=
(* TODO *)
Set
.
empty
(* [live_cfg_node node live_after] gives the set of variables live before the
node [node], given the set [live_after] of variables live after this node. *)
(* [live_cfg_node node live_after] renvoie l'ensemble des variables vivantes
avant un nœud [node], étant donné l'ensemble [live_after] des variables
vivantes après ce nœud. *)
let
live_cfg_node
(
node
:
cfg_node
)
(
live_after
:
string
Set
.
t
)
=
(* TODO *)
live_after
(*
Computes the set of live
variables
af
te
r
a
node [n] in a CFG [cfg].
[lives] is a mapping from CFG node identifier to the set of variables that
are live before this node.
*)
(*
[live_after_node cfg n] renvoie l'ensemble des
variables
vivan
te
s
a
près le
nœud [n] dans un CFG [cfg]. [lives] est l'état courant de l'analyse,
c'est-à-dire une table dont les clés sont des identifiants de nœuds du CFG et
les valeurs sont les ensembles de variables vivantes avant chaque nœud.
*)
let
live_after_node
cfg
n
(
lives
:
(
int
,
string
Set
.
t
)
Hashtbl
.
t
)
:
string
Set
.
t
=
(* TODO *)
Set
.
empty
(* [live_cfg_nodes cfg lives]
makes o
ne it
e
ration
of the fixpoint computation
.
(* [live_cfg_nodes cfg lives]
effectue u
ne it
é
ration
du calcul de point fixe
.
This returns a boolean that is true if some progress has been made in this
iteration (the set of variables live at at least one node has changed), false
otherwise. *)
Cette fonction met à jour l'état de l'analyse [lives] et renvoie un booléen
qui indique si le calcul a progressé durant cette itération (i.e. s'il existe
au moins un nœud n pour lequel l'ensemble des variables vivantes avant ce
nœud a changé). *)
let
live_cfg_nodes
cfg
(
lives
:
(
int
,
string
Set
.
t
)
Hashtbl
.
t
)
=
(* TODO *)
false
(* [live_cfg_fun f] computes the set of live variables at each point by
iterating [live_cfg_nodes] as long as progress is made. *)
let
live_cfg_fun
({
cfgfunargs
;
cfgfunbody
;
cfgentry
}
:
cfg_fun
)
=
let
lives
:
(
int
,
string
Set
.
t
)
Hashtbl
.
t
=
Hashtbl
.
create
17
in
let
rec
aux
()
=
if
live_cfg_nodes
cfgfunbody
lives
then
aux
()
else
()
in
aux
()
;
lives
let
live_cfg_fun
({
cfgfunargs
;
cfgfunbody
;
cfgentry
}
:
cfg_fun
)
=
fixpoint
(
fun
cfg
lives
n
->
match
Hashtbl
.
find_option
cfg
n
with
|
Some
cn
->
live_cfg_node
cn
(
live_after_node
cfg
n
lives
)
|
None
->
failwith
"Unknown node"
)
(
fun
cfg
n
cn
->
Set
.
empty
)
cfgfunbody
(* [live_cfg_fun f] calcule l'ensemble des variables vivantes avant chaque nœud
du CFG en itérant [live_cfg_nodes] jusqu'à ce qu'un point fixe soit atteint.
*)
let
live_cfg_fun
(
f
:
cfg_fun
)
:
(
int
,
string
Set
.
t
)
Hashtbl
.
t
=
let
lives
=
Hashtbl
.
create
17
in
(* TODO *)
lives
This diff is collapsed.
Click to expand it.
src/e_regexp.ml
+
1
−
1
View file @
ab96f24f
...
...
@@ -59,10 +59,10 @@ let alphabet = char_list_of_string (lowercase_letters ^ uppercase_letters ^ digi
let
letter_regexp
=
char_range
(
char_list_of_string
(
uppercase_letters
^
lowercase_letters
))
let
digit_regexp
=
char_range
(
char_list_of_string
digits
)
let
identifier_material
=
char_range
(
char_list_of_string
(
uppercase_letters
^
lowercase_letters
^
digits
^
"_"
))
let
keyword_regexp
s
=
str_regexp
(
char_list_of_string
s
)
(* La liste des expressions régulières permettant d'identifier les tokens du langage E *)
let
list_regexp
=
let
keyword_regexp
s
=
str_regexp
(
char_list_of_string
s
)
in
[
(
keyword_regexp
"while"
,
fun
s
->
Some
(
SYM_WHILE
));
(
keyword_regexp
"int"
,
fun
s
->
Some
(
SYM_INT
));
...
...
This diff is collapsed.
Click to expand it.
src/test_lexer.ml
+
3
−
9
View file @
ab96f24f
...
...
@@ -5,19 +5,13 @@ open Utils
open
Symbols
let
()
=
let
lowercase_letters
=
"abcdefghijklmnopqrstuvwxyz"
in
let
uppercase_letters
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
in
let
digits
=
"0123456789"
in
let
other_characters
=
"?!=<>_ ;,{}()[]-+*/%
\n\t
"
in
let
alphabet
=
char_list_of_string
(
lowercase_letters
^
uppercase_letters
^
digits
^
other_characters
)
in
let
letter_regexp
=
char_range
(
char_list_of_string
(
uppercase_letters
^
lowercase_letters
))
in
let
digit_regexp
=
char_range
(
char_list_of_string
digits
)
in
let
keyword_regexp
s
=
str_regexp
(
char_list_of_string
s
)
in
let
regexp_list
=
[
(
keyword_regexp
"while"
,
fun
s
->
Some
(
SYM_WHILE
));
(
keyword_regexp
"if"
,
fun
s
->
Some
(
SYM_IF
));
]
in
(* Décommentez la ligne suivante pour tester sur la vraie liste d'expressions
régulières. *)
(* let regexp_list = list_regexp in *)
List
.
iteri
(
fun
i
(
rg
,
_
)
->
Printf
.
printf
"%d: %s
\n
"
i
(
string_of_regexp
rg
))
regexp_list
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment