| Index: runtime/vm/code_generator.cc
|
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
|
| index 53ee195ace543e7719175ff59986f0ef3c47c9fa..e8b1f6fefafc728dc303f657444d89e63fe33b85 100644
|
| --- a/runtime/vm/code_generator.cc
|
| +++ b/runtime/vm/code_generator.cc
|
| @@ -674,16 +674,12 @@ DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) {
|
| const Code& target_code = Code::Handle(target_function.CurrentCode());
|
| // Before patching verify that we are not repeatedly patching to the same
|
| // target.
|
| - ASSERT(target_code.EntryPoint() !=
|
| + ASSERT(target_code.raw() !=
|
| CodePatcher::GetStaticCallTargetAt(caller_frame->pc(), caller_code));
|
| - const Instructions& instrs =
|
| - Instructions::Handle(caller_code.instructions());
|
| - {
|
| - WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
|
| - CodePatcher::PatchStaticCallAt(caller_frame->pc(), caller_code,
|
| - target_code.EntryPoint());
|
| - caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
|
| - }
|
| + CodePatcher::PatchStaticCallAt(caller_frame->pc(),
|
| + caller_code,
|
| + target_code);
|
| + caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
|
| if (FLAG_trace_patching) {
|
| OS::PrintErr("PatchStaticCall: patching caller pc %#" Px ""
|
| " to '%s' new entry point %#" Px " (%s)\n",
|
| @@ -711,11 +707,10 @@ DEFINE_RUNTIME_ENTRY(BreakpointRuntimeHandler, 0) {
|
| DartFrameIterator iterator;
|
| StackFrame* caller_frame = iterator.NextFrame();
|
| ASSERT(caller_frame != NULL);
|
| - uword orig_stub =
|
| - isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
|
| + const Code& orig_stub = Code::Handle(
|
| + isolate->debugger()->GetPatchedStubAddress(caller_frame->pc()));
|
| isolate->debugger()->SignalBpReached();
|
| - ASSERT((orig_stub & kSmiTagMask) == kSmiTag);
|
| - arguments.SetReturn(Smi::Handle(reinterpret_cast<RawSmi*>(orig_stub)));
|
| + arguments.SetReturn(orig_stub);
|
| }
|
|
|
|
|
| @@ -1440,6 +1435,7 @@ DEFINE_RUNTIME_ENTRY(StackOverflow, 0) {
|
| Instructions::Handle(optimized_code.instructions()).EntryPoint();
|
| function.AttachCode(original_code);
|
| frame->set_pc(optimized_entry);
|
| + frame->set_pc_marker(optimized_code.raw());
|
| }
|
| }
|
| }
|
| @@ -1527,14 +1523,10 @@ DEFINE_RUNTIME_ENTRY(FixCallersTarget, 0) {
|
|
|
| const Code& current_target_code = Code::Handle(
|
| isolate, target_function.CurrentCode());
|
| - const Instructions& instrs = Instructions::Handle(
|
| - isolate, caller_code.instructions());
|
| - {
|
| - WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
|
| - CodePatcher::PatchStaticCallAt(frame->pc(), caller_code,
|
| - current_target_code.EntryPoint());
|
| - caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
|
| - }
|
| + CodePatcher::PatchStaticCallAt(frame->pc(),
|
| + caller_code,
|
| + current_target_code);
|
| + caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
|
| if (FLAG_trace_patching) {
|
| OS::PrintErr("FixCallersTarget: caller %#" Px " "
|
| "target '%s' %#" Px " -> %#" Px "\n",
|
| @@ -1564,9 +1556,8 @@ DEFINE_RUNTIME_ENTRY(FixAllocationStubTarget, 0) {
|
| ASSERT(frame->IsDartFrame());
|
| const Code& caller_code = Code::Handle(isolate, frame->LookupDartCode());
|
| ASSERT(!caller_code.IsNull());
|
| - const uword target =
|
| - CodePatcher::GetStaticCallTargetAt(frame->pc(), caller_code);
|
| - const Code& stub = Code::Handle(isolate, Code::LookupCode(target));
|
| + const Code& stub = Code::Handle(
|
| + CodePatcher::GetStaticCallTargetAt(frame->pc(), caller_code));
|
| Class& alloc_class = Class::ZoneHandle(zone);
|
| alloc_class ^= stub.owner();
|
| Code& alloc_stub = Code::Handle(isolate, alloc_class.allocation_stub());
|
| @@ -1574,15 +1565,10 @@ DEFINE_RUNTIME_ENTRY(FixAllocationStubTarget, 0) {
|
| alloc_stub = StubCode::GetAllocationStubForClass(alloc_class);
|
| ASSERT(!CodePatcher::IsEntryPatched(alloc_stub));
|
| }
|
| - const Instructions& instrs =
|
| - Instructions::Handle(isolate, caller_code.instructions());
|
| - {
|
| - WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
|
| - CodePatcher::PatchStaticCallAt(frame->pc(),
|
| - caller_code,
|
| - alloc_stub.EntryPoint());
|
| - caller_code.SetStubCallTargetCodeAt(frame->pc(), alloc_stub);
|
| - }
|
| + CodePatcher::PatchStaticCallAt(frame->pc(),
|
| + caller_code,
|
| + alloc_stub);
|
| + caller_code.SetStubCallTargetCodeAt(frame->pc(), alloc_stub);
|
| if (FLAG_trace_patching) {
|
| OS::PrintErr("FixAllocationStubTarget: caller %#" Px " alloc-class %s "
|
| " -> %#" Px "\n",
|
| @@ -1636,11 +1622,11 @@ void DeoptimizeAt(const Code& optimized_code, uword pc) {
|
| Instructions::Handle(zone, optimized_code.instructions());
|
| {
|
| WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
|
| - CodePatcher::InsertCallAt(pc, lazy_deopt_jump);
|
| + CodePatcher::InsertDeoptimizationCallAt(pc, lazy_deopt_jump);
|
| }
|
| if (FLAG_trace_patching) {
|
| const String& name = String::Handle(function.name());
|
| - OS::PrintErr("InsertCallAt: %" Px " to %" Px " for %s\n", pc,
|
| + OS::PrintErr("InsertDeoptimizationCallAt: %" Px " to %" Px " for %s\n", pc,
|
| lazy_deopt_jump, name.ToCString());
|
| }
|
| // Mark code as dead (do not GC its embedded objects).
|
| @@ -1693,7 +1679,9 @@ static void CopySavedRegisters(uword saved_registers_address,
|
| // Copies saved registers and caller's frame into temporary buffers.
|
| // Returns the stack size of unoptimized frame.
|
| DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
|
| - 1, uword saved_registers_address) {
|
| + 2,
|
| + uword saved_registers_address,
|
| + uword is_lazy_deopt) {
|
| Thread* thread = Thread::Current();
|
| Isolate* isolate = thread->isolate();
|
| StackZone zone(thread);
|
| @@ -1719,9 +1707,12 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
|
|
|
| // Create the DeoptContext.
|
| DeoptContext* deopt_context =
|
| - new DeoptContext(caller_frame, optimized_code,
|
| + new DeoptContext(caller_frame,
|
| + optimized_code,
|
| DeoptContext::kDestIsOriginalFrame,
|
| - fpu_registers, cpu_registers);
|
| + fpu_registers,
|
| + cpu_registers,
|
| + is_lazy_deopt != 0);
|
| isolate->set_deopt_context(deopt_context);
|
|
|
| // Stack size (FP - SP) in bytes.
|
|
|