aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Asmexpandaux.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2015-06-10 10:07:02 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2015-06-10 10:07:02 +0200
commit929c0ea6f02713f59c0862fa0c3a53e0cb89c334 (patch)
tree168677dd7c66fc02e871d4d11d4519e32c5f07ed /backend/Asmexpandaux.ml
parent744dc278d24b15a72ef471fc25c1c8a8df62cc4e (diff)
downloadcompcert-kvx-929c0ea6f02713f59c0862fa0c3a53e0cb89c334.tar.gz
compcert-kvx-929c0ea6f02713f59c0862fa0c3a53e0cb89c334.zip
Moved the printing of the builtin functions etc. into Asmexpand for ARM in the same way as it is done for PPC.
Diffstat (limited to 'backend/Asmexpandaux.ml')
-rw-r--r--backend/Asmexpandaux.ml57
1 files changed, 57 insertions, 0 deletions
diff --git a/backend/Asmexpandaux.ml b/backend/Asmexpandaux.ml
new file mode 100644
index 00000000..6ce6c005
--- /dev/null
+++ b/backend/Asmexpandaux.ml
@@ -0,0 +1,57 @@
+(* *********************************************************************)
+(* *)
+(* The Compcert verified compiler *)
+(* *)
+(* Xavier Leroy, INRIA Paris-Rocquencourt *)
+(* Bernhard Schommer, AbsInt Angewandte Informatik GmbH *)
+(* *)
+(* Copyright Institut National de Recherche en Informatique et en *)
+(* Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the INRIA Non-Commercial License Agreement. *)
+(* *)
+(* *********************************************************************)
+
+(* Util functions used for the expansion of built-ins and some
+ pseudo-instructions *)
+
+open Asm
+open AST
+open Camlcoq
+
+(* Buffering the expanded code *)
+
+let current_code = ref ([]: instruction list)
+
+let emit i = current_code := i :: !current_code
+
+(* Generation of fresh labels *)
+
+let dummy_function = { fn_code = []; fn_sig = signature_main }
+let current_function = ref dummy_function
+let next_label = ref (None: label option)
+
+let new_label () =
+ let lbl =
+ match !next_label with
+ | Some l -> l
+ | None ->
+ (* on-demand computation of the next available label *)
+ List.fold_left
+ (fun next instr ->
+ match instr with
+ | Plabel l -> if P.lt l next then next else P.succ l
+ | _ -> next)
+ P.one (!current_function).fn_code
+ in
+ next_label := Some (P.succ lbl);
+ lbl
+
+
+let set_current_function f =
+ current_function := f; next_label := None; current_code := []
+
+let get_current_function () =
+ let c = List.rev !current_code in
+ let fn = !current_function in
+ set_current_function dummy_function;
+ {fn with fn_code = c}