From 66cc1ea68b5d558cb2acd6ea698f20b04d9b43be Mon Sep 17 00:00:00 2001 From: Paweł Dybiec Date: Sun, 13 Jan 2019 12:52:47 +0100 Subject: Start of live variable analysis --- source/xi_lib/analysis.ml | 52 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) (limited to 'source/xi_lib/analysis.ml') diff --git a/source/xi_lib/analysis.ml b/source/xi_lib/analysis.ml index ac15cb5..f83d400 100644 --- a/source/xi_lib/analysis.ml +++ b/source/xi_lib/analysis.ml @@ -1,10 +1,14 @@ +(* Wiedza dla jakiegoś punktu (instrukcji, bloku, terminatora) *) module Knowledge = struct + (* wierdza na wejściu (pre) oraz wyjściu (post)*) type 'a t = { pre: 'a ; post: 'a } + (* akcesory *) + let pre t = t.pre let post t = t.post @@ -20,14 +24,28 @@ module Knowledge = struct in t - let make pre post : 'a t = {pre; post} + (* konstruktor *) + + let make ~pre ~post : 'a t = {pre; post} + + (* alias *) type 'a table = (Ir.label, 'a t) Hashtbl.t end +(* Wiedza o wierzcholku w grafie sterowania *) module BlockKnowledge = struct + (* + * Simple - mamy tylko wiedzę na wejściu/wyjściu + * - używane w analizach co nie interesują się instrukcjami (jak analiza dominacji) + * lub przy wyszczególnioncyh wierzchołkach entry/exit. + * Complex - mamy wiedzę o instrukcjach wewnątrz bloku + * - block - wiedza na wejściu wyjściu do bloku + * - body - lista instrukcji bloku wraz z wiedzą + * - terminator - terminator bloku wraz z wiedzą + *) type 'a t = | Simple of 'a Knowledge.t | Complex of @@ -36,32 +54,38 @@ module BlockKnowledge = struct ; terminator: 'a Knowledge.t * Ir.terminator } + (* akcesory *) + + (* zwraca wiedzę Knowledge dla całego bloku + * - działa z dwoma konstruktorami *) let block = function | Simple t -> t | Complex {block; _} -> block + + (* zwracają pola pre/post z wiedzy dla całego bloku + * - działa z dwoma konstruktorami *) + let pre t = Knowledge.pre @@ block t let post t = Knowledge.post @@ block t + (* zwraca terminator i wiedzę na jego temat, działa tylko z Complex *) let terminator = function | Simple _ -> failwith "BlockKnowledge.terminator" | Complex t-> t.terminator + (* zwraca listę instrukcji wraz z wiedzą na ich temat, działa tylko z Complex *) let body = function | Simple _ -> failwith "BlockKnowledge.body" | Complex t -> t.body + (* zwraca terminator, działa tylko z Complex *) let terminator_instr t = snd @@ terminator t + (* zwraca wiedzę o terminatorze, działa tylko z Complex *) let terminator_kw t = fst @@ terminator t - let make_complex ~block ~body ~terminator = - Complex { block; body; terminator } - - let make_simple t = Simple t - - type 'a table = (Ir.label, 'a t) Hashtbl.t - + (* setter wiedzy o całym bloku, działa z dwoma konstruktorami *) let alter_prepost ?pre ?post = function | Simple t -> Simple (Knowledge.alter ?pre ?post t) @@ -74,4 +98,16 @@ module BlockKnowledge = struct | Complex _ -> true | Simple _ -> false + (* konstruktory *) + + let make_complex ~block ~body ~terminator = + Complex { block; body; terminator } + + let make_simple t = Simple t + + (* alias *) + + type 'a table = (Ir.label, 'a t) Hashtbl.t + + end -- cgit 1.4.1