Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 338b74a

Browse files
dcharkescommit-bot@chromium.org
authored andcommitted
[vm/ffi] Align stack frame when entering and exiting safe point
Closes: dart-lang/sdk#36993 Change-Id: Idc3b2f26142a5c1a358ebf5f71cd226978181b73 Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-simdbc64-try, vm-kernel-mac-debug-simdbc64-try, vm-kernel-reload-mac-debug-simdbc64-try, vm-kernel-linux-debug-ia32-try, vm-dartkb-linux-debug-simarm64-try, vm-kernel-win-debug-x64-try, vm-kernel-mac-debug-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103136 Reviewed-by: Samir Jindel <[email protected]> Commit-Queue: Daco Harkes <[email protected]>
1 parent 7bbd8ea commit 338b74a

File tree

4 files changed

+41
-7
lines changed

4 files changed

+41
-7
lines changed

runtime/vm/compiler/stub_code_compiler_arm.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,13 @@ void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
274274
RegisterSet all_registers;
275275
all_registers.AddAllGeneralRegisters();
276276
__ PushRegisters(all_registers);
277+
278+
__ EnterFrame((1 << FP) | (1 << LR), 0);
279+
__ ReserveAlignedFrameSpace(0);
277280
__ ldr(R0, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
278281
__ blx(R0);
282+
__ LeaveFrame((1 << FP) | (1 << LR), 0);
283+
279284
__ PopRegisters(all_registers);
280285
__ Ret();
281286
}
@@ -284,8 +289,13 @@ void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
284289
RegisterSet all_registers;
285290
all_registers.AddAllGeneralRegisters();
286291
__ PushRegisters(all_registers);
292+
293+
__ EnterFrame((1 << FP) | (1 << LR), 0);
294+
__ ReserveAlignedFrameSpace(0);
287295
__ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
288296
__ blx(R0);
297+
__ LeaveFrame((1 << FP) | (1 << LR), 0);
298+
289299
__ PopRegisters(all_registers);
290300
__ Ret();
291301
}
@@ -1748,7 +1758,7 @@ void StubCodeCompiler::GenerateAllocationStubForClass(Assembler* assembler,
17481758
EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
17491759
}
17501760

1751-
__ LeaveDartFrameAndReturn(); // Restores correct SP.
1761+
__ LeaveDartFrameAndReturn(); // Restores correct SP.
17521762
}
17531763

17541764
// Called for invoking "dynamic noSuchMethod(Invocation invocation)" function

runtime/vm/compiler/stub_code_compiler_arm64.cc

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,14 @@ void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
209209
RegisterSet all_registers;
210210
all_registers.AddAllGeneralRegisters();
211211
__ PushRegisters(all_registers);
212-
__ mov(CallingConventions::kFirstCalleeSavedCpuReg, SP);
212+
213+
__ EnterFrame(0);
213214
__ ReserveAlignedFrameSpace(0);
214215
__ mov(CSP, SP);
215216
__ ldr(R0, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
216217
__ blr(R0);
217-
__ mov(SP, CallingConventions::kFirstCalleeSavedCpuReg);
218+
__ LeaveFrame();
219+
218220
__ PopRegisters(all_registers);
219221
__ mov(CSP, SP);
220222
__ Ret();
@@ -224,12 +226,14 @@ void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
224226
RegisterSet all_registers;
225227
all_registers.AddAllGeneralRegisters();
226228
__ PushRegisters(all_registers);
227-
__ mov(CallingConventions::kFirstCalleeSavedCpuReg, SP);
229+
230+
__ EnterFrame(0);
228231
__ ReserveAlignedFrameSpace(0);
229232
__ mov(CSP, SP);
230233
__ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
231234
__ blr(R0);
232-
__ mov(SP, CallingConventions::kFirstCalleeSavedCpuReg);
235+
__ LeaveFrame();
236+
233237
__ PopRegisters(all_registers);
234238
__ mov(CSP, SP);
235239
__ Ret();
@@ -1806,7 +1810,7 @@ void StubCodeCompiler::GenerateAllocationStubForClass(Assembler* assembler,
18061810
// ensure that the object is in new-space or has remembered bit set.
18071811
EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
18081812
}
1809-
__ LeaveStubFrame(); // Restores correct SP.
1813+
__ LeaveStubFrame(); // Restores correct SP.
18101814
__ ret();
18111815
}
18121816

runtime/vm/compiler/stub_code_compiler_ia32.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,26 @@ void StubCodeCompiler::GenerateCallToRuntimeStub(Assembler* assembler) {
140140

141141
void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
142142
__ pushal();
143+
144+
__ EnterFrame(0);
145+
__ ReserveAlignedFrameSpace(0);
143146
__ movl(EAX, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
144147
__ call(EAX);
148+
__ LeaveFrame();
149+
145150
__ popal();
146151
__ ret();
147152
}
148153

149154
void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
150155
__ pushal();
156+
157+
__ EnterFrame(0);
158+
__ ReserveAlignedFrameSpace(0);
151159
__ movl(EAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
152160
__ call(EAX);
161+
__ LeaveFrame();
162+
153163
__ popal();
154164
__ ret();
155165
}

runtime/vm/compiler/stub_code_compiler_x64.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,13 @@ void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
204204
all_registers.AddAllGeneralRegisters();
205205
__ PushRegisters(all_registers.cpu_registers(),
206206
all_registers.fpu_registers());
207+
208+
__ EnterFrame(0);
209+
__ ReserveAlignedFrameSpace(0);
207210
__ movq(RAX, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
208211
__ CallCFunction(RAX);
212+
__ LeaveFrame();
213+
209214
__ PopRegisters(all_registers.cpu_registers(), all_registers.fpu_registers());
210215
__ ret();
211216
}
@@ -215,8 +220,13 @@ void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
215220
all_registers.AddAllGeneralRegisters();
216221
__ PushRegisters(all_registers.cpu_registers(),
217222
all_registers.fpu_registers());
223+
224+
__ EnterFrame(0);
225+
__ ReserveAlignedFrameSpace(0);
218226
__ movq(RAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
219227
__ CallCFunction(RAX);
228+
__ LeaveFrame();
229+
220230
__ PopRegisters(all_registers.cpu_registers(), all_registers.fpu_registers());
221231
__ ret();
222232
}
@@ -1762,7 +1772,7 @@ void StubCodeCompiler::GenerateAllocationStubForClass(Assembler* assembler,
17621772
// Create a stub frame.
17631773
__ EnterStubFrame(); // Uses PP to access class object.
17641774

1765-
__ pushq(R9); // Setup space on stack for return value.
1775+
__ pushq(R9); // Setup space on stack for return value.
17661776
__ PushObject(
17671777
CastHandle<Object>(cls)); // Push class of object to be allocated.
17681778
if (is_cls_parameterized) {

0 commit comments

Comments
 (0)