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

Side by Side Diff: src/api.cc

Issue 578163002: Implemented GetSample. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Including win32-headers.h in v8.h for testing on trybots. Created 6 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 22 matching lines...) Expand all
33 #include "src/json-parser.h" 33 #include "src/json-parser.h"
34 #include "src/messages.h" 34 #include "src/messages.h"
35 #include "src/natives.h" 35 #include "src/natives.h"
36 #include "src/parser.h" 36 #include "src/parser.h"
37 #include "src/profile-generator-inl.h" 37 #include "src/profile-generator-inl.h"
38 #include "src/property.h" 38 #include "src/property.h"
39 #include "src/property-details.h" 39 #include "src/property-details.h"
40 #include "src/prototype.h" 40 #include "src/prototype.h"
41 #include "src/runtime.h" 41 #include "src/runtime.h"
42 #include "src/runtime-profiler.h" 42 #include "src/runtime-profiler.h"
43 #include "src/sampler.h"
43 #include "src/scanner-character-streams.h" 44 #include "src/scanner-character-streams.h"
44 #include "src/simulator.h" 45 #include "src/simulator.h"
45 #include "src/snapshot.h" 46 #include "src/snapshot.h"
46 #include "src/unicode-inl.h" 47 #include "src/unicode-inl.h"
47 #include "src/v8threads.h" 48 #include "src/v8threads.h"
48 #include "src/version.h" 49 #include "src/version.h"
49 #include "src/vm-state-inl.h" 50 #include "src/vm-state-inl.h"
50 51
51 52
52 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) 53 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr))
(...skipping 6565 matching lines...) Expand 10 before | Expand all | Expand 10 after
6618 } 6619 }
6619 6620
6620 6621
6621 void V8::CancelTerminateExecution(Isolate* isolate) { 6622 void V8::CancelTerminateExecution(Isolate* isolate) {
6622 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6623 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6623 i_isolate->stack_guard()->ClearTerminateExecution(); 6624 i_isolate->stack_guard()->ClearTerminateExecution();
6624 i_isolate->CancelTerminateExecution(); 6625 i_isolate->CancelTerminateExecution();
6625 } 6626 }
6626 6627
6627 6628
6629 RegisterState::RegisterState(const context_t& context) {
6630 #if V8_OS_POSIX && !V8_OS_CYGWIN
yurys 2014/09/19 08:08:12 One of the goals of having sampler API is to event
6631 #if !V8_OS_OPENBSD
6632 const mcontext_t& mcontext = context.uc_mcontext;
6633 #endif
6634 #if V8_OS_LINUX
6635 #if V8_HOST_ARCH_IA32
6636 pc = reinterpret_cast<void*>(mcontext.gregs[REG_EIP]);
6637 sp = reinterpret_cast<void*>(mcontext.gregs[REG_ESP]);
6638 fp = reinterpret_cast<void*>(mcontext.gregs[REG_EBP]);
6639 #elif V8_HOST_ARCH_X64
6640 pc = reinterpret_cast<void*>(mcontext.gregs[REG_RIP]);
6641 sp = reinterpret_cast<void*>(mcontext.gregs[REG_RSP]);
6642 fp = reinterpret_cast<void*>(mcontext.gregs[REG_RBP]);
6643 #elif V8_HOST_ARCH_ARM
6644 #if defined(__GLIBC__) && !defined(__UCLIBC__) && \
6645 (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
6646 // Old GLibc ARM versions used a gregs[] array to access the register
6647 // values from mcontext_t.
6648 pc = reinterpret_cast<void*>(mcontext.gregs[R15]);
6649 sp = reinterpret_cast<void*>(mcontext.gregs[R13]);
6650 fp = reinterpret_cast<void*>(mcontext.gregs[R11]);
6651 #else
6652 pc = reinterpret_cast<void*>(mcontext.arm_pc);
6653 sp = reinterpret_cast<void*>(mcontext.arm_sp);
6654 fp = reinterpret_cast<void*>(mcontext.arm_fp);
6655 #endif // defined(__GLIBC__) && !defined(__UCLIBC__) &&
6656 // (__GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 3))
6657 #elif V8_HOST_ARCH_ARM64
6658 pc = reinterpret_cast<void*>(mcontext.pc);
6659 sp = reinterpret_cast<void*>(mcontext.sp);
6660 // FP is an alias for x29.
6661 fp = reinterpret_cast<void*>(mcontext.regs[29]);
6662 #elif V8_HOST_ARCH_MIPS
6663 pc = reinterpret_cast<void*>(mcontext.pc);
6664 sp = reinterpret_cast<void*>(mcontext.gregs[29]);
6665 fp = reinterpret_cast<void*>(mcontext.gregs[30]);
6666 #elif V8_HOST_ARCH_MIPS64
6667 pc = reinterpret_cast<void*>(mcontext.pc);
6668 sp = reinterpret_cast<void*>(mcontext.gregs[29]);
6669 fp = reinterpret_cast<void*>(mcontext.gregs[30]);
6670 #endif // V8_HOST_ARCH_*
6671 #elif V8_OS_MACOSX
6672 #if V8_HOST_ARCH_X64
6673 #if __DARWIN_UNIX03
6674 pc = reinterpret_cast<void*>(mcontext->__ss.__rip);
6675 sp = reinterpret_cast<void*>(mcontext->__ss.__rsp);
6676 fp = reinterpret_cast<void*>(mcontext->__ss.__rbp);
6677 #else // !__DARWIN_UNIX03
6678 pc = reinterpret_cast<void*>(mcontext->ss.rip);
6679 sp = reinterpret_cast<void*>(mcontext->ss.rsp);
6680 fp = reinterpret_cast<void*>(mcontext->ss.rbp);
6681 #endif // __DARWIN_UNIX03
6682 #elif V8_HOST_ARCH_IA32
6683 #if __DARWIN_UNIX03
6684 pc = reinterpret_cast<void*>(mcontext->__ss.__eip);
6685 sp = reinterpret_cast<void*>(mcontext->__ss.__esp);
6686 fp = reinterpret_cast<void*>(mcontext->__ss.__ebp);
6687 #else // !__DARWIN_UNIX03
6688 pc = reinterpret_cast<void*>(mcontext->ss.eip);
6689 sp = reinterpret_cast<void*>(mcontext->ss.esp);
6690 fp = reinterpret_cast<void*>(mcontext->ss.ebp);
6691 #endif // __DARWIN_UNIX03
6692 #endif // V8_HOST_ARCH_IA32
6693 #elif V8_OS_FREEBSD
6694 #if V8_HOST_ARCH_IA32
6695 pc = reinterpret_cast<void*>(mcontext.mc_eip);
6696 sp = reinterpret_cast<void*>(mcontext.mc_esp);
6697 fp = reinterpret_cast<void*>(mcontext.mc_ebp);
6698 #elif V8_HOST_ARCH_X64
6699 pc = reinterpret_cast<void*>(mcontext.mc_rip);
6700 sp = reinterpret_cast<void*>(mcontext.mc_rsp);
6701 fp = reinterpret_cast<void*>(mcontext.mc_rbp);
6702 #elif V8_HOST_ARCH_ARM
6703 pc = reinterpret_cast<void*>(mcontext.mc_r15);
6704 sp = reinterpret_cast<void*>(mcontext.mc_r13);
6705 fp = reinterpret_cast<void*>(mcontext.mc_r11);
6706 #endif // V8_HOST_ARCH_*
6707 #elif V8_OS_NETBSD
6708 #if V8_HOST_ARCH_IA32
6709 pc = reinterpret_cast<void*>(mcontext.__gregs[_REG_EIP]);
6710 sp = reinterpret_cast<void*>(mcontext.__gregs[_REG_ESP]);
6711 fp = reinterpret_cast<void*>(mcontext.__gregs[_REG_EBP]);
6712 #elif V8_HOST_ARCH_X64
6713 pc = reinterpret_cast<void*>(mcontext.__gregs[_REG_RIP]);
6714 sp = reinterpret_cast<void*>(mcontext.__gregs[_REG_RSP]);
6715 fp = reinterpret_cast<void*>(mcontext.__gregs[_REG_RBP]);
6716 #endif // V8_HOST_ARCH_*
6717 #elif V8_OS_OPENBSD
6718 #if V8_HOST_ARCH_IA32
6719 pc = reinterpret_cast<void*>(ucontext->sc_eip);
6720 sp = reinterpret_cast<void*>(ucontext->sc_esp);
6721 fp = reinterpret_cast<void*>(ucontext->sc_ebp);
6722 #elif V8_HOST_ARCH_X64
6723 pc = reinterpret_cast<void*>(ucontext->sc_rip);
6724 sp = reinterpret_cast<void*>(ucontext->sc_rsp);
6725 fp = reinterpret_cast<void*>(ucontext->sc_rbp);
6726 #endif // V8_HOST_ARCH_*
6727 #elif V8_OS_SOLARIS
6728 pc = reinterpret_cast<void*>(mcontext.gregs[REG_PC]);
6729 sp = reinterpret_cast<void*>(mcontext.gregs[REG_SP]);
6730 fp = reinterpret_cast<void*>(mcontext.gregs[REG_FP]);
6731 #elif V8_OS_QNX
6732 #if V8_HOST_ARCH_IA32
6733 pc = reinterpret_cast<void*>(mcontext.cpu.eip);
6734 sp = reinterpret_cast<void*>(mcontext.cpu.esp);
6735 fp = reinterpret_cast<void*>(mcontext.cpu.ebp);
6736 #elif V8_HOST_ARCH_ARM
6737 pc = reinterpret_cast<void*>(mcontext.cpu.gpr[ARM_REG_PC]);
6738 sp = reinterpret_cast<void*>(mcontext.cpu.gpr[ARM_REG_SP]);
6739 fp = reinterpret_cast<void*>(mcontext.cpu.gpr[ARM_REG_FP]);
6740 #endif // V8_HOST_ARCH_*
6741 #endif // V8_OS_QNX
6742
6743 #elif V8_OS_WIN || V8_OS_CYGWIN
6744 #if V8_HOST_ARCH_X64
6745 pc = reinterpret_cast<void*>(context.Rip);
6746 sp = reinterpret_cast<void*>(context.Rsp);
6747 fp = reinterpret_cast<void*>(context.Rbp);
6748 #else
6749 pc = reinterpret_cast<void*>(context.Eip);
6750 sp = reinterpret_cast<void*>(context.Esp);
6751 fp = reinterpret_cast<void*>(context.Ebp);
6752 #endif // V8_HOST_ARCH_X64
6753 #endif // V8_OS_POSIX && !V8_OS_CYGWIN / V8_OS_WIN || V8_OS_CYGWIN
6754 }
6755
6756
6628 void Isolate::RequestInterrupt(InterruptCallback callback, void* data) { 6757 void Isolate::RequestInterrupt(InterruptCallback callback, void* data) {
6629 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this); 6758 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
6630 i_isolate->set_api_interrupt_callback(callback); 6759 i_isolate->set_api_interrupt_callback(callback);
6631 i_isolate->set_api_interrupt_callback_data(data); 6760 i_isolate->set_api_interrupt_callback_data(data);
6632 i_isolate->stack_guard()->RequestApiInterrupt(); 6761 i_isolate->stack_guard()->RequestApiInterrupt();
6633 } 6762 }
6634 6763
6635 6764
6636 void Isolate::ClearInterrupt() { 6765 void Isolate::ClearInterrupt() {
6637 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this); 6766 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
6768 i::Heap* heap = isolate->heap(); 6897 i::Heap* heap = isolate->heap();
6769 heap_statistics->total_heap_size_ = heap->CommittedMemory(); 6898 heap_statistics->total_heap_size_ = heap->CommittedMemory();
6770 heap_statistics->total_heap_size_executable_ = 6899 heap_statistics->total_heap_size_executable_ =
6771 heap->CommittedMemoryExecutable(); 6900 heap->CommittedMemoryExecutable();
6772 heap_statistics->total_physical_size_ = heap->CommittedPhysicalMemory(); 6901 heap_statistics->total_physical_size_ = heap->CommittedPhysicalMemory();
6773 heap_statistics->used_heap_size_ = heap->SizeOfObjects(); 6902 heap_statistics->used_heap_size_ = heap->SizeOfObjects();
6774 heap_statistics->heap_size_limit_ = heap->MaxReserved(); 6903 heap_statistics->heap_size_limit_ = heap->MaxReserved();
6775 } 6904 }
6776 6905
6777 6906
6907 void Isolate::GetSample(const RegisterState& state, Sample* sample) {
6908 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
6909 i::TickSample tick_sample;
6910 tick_sample.Init(isolate, state);
loislo 2014/09/19 08:58:16 can we pass sample into Init method and fill it th
6911 sample = new (sample) Sample(&tick_sample.stack[0],
6912 &tick_sample.stack[tick_sample.frames_count]);
6913 }
6914
6915
6778 void Isolate::SetEventLogger(LogEventCallback that) { 6916 void Isolate::SetEventLogger(LogEventCallback that) {
6779 // Do not overwrite the event logger if we want to log explicitly. 6917 // Do not overwrite the event logger if we want to log explicitly.
6780 if (i::FLAG_log_timer_events) return; 6918 if (i::FLAG_log_timer_events) return;
6781 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 6919 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
6782 isolate->set_event_logger(that); 6920 isolate->set_event_logger(that);
6783 } 6921 }
6784 6922
6785 6923
6786 void Isolate::AddCallCompletedCallback(CallCompletedCallback callback) { 6924 void Isolate::AddCallCompletedCallback(CallCompletedCallback callback) {
6787 if (callback == NULL) return; 6925 if (callback == NULL) return;
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after
7745 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 7883 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
7746 Address callback_address = 7884 Address callback_address =
7747 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 7885 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
7748 VMState<EXTERNAL> state(isolate); 7886 VMState<EXTERNAL> state(isolate);
7749 ExternalCallbackScope call_scope(isolate, callback_address); 7887 ExternalCallbackScope call_scope(isolate, callback_address);
7750 callback(info); 7888 callback(info);
7751 } 7889 }
7752 7890
7753 7891
7754 } } // namespace v8::internal 7892 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698