(* *********************************************************************) (* *) (* The Compcert verified compiler *) (* *) (* Xavier Leroy, INRIA Paris-Rocquencourt *) (* *) (* 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. *) (* *) (* *********************************************************************) Require Import Coqlib Errors AST Integers. Require Import Asmblock. Local Open Scope error_monad_scope. (** Oracle taking as input a basic block, returns a schedule expressed as a list of bundles *) Axiom schedule: bblock -> list bblock. Extract Constant schedule => "PostpassSchedulingOracle.schedule". (* TODO: refactorisation. ... concat2 ... Fixpoint concat_all (lbb: list bblock) : res bblock := match lbb with | nil => Error (msg "PostpassSchedulingproof.concatenate: empty list") | bb::nil => OK bb | bb::lbb => do bb' <- concat_all lbb; concat2 bb bb' end. Axiom test_equiv_bblock: bblock -> bblock -> bool. Axiom test_equiv_bblock_correct: forall ge f bb tbb, test_equiv bb tbb = true -> bblock_equiv ge f bb tbb. Definition verified_schedule (bb : bblock) : res (list bblock) := DO lbb <- (schedule bb) ; DO tbb <- (concat lbb) ; DO res <- test_equiv_bblock bb tbb ; if res then OK lbb else Error (msg "blah"). *) (* TODO - implement the verificator *) Definition verified_schedule (bb : bblock) : res (list bblock) := OK (schedule bb). Fixpoint transf_blocks (lbb : list bblock) : res (list bblock) := match lbb with | nil => OK nil | (cons bb lbb) => do tlbb <- transf_blocks lbb; do tbb <- verified_schedule bb; OK (tbb ++ tlbb) end. Definition transl_function (f: function) : res function := do lb <- transf_blocks (fn_blocks f); OK (mkfunction (fn_sig f) lb). Definition transf_function (f: function) : res function := do tf <- transl_function f; if zlt Ptrofs.max_unsigned (size_blocks tf.(fn_blocks)) then Error (msg "code size exceeded") else OK tf. Definition transf_fundef (f: fundef) : res fundef := transf_partial_fundef transf_function f. Definition transf_program (p: program) : res program := transform_partial_program transf_fundef p.