- Timestamp:
- Mar 7, 2013, 12:10:42 PM (8 years ago)
- Location:
- src/joint
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/joint/Traces.ma
r2785 r2796 291 291 (* as_call_ident ≝ *) (joint_call_ident p) 292 292 (* as_tailcall_ident ≝ *) (joint_tailcall_ident p). 293 294 (* alternative definition with integrated prog_params constructor *) 295 definition joint_status : 296 ∀p : sem_params. 297 joint_program p → (ident → option ℕ) → abstract_status ≝ 298 λp,prog,stacksizes.joint_abstract_status (mk_prog_params p prog stacksizes). -
src/joint/joint_semantics.ma
r2783 r2796 199 199 state st_pars → res (list beval) 200 200 ; eval_ext_seq: ∀globals.∀ge : genv_gen F globals.ext_seq uns_pars → 201 ident → F globals(* current *) → state st_pars → res (state st_pars)201 ident (* current *) → state st_pars → res (state st_pars) 202 202 ; pop_frame: ∀globals.∀ge : genv_gen F globals. 203 ident → F globals (* current *) → state st_pars → res (state st_pars × program_counter) 203 ident (* current *) → call_dest uns_pars (* current ret *) → 204 state st_pars → res (state st_pars × program_counter) 204 205 }. 205 206 … … 407 408 definition eval_seq_no_pc : 408 409 ∀p:sem_params.∀globals.∀ge:genv p globals.ident → 409 joint_closed_internal_function p globals →410 410 joint_seq p globals → state p → 411 411 res (state p) ≝ 412 λp,globals,ge,curr_id, curr_fn,seq,st.412 λp,globals,ge,curr_id,seq,st. 413 413 match seq with 414 414 [ extension_seq c ⇒ 415 eval_ext_seq … ge c curr_id curr_fnst415 eval_ext_seq … ge c curr_id st 416 416 | LOAD dst addrl addrh ⇒ 417 417 ! vaddrh ← dph_arg_retrieve … st addrh ; … … 539 539 definition eval_statement_no_pc : 540 540 ∀p:sem_params.∀globals.∀ge:genv p globals. 541 ident → joint_closed_internal_function p globals(* current *) →541 ident (* current *) → 542 542 joint_statement p globals → state p → res (state p) ≝ 543 λp,globals,ge,curr_id, curr_fn,s,st.543 λp,globals,ge,curr_id,s,st. 544 544 match s with 545 545 [ sequential s next ⇒ 546 546 match s with 547 [ step_seq s ⇒ eval_seq_no_pc … ge curr_id curr_fns st547 [ step_seq s ⇒ eval_seq_no_pc … ge curr_id s st 548 548 | _ ⇒ return st 549 549 ] … … 553 553 definition eval_return ≝ 554 554 λp : sem_params.λglobals : list ident.λge : genv p globals. 555 λcurr_id.λcurr_ fn : joint_closed_internal_function ??.555 λcurr_id.λcurr_ret : call_dest p. 556 556 λst : state p. 557 ! st' ← pop_frame … ge curr_id curr_ fnst ;557 ! st' ← pop_frame … ge curr_id curr_ret st ; 558 558 ! nxt ← next_of_call_pc … ge (\snd … st') ; 559 559 return … … 562 562 definition eval_tailcall ≝ 563 563 λp : sem_params.λglobals : list ident.λge : genv p globals.λf,args,curr_f. 564 λcurr_ fn : joint_closed_internal_function ??.564 λcurr_ret : call_dest p. 565 565 λst : state_pc p. 566 566 ! bl ← block_of_call … ge f st : IO ???; … … 572 572 return mk_state_pc … st' pc (last_pop … st) 573 573 | External efd ⇒ 574 let curr_dest ≝ joint_if_result ?? curr_fn in 575 ! st' ← eval_external_call … efd args curr_dest st ; 576 eval_return … ge curr_f curr_fn st 574 ! st' ← eval_external_call … efd args curr_ret st ; 575 eval_return … ge curr_f curr_ret st 577 576 ]. 578 577 … … 598 597 ] 599 598 | final s ⇒ 599 let curr_ret ≝ joint_if_result … curr_fn in 600 600 match s with 601 601 [ GOTO l ⇒ goto … ge l st 602 | RETURN ⇒ eval_return … ge curr_id curr_ fnst602 | RETURN ⇒ eval_return … ge curr_id curr_ret st 603 603 | TAILCALL _ f args ⇒ 604 eval_tailcall … ge f args curr_id curr_ fnst604 eval_tailcall … ge f args curr_id curr_ret st 605 605 ] 606 606 | FCOND _ a lbltrue lblfalse ⇒ … … 618 618 λp,globals,ge,st. 619 619 ! 〈id,fn,s〉 ← fetch_statement … ge (pc … st) : IO ???; 620 ! st' ← eval_statement_no_pc … ge id fns st : IO ???;620 ! st' ← eval_statement_no_pc … ge id s st : IO ???; 621 621 let st'' ≝ set_no_pc … st' st in 622 622 eval_statement_advance … ge id fn s st''. 623 623 624 (* Paolo: what if in an intermediate language main finishes with an external625 tailcall? Maybe it should rely on an FEnd flow command issued, but that's626 not static... *)627 624 definition is_final: ∀p: sem_params.∀globals. 628 625 genv p globals → program_counter → state_pc p → option int ≝ … … 632 629 [ final s' ⇒ 633 630 match s' with 634 [ RETURN ⇒ 635 do st' ← pop_frame … ge id fn st; 631 [ RETURN ⇒ 632 let curr_ret ≝ joint_if_result … fn in 633 do st' ← pop_frame … ge id curr_ret st; 636 634 if eq_program_counter (\snd … st') exit then 637 do vals ← read_result … ge (joint_if_result … fn)st ;635 do vals ← read_result … ge curr_ret st ; 638 636 Word_of_list_beval vals 639 637 else -
src/joint/semanticsUtils.ma
r2783 r2796 50 50 }. 51 51 52 definition reg_store ≝ λreg,v,locals. OK ? (add RegisterTag beval locals reg v).52 definition reg_store ≝ λreg,v,locals.add RegisterTag beval locals reg v. 53 53 54 54 definition reg_retrieve : register_env beval → register → res beval ≝ … … 56 56 57 57 definition reg_sp_store ≝ λreg,v,locals. 58 ! locals' ← reg_store reg v (reg_sp_env locals) ; 59 return mk_reg_sp locals' (stackp locals). 60 61 definition reg_sp_retrieve ≝ λlocals.reg_retrieve locals. 62 58 let locals' ≝ reg_store reg v (reg_sp_env locals) in 59 mk_reg_sp locals' (stackp locals). 60 61 unification hint 0 ≔ X ⊢ register_env X ≡ identifier_map RegisterTag X. 62 63 definition reg_sp_retrieve ≝ λlocals : reg_sp.reg_retrieve locals. 64 65 definition reg_sp_init ≝ mk_reg_sp (empty_map …). 63 66 (*** Store/retrieve on hardware registers ***) 64 67
Note: See TracChangeset
for help on using the changeset viewer.