| Index: src/arm/code-stubs-arm.cc | 
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc | 
| old mode 100644 | 
| new mode 100755 | 
| index 9cdaa120831a8cd1e6512e5cbf098e6f9b6e7b4f..452425f934801e966a8ab9e0f9e5b5148143cbb3 | 
| --- a/src/arm/code-stubs-arm.cc | 
| +++ b/src/arm/code-stubs-arm.cc | 
| @@ -3181,6 +3181,8 @@ void CEntryStub::Generate(MacroAssembler* masm) { | 
| // sp: stack pointer  (restored as callee's sp after C call) | 
| // cp: current context  (C callee-saved) | 
|  | 
| +  ProfileEntryHookStub::MaybeCallEntryHook(masm); | 
| + | 
| // Result returned in r0 or r0+r1 by default. | 
|  | 
| // NOTE: Invocations of builtins may return failure objects | 
| @@ -3271,6 +3273,8 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { | 
|  | 
| Label invoke, handler_entry, exit; | 
|  | 
| +  ProfileEntryHookStub::MaybeCallEntryHook(masm); | 
| + | 
| // Called from C, so do not pop argc and args on exit (preserve sp) | 
| // No need to save register-passed args | 
| // Save callee-saved registers (incl. cp and fp), sp, and lr | 
| @@ -7071,8 +7075,9 @@ void StubFailureTrampolineStub::Generate(MacroAssembler* masm) { | 
|  | 
|  | 
| void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { | 
| -  if (entry_hook_ != NULL) { | 
| +  if (masm->isolate()->function_entry_hook() != NULL) { | 
| PredictableCodeSizeScope predictable(masm, 4 * Assembler::kInstrSize); | 
| +    AllowStubCallsScope allow_stub_calls(masm, true); | 
| ProfileEntryHookStub stub; | 
| __ push(lr); | 
| __ CallStub(&stub); | 
| @@ -7086,9 +7091,21 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { | 
| const int32_t kReturnAddressDistanceFromFunctionStart = | 
| 3 * Assembler::kInstrSize; | 
|  | 
| -  // Save live volatile registers. | 
| -  __ Push(lr, r5, r1); | 
| -  const int32_t kNumSavedRegs = 3; | 
| +  // This should contain all kCallerSaved registers. | 
| +  const RegList kSavedRegs = | 
| +      1 <<  0 |  // r0 | 
| +      1 <<  1 |  // r1 | 
| +      1 <<  2 |  // r2 | 
| +      1 <<  3 |  // r3 | 
| +      1 <<  5 |  // r5 | 
| +      1 <<  9;   // r9 | 
| +  // We also save lr, so the count here is one higher than the mask indicates. | 
| +  const int32_t kNumSavedRegs = 7; | 
| + | 
| +  ASSERT((kCallerSaved & kSavedRegs) == kCallerSaved); | 
| + | 
| +  // Save all caller-save registers as this may be called from anywhere. | 
| +  __ stm(db_w, sp, kSavedRegs | lr.bit()); | 
|  | 
| // Compute the function's address for the first argument. | 
| __ sub(r0, lr, Operand(kReturnAddressDistanceFromFunctionStart)); | 
| @@ -7106,14 +7123,13 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { | 
| } | 
|  | 
| #if defined(V8_HOST_ARCH_ARM) | 
| -  __ mov(ip, Operand(reinterpret_cast<int32_t>(&entry_hook_))); | 
| -  __ ldr(ip, MemOperand(ip)); | 
| +  int32_t entry_hook = | 
| +      reinterpret_cast<int32_t>(masm->isolate()->function_entry_hook()); | 
| +  __ mov(ip, Operand(entry_hook)); | 
| #else | 
| // Under the simulator we need to indirect the entry hook through a | 
| // trampoline function at a known address. | 
| -  Address trampoline_address = reinterpret_cast<Address>( | 
| -      reinterpret_cast<intptr_t>(EntryHookTrampoline)); | 
| -  ApiFunction dispatcher(trampoline_address); | 
| +  ApiFunction dispatcher(FUNCTION_ADDR(EntryHookTrampoline)); | 
| __ mov(ip, Operand(ExternalReference(&dispatcher, | 
| ExternalReference::BUILTIN_CALL, | 
| masm->isolate()))); | 
| @@ -7125,8 +7141,8 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { | 
| __ mov(sp, r5); | 
| } | 
|  | 
| -  __ Pop(lr, r5, r1); | 
| -  __ Ret(); | 
| +  // Also pop pc to get Ret(0). | 
| +  __ ldm(ia_w, sp, kSavedRegs | pc.bit()); | 
| } | 
|  | 
|  | 
|  |