Files
sdk/runtime/vm/debugger_mips.cc
T
fschneider@google.com 1dc4e979d9 Remove isolate pointer from context objects.
By moving all stubs that do runtime calls into the isolate
we don't need to cache the current isolate in each context
object.

This saves space on each context at the cost of duplicating stubs
in each isolate. Most stubs are already isolate-specific and the total number
 of stubs is small enough for this to be a good trade-off.

R=vegorov@google.com

Review URL: https://codereview.chromium.org//668193002

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@41279 260f80e4-7a28-3924-810f-c04153c831b5
2014-10-24 12:19:20 +00:00

100 lines
3.1 KiB
C++

// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "vm/globals.h"
#if defined(TARGET_ARCH_MIPS)
#include "vm/code_patcher.h"
#include "vm/cpu.h"
#include "vm/debugger.h"
#include "vm/instructions.h"
#include "vm/stub_code.h"
namespace dart {
RawInstance* ActivationFrame::GetInstanceCallReceiver(
intptr_t num_actual_args) {
ASSERT(num_actual_args > 0); // At minimum we have a receiver on the stack.
// Stack pointer points to last argument that was pushed on the stack.
uword receiver_addr = sp() + ((num_actual_args - 1) * kWordSize);
return reinterpret_cast<RawInstance*>(
*reinterpret_cast<uword*>(receiver_addr));
}
RawObject* ActivationFrame::GetClosureObject(intptr_t num_actual_args) {
// At a minimum we have the closure object on the stack.
ASSERT(num_actual_args > 0);
// Stack pointer points to last argument that was pushed on the stack.
uword closure_addr = sp() + ((num_actual_args - 1) * kWordSize);
return reinterpret_cast<RawObject*>(
*reinterpret_cast<uword*>(closure_addr));
}
uword CodeBreakpoint::OrigStubAddress() const {
return saved_value_;
}
void CodeBreakpoint::PatchCode() {
ASSERT(!is_enabled_);
const Code& code = Code::Handle(code_);
const Instructions& instrs = Instructions::Handle(code.instructions());
Isolate* isolate = Isolate::Current();
{
WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
switch (breakpoint_kind_) {
case RawPcDescriptors::kIcCall:
case RawPcDescriptors::kUnoptStaticCall: {
saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
CodePatcher::PatchStaticCallAt(
pc_, code, isolate->stub_code()->ICCallBreakpointEntryPoint());
break;
}
case RawPcDescriptors::kClosureCall: {
saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
CodePatcher::PatchStaticCallAt(
pc_, code, isolate->stub_code()->ClosureCallBreakpointEntryPoint());
break;
}
case RawPcDescriptors::kRuntimeCall: {
saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
CodePatcher::PatchStaticCallAt(
pc_, code, isolate->stub_code()->RuntimeCallBreakpointEntryPoint());
break;
}
default:
UNREACHABLE();
}
}
is_enabled_ = true;
}
void CodeBreakpoint::RestoreCode() {
ASSERT(is_enabled_);
const Code& code = Code::Handle(code_);
const Instructions& instrs = Instructions::Handle(code.instructions());
{
WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
switch (breakpoint_kind_) {
case RawPcDescriptors::kIcCall:
case RawPcDescriptors::kUnoptStaticCall:
case RawPcDescriptors::kClosureCall:
case RawPcDescriptors::kRuntimeCall: {
CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
break;
}
default:
UNREACHABLE();
}
}
is_enabled_ = false;
}
} // namespace dart
#endif // defined TARGET_ARCH_MIPS