ajout prologue epilogue de fonction
This commit is contained in:
parent
4e22648cd4
commit
ac0254f837
1 changed files with 23 additions and 9 deletions
|
@ -523,6 +523,8 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
|
|||
+ ((if empty_frame fd then 0 else 1) * Mint.size_in_bytes)
|
||||
+ fd.locals_space
|
||||
|
||||
|
||||
(* Ajout à la pile les variables présentent dans la liste *)
|
||||
let add_stack stack list start op_addr =
|
||||
let stack, _ = List.fold_left
|
||||
(fun (stack,addr) id ->
|
||||
|
@ -534,15 +536,13 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
|
|||
|
||||
|
||||
let frame_descriptor ~params ~locals =
|
||||
(* TODO: Student! Implement me! *)
|
||||
(*Ajout des variables locals d'abord. ON commence à la position -8 dans la pile vide, on décroit l'adresse de 8 à chaque nouvelle valeur*)
|
||||
let stack = add_stack S.IdMap.empty locals (-8) (fun x -> x - 8) in
|
||||
(* Ajout des variables global ensuite. ON reprend la même pile, on commence à l'adresse 16 et on ajoute l'adresse qui suit de 8 *)
|
||||
let stack = add_stack stack params 16 (fun x -> x + 8) in
|
||||
(* ON créé le frame descriptor ensuite*)
|
||||
{param_count = List.length params; locals_space = (List.length locals) * 8; stack_map = stack; }
|
||||
|
||||
;;
|
||||
|
||||
(* Ajout à la pile les variables présentent dans la liste *)
|
||||
|
||||
|
||||
;;
|
||||
|
||||
|
@ -555,14 +555,28 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
|
|||
}
|
||||
;;
|
||||
|
||||
open T (* Necessaire pour pouvoir créer des instructions*)
|
||||
let function_prologue fd =
|
||||
(* TODO: Student! Implement me! *)
|
||||
[]
|
||||
(*Instruction 1 : On pousse rbp sur la pile, pour sauvegarder la valeur actuelle de la base de la pile, quand on dépilera à la fin*)
|
||||
(*Instruction 2 : On initialise la base de la pile en mettant rsp au niveau de rbp*)
|
||||
[Instruction (pushq ~src:rbp);Instruction (movq ~src:rsp ~dst:rbp)]
|
||||
|
||||
(*On ajoute de l'espace pour les futurs variables locales. On regarde combien il y en a dans le frame descriptor*)
|
||||
@ if fd.locals_space <> 0 then
|
||||
(*On va faire des subq (descendre la pile vers le bas) pour pouvoir y mettre les variables locales.*)
|
||||
[Instruction (subq ~src:(liti fd.locals_space) ~dst:rsp)]
|
||||
else []
|
||||
;;
|
||||
|
||||
let function_epilogue fd =
|
||||
(* TODO: Student! Implement me! *)
|
||||
[]
|
||||
let remontage =
|
||||
(*Si de l'espace a été alloué pour les variables locales, on ajoute des instructiosn pour remonter la pile (vers le haut) avec addq*)
|
||||
if fd.locals_space <> 0 then
|
||||
[Instruction (addq ~src:(liti fd.locals_space) ~dst:rsp)]
|
||||
else []
|
||||
in
|
||||
remontage @ [Instruction (popq ~dst:rbp)] (*Pour restaurer l'état de la pile, on effectue un popq ("l'inverse" de pushq du prologue)*)
|
||||
|
||||
;;
|
||||
|
||||
let call fd ~kind ~f ~args =
|
||||
|
|
Reference in a new issue