diff --git a/flap/src/x86-64/retrolixToX86_64.ml b/flap/src/x86-64/retrolixToX86_64.ml index 2fc17f4..85e91cb 100644 --- a/flap/src/x86-64/retrolixToX86_64.ml +++ b/flap/src/x86-64/retrolixToX86_64.ml @@ -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 =