aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2020-04-16 20:23:35 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2020-04-20 13:30:03 +0200
commit438d541dbe5fe7d7fe6b7aacaa6e6ef070c2e237 (patch)
treef2ca20b3130b302bdaf3841d6105c8138dd48583
parent0a2db0269809539ccc66f8ec73637c37fbd23580 (diff)
downloadcompcert-kvx-438d541dbe5fe7d7fe6b7aacaa6e6ef070c2e237.tar.gz
compcert-kvx-438d541dbe5fe7d7fe6b7aacaa6e6ef070c2e237.zip
Move reserved_registers to CPragmas.
The list of reserved_registers is never reset between the compilation of multiple files. Instead of storing them in IRC they are moved in the CPragmas file and reset in the a new reset function for Cpragmas whic is called per file.
-rw-r--r--backend/IRC.ml4
-rw-r--r--backend/IRC.mli4
-rw-r--r--cfrontend/CPragmas.ml7
-rw-r--r--driver/Frontend.ml1
4 files changed, 8 insertions, 8 deletions
diff --git a/backend/IRC.ml b/backend/IRC.ml
index b359da35..e94d6fbb 100644
--- a/backend/IRC.ml
+++ b/backend/IRC.ml
@@ -252,12 +252,10 @@ let class_of_loc = function
let no_spill_class = 2
-let reserved_registers = ref ([]: mreg list)
-
let rec remove_reserved = function
| [] -> []
| hd :: tl ->
- if List.mem hd !reserved_registers
+ if List.mem hd !CPragmas.reserved_registers
then remove_reserved tl
else hd :: remove_reserved tl
diff --git a/backend/IRC.mli b/backend/IRC.mli
index 30b6d5c1..59471329 100644
--- a/backend/IRC.mli
+++ b/backend/IRC.mli
@@ -13,7 +13,6 @@
(* Iterated Register Coalescing: George and Appel's graph coloring algorithm *)
open Registers
-open Machregs
open Locations
open XTL
@@ -39,9 +38,6 @@ val add_pref: graph -> var -> var -> unit
(* Color the graph. Return an assignment of locations to variables. *)
val coloring: graph -> (var -> loc)
-(* Machine registers that are reserved and not available for allocation. *)
-val reserved_registers: mreg list ref
-
(* Auxiliaries to deal with register classes *)
val class_of_type: AST.typ -> int
val class_of_loc: loc -> int
diff --git a/cfrontend/CPragmas.ml b/cfrontend/CPragmas.ml
index 44660718..ce2cfcf0 100644
--- a/cfrontend/CPragmas.ml
+++ b/cfrontend/CPragmas.ml
@@ -49,13 +49,15 @@ let process_use_section_pragma classname id =
(* #pragma reserve_register *)
+let reserved_registers = ref ([]: Machregs.mreg list)
+
let process_reserve_register_pragma name =
match Machregsaux.register_by_name name with
| None ->
C2C.error "unknown register in `reserve_register' pragma"
| Some r ->
if Machregsaux.can_reserve_register r then
- IRC.reserved_registers := r :: !IRC.reserved_registers
+ reserved_registers := r :: !reserved_registers
else
C2C.error "cannot reserve this register (not a callee-save)"
@@ -84,5 +86,8 @@ let process_pragma name =
| _ ->
false
+let reset () =
+ reserved_registers := []
+
let initialize () =
C2C.process_pragma_hook := process_pragma
diff --git a/driver/Frontend.ml b/driver/Frontend.ml
index 74791247..bb97e945 100644
--- a/driver/Frontend.ml
+++ b/driver/Frontend.ml
@@ -75,6 +75,7 @@ let preprocess ifile ofile =
let parse_c_file sourcename ifile =
Debug.init_compile_unit sourcename;
Sections.initialize();
+ CPragmas.reset();
(* Simplification options *)
let simplifs =
"b" (* blocks: mandatory *)