From 438d541dbe5fe7d7fe6b7aacaa6e6ef070c2e237 Mon Sep 17 00:00:00 2001 From: Bernhard Schommer Date: Thu, 16 Apr 2020 20:23:35 +0200 Subject: 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. --- backend/IRC.ml | 4 +--- backend/IRC.mli | 4 ---- cfrontend/CPragmas.ml | 7 ++++++- driver/Frontend.ml | 1 + 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 *) -- cgit