ajout prologue epilogue de fonction

This commit is contained in:
Nicolas PENELOUX 2024-01-01 20:51:48 +01:00
parent 4e22648cd4
commit ac0254f837

View file

@ -523,6 +523,8 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
+ ((if empty_frame fd then 0 else 1) * Mint.size_in_bytes) + ((if empty_frame fd then 0 else 1) * Mint.size_in_bytes)
+ fd.locals_space + fd.locals_space
(* Ajout à la pile les variables présentent dans la liste *)
let add_stack stack list start op_addr = let add_stack stack list start op_addr =
let stack, _ = List.fold_left let stack, _ = List.fold_left
(fun (stack,addr) id -> (fun (stack,addr) id ->
@ -534,15 +536,13 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
let frame_descriptor ~params ~locals = 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 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 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; } {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 = 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 = 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 = let call fd ~kind ~f ~args =