summaryrefslogtreecommitdiff
path: root/src/specialize.ml
diff options
context:
space:
mode:
authorAlasdair Armstrong2019-03-27 19:21:24 +0000
committerAlasdair Armstrong2019-03-27 19:30:43 +0000
commit989c7f8ab0bf908d0cd26b58c542d264c63b72fe (patch)
treea29829bf822ad5ad1ab51e16a36a88961a231f1c /src/specialize.ml
parent368168f2254d9e4de0c3fac599855e0cf5a0afaa (diff)
C: Generate C from sliced specifications
Diffstat (limited to 'src/specialize.ml')
-rw-r--r--src/specialize.ml18
1 files changed, 6 insertions, 12 deletions
diff --git a/src/specialize.ml b/src/specialize.ml
index afce4b0f..5a7624bc 100644
--- a/src/specialize.ml
+++ b/src/specialize.ml
@@ -483,7 +483,7 @@ let specialize_id_overloads instantiations id (Defs defs) =
valspecs are then re-specialized. This process is iterated until
the whole spec is specialized. *)
-let initial_calls = IdSet.of_list
+let initial_calls = ref (IdSet.of_list
[ mk_id "main";
mk_id "__SetConfig";
mk_id "__ListConfig";
@@ -491,10 +491,12 @@ let initial_calls = IdSet.of_list
mk_id "decode";
mk_id "initialize_registers";
mk_id "append_64" (* used to construct bitvector literals in C backend *)
- ]
+ ])
-let remove_unused_valspecs ?(initial_calls=initial_calls) env ast =
- let calls = ref initial_calls in
+let add_initial_calls ids = initial_calls := IdSet.union ids !initial_calls
+
+let remove_unused_valspecs env ast =
+ let calls = ref !initial_calls in
let vs_ids = val_spec_ids ast in
let inspect_exp = function
@@ -527,14 +529,6 @@ let remove_unused_valspecs ?(initial_calls=initial_calls) env ast =
List.fold_left (fun ast id -> Defs (remove_unused ast id)) ast (IdSet.elements unused)
-let slice_defs env (Defs defs) keep_ids =
- let keep = function
- | DEF_fundef fd -> IdSet.mem (id_of_fundef fd) keep_ids
- | _ -> true
- in
- let defs = List.filter keep defs in
- remove_unused_valspecs env (Defs defs) ~initial_calls:keep_ids
-
let specialize_id spec id ast =
let instantiations = instantiations_of spec id ast in
let ast = specialize_id_valspec spec instantiations id ast in