Index: src/mips/simulator-mips.cc |
diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc |
index d8a39ab30c764701e2d481f62c9affd3cd601f07..8771bd29f78367a7d28226de20a2525a7bd80cd9 100644 |
--- a/src/mips/simulator-mips.cc |
+++ b/src/mips/simulator-mips.cc |
@@ -1394,6 +1394,9 @@ typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectApiCall)(int32_t arg0); |
// Here, we pass the first argument in a0, because this function |
// does not return a struct. |
typedef void (*SimulatorRuntimeDirectApiCallNew)(int32_t arg0); |
+typedef v8::Handle<v8::Value> (*SimulatorRuntimeProfilingApiCall)( |
+ int32_t arg0, int32_t arg1); |
+typedef void (*SimulatorRuntimeProfilingApiCallNew)(int32_t arg0, int32_t arg1); |
// This signature supports direct call to accessor getter callback. |
// See comment at SimulatorRuntimeDirectApiCall. |
@@ -1402,6 +1405,10 @@ typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectGetterCall)(int32_t arg0, |
// See comment at SimulatorRuntimeDirectApiCallNew. |
typedef void (*SimulatorRuntimeDirectGetterCallNew)(int32_t arg0, |
int32_t arg1); |
+typedef v8::Handle<v8::Value> (*SimulatorRuntimeProfilingGetterCall)( |
+ int32_t arg0, int32_t arg1, int32_t arg2); |
+typedef void (*SimulatorRuntimeProfilingGetterCallNew)( |
+ int32_t arg0, int32_t arg1, int32_t arg2); |
// Software interrupt instructions are used by the simulator to call into the |
// C-based V8 runtime. They are also used for debugging with simulator. |
@@ -1571,6 +1578,30 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
target(arg0); |
} |
} else if ( |
+ redirection->type() == ExternalReference::PROFILING_API_CALL || |
+ redirection->type() == ExternalReference::PROFILING_API_CALL_NEW) { |
+ if (redirection->type() == ExternalReference::PROFILING_API_CALL) { |
+ // See comment at type definition of SimulatorRuntimeDirectApiCall |
+ // for explanation of register usage. |
+ if (::v8::internal::FLAG_trace_sim) { |
+ PrintF("Call to host function at %p args %08x %08x\n", |
+ reinterpret_cast<void*>(external), arg1, arg2); |
+ } |
+ SimulatorRuntimeProfilingApiCall target = |
+ reinterpret_cast<SimulatorRuntimeProfilingApiCall>(external); |
+ v8::Handle<v8::Value> result = target(arg1, arg2); |
+ *(reinterpret_cast<int*>(arg0)) = reinterpret_cast<int32_t>(*result); |
+ set_register(v0, arg0); |
+ } else { |
+ if (::v8::internal::FLAG_trace_sim) { |
+ PrintF("Call to host function at %p args %08x %08x\n", |
+ reinterpret_cast<void*>(external), arg0, arg1); |
+ } |
+ SimulatorRuntimeProfilingApiCallNew target = |
+ reinterpret_cast<SimulatorRuntimeProfilingApiCallNew>(external); |
+ target(arg0, arg1); |
+ } |
+ } else if ( |
redirection->type() == ExternalReference::DIRECT_GETTER_CALL || |
redirection->type() == ExternalReference::DIRECT_GETTER_CALL_NEW) { |
if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) { |
@@ -1594,6 +1625,30 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
reinterpret_cast<SimulatorRuntimeDirectGetterCallNew>(external); |
target(arg0, arg1); |
} |
+ } else if ( |
+ redirection->type() == ExternalReference::PROFILING_GETTER_CALL || |
+ redirection->type() == ExternalReference::PROFILING_GETTER_CALL_NEW) { |
+ if (redirection->type() == ExternalReference::PROFILING_GETTER_CALL) { |
+ // See comment at type definition of SimulatorRuntimeProfilingGetterCall |
+ // for explanation of register usage. |
+ if (::v8::internal::FLAG_trace_sim) { |
+ PrintF("Call to host function at %p args %08x %08x %08x\n", |
+ reinterpret_cast<void*>(external), arg1, arg2, arg3); |
+ } |
+ SimulatorRuntimeProfilingGetterCall target = |
+ reinterpret_cast<SimulatorRuntimeProfilingGetterCall>(external); |
+ v8::Handle<v8::Value> result = target(arg1, arg2, arg3); |
+ *(reinterpret_cast<int*>(arg0)) = reinterpret_cast<int32_t>(*result); |
+ set_register(v0, arg0); |
+ } else { |
+ if (::v8::internal::FLAG_trace_sim) { |
+ PrintF("Call to host function at %p args %08x %08x %08x\n", |
+ reinterpret_cast<void*>(external), arg0, arg1, arg2); |
+ } |
+ SimulatorRuntimeProfilingGetterCallNew target = |
+ reinterpret_cast<SimulatorRuntimeProfilingGetterCallNew>(external); |
+ target(arg0, arg1, arg2); |
+ } |
} else { |
SimulatorRuntimeCall target = |
reinterpret_cast<SimulatorRuntimeCall>(external); |