@@ -64,74 +64,69 @@ let evaluate_mutant parent_llm llm importants covset node_tbl distance_map =
6464 if interesting then Some new_seed else None
6565 | Assert _ -> None
6666
67+ let change_suffix filename suffix =
68+ let base = Filename. chop_suffix filename (Filename. extension filename) in
69+ base ^ suffix
70+
6771let mutate_seed llctx llset seed =
6872 let muts = ! Config. muts_dir in
69- let seed_filename =
73+ let seedfile =
7074 ALlvm. save_ll muts (F. sprintf " id:%010d.ll" (ALlvm. hash_llm seed)) seed
7175 in
72- let mut_filename =
73- Filename. chop_suffix seed_filename " .ll" ^ " .mut.ll" |> Filename. basename
74- in
75- let mutated_filename =
76- Filename. chop_suffix seed_filename " .ll" ^ " .mutated"
77- in
76+ let mutant_file = change_suffix seedfile " .mut.ll" |> Filename. basename in
77+ let mut_parts = change_suffix seedfile " .mutated" in
7878 let llmutate_args =
7979 if ! Config. mutation = Config.FuzzingMode. Uniform then
80- [
81- " llmutate" ; seed_filename; muts; mut_filename; " -no-focus" ; " >> log.txt" ;
82- ]
83- else [ " llmutate" ; seed_filename; muts; mut_filename; " >> log.txt" ]
80+ [ " llmutate" ; seedfile; muts; mutant_file; " -no-focus" ; " >> log.txt" ]
81+ else [ " llmutate" ; seedfile; muts; mutant_file; " >> log.txt" ]
8482 in
8583
8684 AUtil. cmd llmutate_args |> ignore;
8785
88- let mutant = ALlvm. read_ll llctx (Filename. concat muts mut_filename ) in
86+ let mutant = ALlvm. read_ll llctx (Filename. concat muts mutant_file ) in
8987 match mutant with
88+ | Ok mutant when ALlvm.LLModuleSet. mem llset mutant -> None
9089 | Ok mutant ->
91- if ALlvm.LLModuleSet. mem llset mutant then None
92- else
93- let importants =
94- In_channel. with_open_text mutated_filename In_channel. input_all
95- in
96- Some (mutant, importants)
90+ let importants =
91+ In_channel. with_open_text mut_parts In_channel. input_all
92+ in
93+ Some (mutant, importants)
9794 | Error _ -> None
9895
9996let update_progress progress seed =
10097 let cov_set = Seedpool.Seed. edge_cov seed in
10198 progress |> Progress. add_cov cov_set |> Progress. inc_gen
10299
103- let run seed_pool node_tbl distmap llctx llset progress =
104- (* generate and deduplicate seeds *)
105- let mutator = mutate_seed llctx llset in
106-
107- let rec generate_mutant energy llm (progress : Progress.t ) =
108- if energy = 0 then None
100+ let rec try_gen_mutant mutator node_tbl distmap energy llm (prog : Progress.t ) =
101+ if energy = 0 then None
102+ else
103+ match mutator llm with
104+ | Some (mutant , importants ) -> (
105+ match
106+ evaluate_mutant llm mutant importants prog.cov_sofar node_tbl distmap
107+ with
108+ | Some new_seed -> Some new_seed
109+ | None ->
110+ try_gen_mutant mutator node_tbl distmap (energy - 1 ) mutant prog)
111+ | None -> try_gen_mutant mutator node_tbl distmap (energy - 1 ) llm prog
112+
113+ let gen_mutants mutator node_tbl distmap energy llm pool progress =
114+ let rec aux times pool progress =
115+ if times = 0 then (pool, progress)
109116 else
110- match mutator llm with
111- | Some (mutated_llm , importants ) -> (
112- match
113- evaluate_mutant llm mutated_llm importants progress.cov_sofar
114- node_tbl distmap
115- with
116- | Some new_seed -> Some new_seed
117- | None -> generate_mutant (energy - 1 ) mutated_llm progress)
118- | None -> generate_mutant (energy - 1 ) llm progress
117+ match try_gen_mutant mutator node_tbl distmap energy llm progress with
118+ | Some new_seed ->
119+ let new_progress = update_progress progress new_seed in
120+ Seedpool. save ~parent: (ALlvm. hash_llm llm) new_seed;
121+ let new_pool = Seedpool. push new_seed pool in
122+ aux (times - 1 ) new_pool new_progress
123+ | None -> aux (times - 1 ) pool progress
119124 in
125+ aux energy pool progress
120126
121- let generate_interesting_mutants energy llm pool progress =
122- let rec aux times pool progress =
123- if times = 0 then (pool, progress)
124- else
125- match generate_mutant energy llm progress with
126- | Some new_seed ->
127- let new_progress = update_progress progress new_seed in
128- Seedpool. save ~parent: (ALlvm. hash_llm llm) new_seed;
129- let new_pool = Seedpool. push new_seed pool in
130- aux (times - 1 ) new_pool new_progress
131- | None -> aux (times - 1 ) pool progress
132- in
133- aux energy pool progress
134- in
127+ let run seed_pool node_tbl distmap llctx llset progress =
128+ (* generate and deduplicate seeds *)
129+ let mutator = mutate_seed llctx llset in
135130
136131 let rec campaign pool (progress : Progress.t ) =
137132 let seed, pool_popped = Seedpool. pop pool in
@@ -146,7 +141,7 @@ let run seed_pool node_tbl distmap llctx llset progress =
146141 assert (energy > = 0 );
147142
148143 let new_pool, new_progress =
149- generate_interesting_mutants energy llm pool_popped progress
144+ gen_mutants mutator node_tbl distmap energy llm pool_popped progress
150145 in
151146
152147 campaign (Seedpool. push seed new_pool) new_progress
0 commit comments