Index: runtime/vm/assembler_ia32.cc |
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc |
index c6c8da8a468aff6b8b5f5b12f092a1f10267af03..2da038334bc5822889d40e059e0692bb97139e26 100644 |
--- a/runtime/vm/assembler_ia32.cc |
+++ b/runtime/vm/assembler_ia32.cc |
@@ -2366,7 +2366,7 @@ void Assembler::StoreIntoObject(Register object, |
if (object != EDX) { |
movl(EDX, object); |
} |
- Call(*StubCode::UpdateStoreBuffer_entry()); |
+ call(Address(THR, Thread::update_store_buffer_entry_point_offset())); |
if (value != EDX) { |
popl(EDX); // Restore EDX. |
} |
@@ -2622,8 +2622,9 @@ void Assembler::CallRuntime(const RuntimeEntry& entry, |
void Assembler::Call(const StubEntry& stub_entry) { |
- const ExternalLabel label(stub_entry.EntryPoint()); |
- call(&label); |
+ const Code& target = Code::ZoneHandle(stub_entry.code()); |
+ LoadObject(CODE_REG, target); |
+ call(FieldAddress(CODE_REG, Code::entry_point_offset())); |
} |
@@ -2869,18 +2870,19 @@ void Assembler::TryAllocateArray(intptr_t cid, |
} |
+void Assembler::PushCodeObject() { |
+ ASSERT(code_.IsNotTemporaryScopedHandle()); |
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
+ EmitUint8(0x68); |
+ buffer_.EmitObject(code_); |
+} |
+ |
+ |
void Assembler::EnterDartFrame(intptr_t frame_size) { |
EnterFrame(0); |
- Label dart_entry; |
- call(&dart_entry); |
- Bind(&dart_entry); |
- // The runtime system assumes that the code marker address is |
- // kEntryPointToPcMarkerOffset bytes from the entry. If there is any code |
- // generated before entering the frame, the address needs to be adjusted. |
- const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize(); |
- if (offset != 0) { |
- addl(Address(ESP, 0), Immediate(offset)); |
- } |
+ |
+ PushCodeObject(); |
+ |
if (frame_size != 0) { |
subl(ESP, Immediate(frame_size)); |
} |
@@ -2889,8 +2891,7 @@ void Assembler::EnterDartFrame(intptr_t frame_size) { |
// On entry to a function compiled for OSR, the caller's frame pointer, the |
// stack locals, and any copied parameters are already in place. The frame |
-// pointer is already set up. The PC marker is not correct for the |
-// optimized function and there may be extra space for spill slots to |
+// pointer is already set up. There may be extra space for spill slots to |
// allocate. |
void Assembler::EnterOsrFrame(intptr_t extra_size) { |
Comment("EnterOsrFrame"); |
@@ -2898,17 +2899,7 @@ void Assembler::EnterOsrFrame(intptr_t extra_size) { |
Comment("PrologueOffset = %" Pd "", CodeSize()); |
prologue_offset_ = CodeSize(); |
} |
- Label dart_entry; |
- call(&dart_entry); |
- Bind(&dart_entry); |
- // The runtime system assumes that the code marker address is |
- // kEntryPointToPcMarkerOffset bytes from the entry. Since there is no |
- // code to set up the frame pointer, the address needs to be adjusted. |
- const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize(); |
- if (offset != 0) { |
- addl(Address(ESP, 0), Immediate(offset)); |
- } |
- popl(Address(EBP, kPcMarkerSlotFromFp * kWordSize)); |
+ |
if (extra_size != 0) { |
subl(ESP, Immediate(extra_size)); |
} |
@@ -2916,8 +2907,7 @@ void Assembler::EnterOsrFrame(intptr_t extra_size) { |
void Assembler::EnterStubFrame() { |
- EnterFrame(0); |
- pushl(Immediate(0)); // Push 0 in the saved PC area for stub frames. |
+ EnterDartFrame(0); |
} |