From cc21e95e202b4c2250c34d226ebe84df7a1536c9 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Tue, 2 Jan 2024 12:30:28 +0100 Subject: [PATCH] alignement RSP sur 16 --- flap/src/x86-64/retrolixToX86_64.ml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/flap/src/x86-64/retrolixToX86_64.ml b/flap/src/x86-64/retrolixToX86_64.ml index 5c7e8ce..ca32d08 100644 --- a/flap/src/x86-64/retrolixToX86_64.ml +++ b/flap/src/x86-64/retrolixToX86_64.ml @@ -636,14 +636,26 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct (* Vide la pile et jump vers la fonction *) function_epilogue fd @ [ Instruction (T.jmpdi ~tgt:f) ] | `Normal -> - (* TODO: Vérifier l'alignement de RSP sur 16 octets *) + (* Alignement de RSP sur 16 octets si besoin *) + let align_stack_open, align_stack_close = + if fd.locals_space mod 16 = 0 + then [], [] + else ( + let src = T.liti 8 in + ( [ T.Instruction (T.subq ~src ~dst:rsp) ] + , [ T.Instruction (T.addq ~src ~dst:rsp) ] )) + in + (* Aligne la pile si besoin *) + align_stack_open (* Place les arguments sur la pile, le dernier en premier *) - List.rev_map (fun arg -> T.Instruction (T.pushq ~src:arg)) args + @ List.rev_map (fun arg -> T.Instruction (T.pushq ~src:arg)) args (* Appelle la fonction *) @ [ T.Instruction (T.calldi ~tgt:f) (* Retire les arguments de la pile lorsque l'on quitte la fonction *) ; T.Instruction (T.addq ~src:(T.liti (8 * List.length args)) ~dst:rsp) ] + (* Si on a aligné la pile, on la remet comme c'était avant de partir *) + @ align_stack_close ;; end