| Index: src/arm/simulator-arm.cc
|
| diff --git a/src/arm/simulator-arm.cc b/src/arm/simulator-arm.cc
|
| index c9db167b0e66ff644a3aa09b7df7c54dfa23c792..a29d461ebf55acf87c008b56e2c2fa9b6a5712a1 100644
|
| --- a/src/arm/simulator-arm.cc
|
| +++ b/src/arm/simulator-arm.cc
|
| @@ -830,7 +830,10 @@ class Redirection {
|
| Isolate* isolate = Isolate::Current();
|
| Redirection* current = isolate->simulator_redirection();
|
| for (; current != NULL; current = current->next_) {
|
| - if (current->external_function_ == external_function) return current;
|
| + if (current->external_function_ == external_function) {
|
| + ASSERT_EQ(current->type(), type);
|
| + return current;
|
| + }
|
| }
|
| return new Redirection(external_function, type);
|
| }
|
| @@ -1629,12 +1632,19 @@ typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0);
|
| // (refer to InvocationCallback in v8.h).
|
| typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectApiCall)(int32_t arg0);
|
| 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.
|
| typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectGetterCall)(int32_t arg0,
|
| int32_t arg1);
|
| 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.
|
| @@ -1799,6 +1809,31 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
| target(arg0);
|
| }
|
| } else if (
|
| + redirection->type() == ExternalReference::PROFILING_API_CALL ||
|
| + redirection->type() == ExternalReference::PROFILING_API_CALL_NEW) {
|
| + if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| + PrintF("Call to host function at %p args %08x %08x",
|
| + reinterpret_cast<void*>(external), arg0, arg1);
|
| + if (!stack_aligned) {
|
| + PrintF(" with unaligned stack %08x\n", get_register(sp));
|
| + }
|
| + PrintF("\n");
|
| + }
|
| + CHECK(stack_aligned);
|
| + if (redirection->type() == ExternalReference::PROFILING_API_CALL) {
|
| + SimulatorRuntimeProfilingApiCall target =
|
| + reinterpret_cast<SimulatorRuntimeProfilingApiCall>(external);
|
| + v8::Handle<v8::Value> result = target(arg0, arg1);
|
| + if (::v8::internal::FLAG_trace_sim) {
|
| + PrintF("Returned %p\n", reinterpret_cast<void *>(*result));
|
| + }
|
| + set_register(r0, reinterpret_cast<int32_t>(*result));
|
| + } else {
|
| + 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 (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| @@ -1823,6 +1858,32 @@ 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 (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| + PrintF("Call to host function at %p args %08x %08x %08x",
|
| + reinterpret_cast<void*>(external), arg0, arg1, arg2);
|
| + if (!stack_aligned) {
|
| + PrintF(" with unaligned stack %08x\n", get_register(sp));
|
| + }
|
| + PrintF("\n");
|
| + }
|
| + CHECK(stack_aligned);
|
| + if (redirection->type() == ExternalReference::PROFILING_GETTER_CALL) {
|
| + SimulatorRuntimeProfilingGetterCall target =
|
| + reinterpret_cast<SimulatorRuntimeProfilingGetterCall>(external);
|
| + v8::Handle<v8::Value> result = target(arg0, arg1, arg2);
|
| + if (::v8::internal::FLAG_trace_sim) {
|
| + PrintF("Returned %p\n", reinterpret_cast<void *>(*result));
|
| + }
|
| + set_register(r0, reinterpret_cast<int32_t>(*result));
|
| + } else {
|
| + SimulatorRuntimeProfilingGetterCallNew target =
|
| + reinterpret_cast<SimulatorRuntimeProfilingGetterCallNew>(
|
| + external);
|
| + target(arg0, arg1, arg2);
|
| + }
|
| } else {
|
| // builtin call.
|
| ASSERT(redirection->type() == ExternalReference::BUILTIN_CALL);
|
| @@ -1830,7 +1891,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
|
| reinterpret_cast<SimulatorRuntimeCall>(external);
|
| if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| PrintF(
|
| - "Call to host function at %p"
|
| + "Call to host function at %p "
|
| "args %08x, %08x, %08x, %08x, %08x, %08x",
|
| FUNCTION_ADDR(target),
|
| arg0,
|
|
|