Kaynağa Gözat

LibJS/JIT: Do "enter & leave" sequence in x86_64 machine code

This ensures that the stack pointer is restored before we return from
the jitted code.
Andreas Kling 1 yıl önce
ebeveyn
işleme
71e41418f6

+ 10 - 0
Userland/Libraries/LibJS/JIT/Assembler.h

@@ -290,8 +290,18 @@ struct Assembler {
         }
     }
 
+    void enter()
+    {
+        push(Operand::Register(Reg::RBP));
+        mov(Operand::Register(Reg::RBP), Operand::Register(Reg::RSP));
+        sub(Operand::Register(Reg::RSP), Operand::Imm8(8));
+    }
+
     void exit()
     {
+        // leave
+        emit8(0xc9);
+
         // ret
         emit8(0xc3);
     }

+ 2 - 0
Userland/Libraries/LibJS/JIT/Compiler.cpp

@@ -179,6 +179,8 @@ OwnPtr<NativeExecutable> Compiler::compile(Bytecode::Executable const& bytecode_
 
     Compiler compiler;
 
+    compiler.m_assembler.enter();
+
     compiler.m_assembler.mov(
         Assembler::Operand::Register(REGISTER_ARRAY_BASE),
         Assembler::Operand::Register(ARG1));