Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 16578008: Improved function entry hook coverage (Closed) Base URL: https://chromium.googlesource.com/external/v8.git@post_fix
Patch Set: Fix Windows X64 compile warnings." Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ia32/builtins-ia32.cc ('k') | src/ic.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 5059 matching lines...) Expand 10 before | Expand all | Expand 10 after
5070 5070
5071 5071
5072 void CEntryStub::Generate(MacroAssembler* masm) { 5072 void CEntryStub::Generate(MacroAssembler* masm) {
5073 // eax: number of arguments including receiver 5073 // eax: number of arguments including receiver
5074 // ebx: pointer to C function (C callee-saved) 5074 // ebx: pointer to C function (C callee-saved)
5075 // ebp: frame pointer (restored after C call) 5075 // ebp: frame pointer (restored after C call)
5076 // esp: stack pointer (restored after C call) 5076 // esp: stack pointer (restored after C call)
5077 // esi: current context (C callee-saved) 5077 // esi: current context (C callee-saved)
5078 // edi: JS function of the caller (C callee-saved) 5078 // edi: JS function of the caller (C callee-saved)
5079 5079
5080 ProfileEntryHookStub::MaybeCallEntryHook(masm);
5081
5080 // NOTE: Invocations of builtins may return failure objects instead 5082 // NOTE: Invocations of builtins may return failure objects instead
5081 // of a proper result. The builtin entry handles this by performing 5083 // of a proper result. The builtin entry handles this by performing
5082 // a garbage collection and retrying the builtin (twice). 5084 // a garbage collection and retrying the builtin (twice).
5083 5085
5084 // Enter the exit frame that transitions from JavaScript to C++. 5086 // Enter the exit frame that transitions from JavaScript to C++.
5085 __ EnterExitFrame(save_doubles_ == kSaveFPRegs); 5087 __ EnterExitFrame(save_doubles_ == kSaveFPRegs);
5086 5088
5087 // eax: result parameter for PerformGC, if any (setup below) 5089 // eax: result parameter for PerformGC, if any (setup below)
5088 // ebx: pointer to builtin function (C callee-saved) 5090 // ebx: pointer to builtin function (C callee-saved)
5089 // ebp: frame pointer (restored after C call) 5091 // ebp: frame pointer (restored after C call)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5143 5145
5144 __ bind(&throw_normal_exception); 5146 __ bind(&throw_normal_exception);
5145 __ Throw(eax); 5147 __ Throw(eax);
5146 } 5148 }
5147 5149
5148 5150
5149 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { 5151 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
5150 Label invoke, handler_entry, exit; 5152 Label invoke, handler_entry, exit;
5151 Label not_outermost_js, not_outermost_js_2; 5153 Label not_outermost_js, not_outermost_js_2;
5152 5154
5155 ProfileEntryHookStub::MaybeCallEntryHook(masm);
5156
5153 // Set up frame. 5157 // Set up frame.
5154 __ push(ebp); 5158 __ push(ebp);
5155 __ mov(ebp, esp); 5159 __ mov(ebp, esp);
5156 5160
5157 // Push marker in two places. 5161 // Push marker in two places.
5158 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY; 5162 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY;
5159 __ push(Immediate(Smi::FromInt(marker))); // context slot 5163 __ push(Immediate(Smi::FromInt(marker))); // context slot
5160 __ push(Immediate(Smi::FromInt(marker))); // function slot 5164 __ push(Immediate(Smi::FromInt(marker))); // function slot
5161 // Save callee-saved registers (C calling conventions). 5165 // Save callee-saved registers (C calling conventions).
5162 __ push(edi); 5166 __ push(edi);
(...skipping 2521 matching lines...) Expand 10 before | Expand all | Expand 10 after
7684 __ pop(ecx); 7688 __ pop(ecx);
7685 int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE 7689 int additional_offset = function_mode_ == JS_FUNCTION_STUB_MODE
7686 ? kPointerSize 7690 ? kPointerSize
7687 : 0; 7691 : 0;
7688 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset)); 7692 __ lea(esp, MemOperand(esp, ebx, times_pointer_size, additional_offset));
7689 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack. 7693 __ jmp(ecx); // Return to IC Miss stub, continuation still on stack.
7690 } 7694 }
7691 7695
7692 7696
7693 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) { 7697 void ProfileEntryHookStub::MaybeCallEntryHook(MacroAssembler* masm) {
7694 if (entry_hook_ != NULL) { 7698 if (masm->isolate()->function_entry_hook() != NULL) {
7699 // It's always safe to call the entry hook stub, as the hook itself
7700 // is not allowed to call back to V8.
7701 AllowStubCallsScope allow_stub_calls(masm, true);
7702
7695 ProfileEntryHookStub stub; 7703 ProfileEntryHookStub stub;
7696 masm->CallStub(&stub); 7704 masm->CallStub(&stub);
7697 } 7705 }
7698 } 7706 }
7699 7707
7700 7708
7701 void ProfileEntryHookStub::Generate(MacroAssembler* masm) { 7709 void ProfileEntryHookStub::Generate(MacroAssembler* masm) {
7702 // Ecx is the only volatile register we must save. 7710 // Save volatile registers.
7703 const int kNumSavedRegisters = 1; 7711 const int kNumSavedRegisters = 3;
7712 __ push(eax);
7704 __ push(ecx); 7713 __ push(ecx);
7714 __ push(edx);
7705 7715
7706 // Calculate and push the original stack pointer. 7716 // Calculate and push the original stack pointer.
7707 __ lea(eax, Operand(esp, (kNumSavedRegisters + 1) * kPointerSize)); 7717 __ lea(eax, Operand(esp, (kNumSavedRegisters + 1) * kPointerSize));
7708 __ push(eax); 7718 __ push(eax);
7709 7719
7710 // Retrieve our return address and use it to calculate the calling 7720 // Retrieve our return address and use it to calculate the calling
7711 // function's address. 7721 // function's address.
7712 __ mov(eax, Operand(esp, (kNumSavedRegisters + 1) * kPointerSize)); 7722 __ mov(eax, Operand(esp, (kNumSavedRegisters + 1) * kPointerSize));
7713 __ sub(eax, Immediate(Assembler::kCallInstructionLength)); 7723 __ sub(eax, Immediate(Assembler::kCallInstructionLength));
7714 __ push(eax); 7724 __ push(eax);
7715 7725
7716 // Call the entry hook. 7726 // Call the entry hook.
7717 int32_t hook_location = reinterpret_cast<int32_t>(&entry_hook_); 7727 ASSERT(masm->isolate()->function_entry_hook() != NULL);
7718 __ call(Operand(hook_location, RelocInfo::NONE32)); 7728 __ call(FUNCTION_ADDR(masm->isolate()->function_entry_hook()),
7729 RelocInfo::RUNTIME_ENTRY);
7719 __ add(esp, Immediate(2 * kPointerSize)); 7730 __ add(esp, Immediate(2 * kPointerSize));
7720 7731
7721 // Restore ecx. 7732 // Restore ecx.
7733 __ pop(edx);
7722 __ pop(ecx); 7734 __ pop(ecx);
7735 __ pop(eax);
7736
7723 __ ret(0); 7737 __ ret(0);
7724 } 7738 }
7725 7739
7726 7740
7727 template<class T> 7741 template<class T>
7728 static void CreateArrayDispatch(MacroAssembler* masm) { 7742 static void CreateArrayDispatch(MacroAssembler* masm) {
7729 int last_index = GetSequenceIndexFromFastElementsKind( 7743 int last_index = GetSequenceIndexFromFastElementsKind(
7730 TERMINAL_FAST_ELEMENTS_KIND); 7744 TERMINAL_FAST_ELEMENTS_KIND);
7731 for (int i = 0; i <= last_index; ++i) { 7745 for (int i = 0; i <= last_index; ++i) {
7732 Label next; 7746 Label next;
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
7998 __ bind(&fast_elements_case); 8012 __ bind(&fast_elements_case);
7999 GenerateCase(masm, FAST_ELEMENTS); 8013 GenerateCase(masm, FAST_ELEMENTS);
8000 } 8014 }
8001 8015
8002 8016
8003 #undef __ 8017 #undef __
8004 8018
8005 } } // namespace v8::internal 8019 } } // namespace v8::internal
8006 8020
8007 #endif // V8_TARGET_ARCH_IA32 8021 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/builtins-ia32.cc ('k') | src/ic.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698