remove data duplicata
This commit is contained in:
parent
f9ef6bc20c
commit
fd6ca52efc
1 changed files with 16 additions and 6 deletions
|
@ -1,15 +1,21 @@
|
|||
open Ast
|
||||
open Baselib
|
||||
|
||||
let collect_constant_strings code =
|
||||
let counter = ref 0 in
|
||||
let env = ref Env.empty in
|
||||
let ccs_value = function
|
||||
| V1.Void -> V2.Void, []
|
||||
| V1.Bool b -> V2.Bool b, []
|
||||
| V1.Int n -> V2.Int n, []
|
||||
| V1.Str s ->
|
||||
incr counter;
|
||||
let lbl = "str" ^ string_of_int !counter in
|
||||
V2.Data lbl, [ lbl, Mips.Asciiz s ]
|
||||
(match Env.find_opt s !env with
|
||||
| Some lbl -> V2.Data lbl, [ lbl, Mips.Asciiz s ]
|
||||
| None ->
|
||||
incr counter;
|
||||
let lbl = "str" ^ string_of_int !counter in
|
||||
env := Env.add s lbl !env;
|
||||
V2.Data lbl, [ lbl, Mips.Asciiz s ])
|
||||
in
|
||||
let rec ccs_expr = function
|
||||
| IR1.Val v ->
|
||||
|
@ -17,8 +23,8 @@ let collect_constant_strings code =
|
|||
IR2.Val v2, cs
|
||||
| IR1.Var v -> IR2.Var v, []
|
||||
| IR1.Call (fn, args) ->
|
||||
let a2 = List.map ccs_expr args in
|
||||
IR2.Call (fn, List.map fst a2), List.flatten (List.map snd a2)
|
||||
let args2 = List.map ccs_expr args in
|
||||
IR2.Call (fn, List.map fst args2), List.flatten (List.map snd args2)
|
||||
in
|
||||
let ccs_instr = function
|
||||
| IR1.Decl v -> IR2.Decl v, []
|
||||
|
@ -43,7 +49,11 @@ let collect_constant_strings code =
|
|||
IR2.Func (name, args, body2), cs
|
||||
in
|
||||
let code2 = List.map ccs_def code in
|
||||
List.map fst code2, List.flatten (List.map snd code2)
|
||||
( List.map fst code2
|
||||
, List.fold_left
|
||||
(fun list el -> if List.mem el list then list else el :: list)
|
||||
[]
|
||||
(List.flatten (List.map snd code2)) )
|
||||
;;
|
||||
|
||||
let simplify ir = collect_constant_strings ir
|
||||
|
|
Reference in a new issue