Index: src/arm/simulator-arm.cc |
diff --git a/src/arm/simulator-arm.cc b/src/arm/simulator-arm.cc |
index 6e7c0e6897ebe550442326d1d4c50f0fd8941640..ac36687fcabe13209c2311a4973d611845ae41c4 100644 |
--- a/src/arm/simulator-arm.cc |
+++ b/src/arm/simulator-arm.cc |
@@ -846,6 +846,12 @@ class Redirection { |
return reinterpret_cast<Redirection*>(addr_of_redirection); |
} |
+ static void* ReverseRedirection(int32_t reg) { |
+ Redirection* redirection = FromSwiInstruction( |
+ reinterpret_cast<Instruction*>(reinterpret_cast<void*>(reg))); |
+ return redirection->external_function(); |
+ } |
+ |
private: |
void* external_function_; |
uint32_t swi_instruction_; |
@@ -1689,12 +1695,12 @@ typedef double (*SimulatorRuntimeFPIntCall)(double darg0, int32_t arg0); |
// This signature supports direct call in to API function native callback |
// (refer to InvocationCallback in v8.h). |
typedef void (*SimulatorRuntimeDirectApiCall)(int32_t arg0); |
-typedef void (*SimulatorRuntimeProfilingApiCall)(int32_t arg0, int32_t arg1); |
+typedef void (*SimulatorRuntimeProfilingApiCall)(int32_t arg0, void* arg1); |
// This signature supports direct call to accessor getter callback. |
typedef void (*SimulatorRuntimeDirectGetterCall)(int32_t arg0, int32_t arg1); |
typedef void (*SimulatorRuntimeProfilingGetterCall)( |
- int32_t arg0, int32_t arg1, int32_t arg2); |
+ int32_t arg0, int32_t arg1, void* arg2); |
// Software interrupt instructions are used by the simulator to call into the |
// C-based V8 runtime. |
@@ -1833,7 +1839,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
CHECK(stack_aligned); |
SimulatorRuntimeProfilingApiCall target = |
reinterpret_cast<SimulatorRuntimeProfilingApiCall>(external); |
- target(arg0, arg1); |
+ target(arg0, Redirection::ReverseRedirection(arg1)); |
} else if ( |
redirection->type() == ExternalReference::DIRECT_GETTER_CALL) { |
if (::v8::internal::FLAG_trace_sim || !stack_aligned) { |
@@ -1862,7 +1868,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) { |
SimulatorRuntimeProfilingGetterCall target = |
reinterpret_cast<SimulatorRuntimeProfilingGetterCall>( |
external); |
- target(arg0, arg1, arg2); |
+ target(arg0, arg1, Redirection::ReverseRedirection(arg2)); |
} else { |
// builtin call. |
ASSERT(redirection->type() == ExternalReference::BUILTIN_CALL); |