| Index: runtime/vm/profiler.cc
|
| diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
|
| index 840f438359bb62e7f0aca86a650467282959d987..7b8c6e70c01791d054bbbb1c3211cb2581916de2 100644
|
| --- a/runtime/vm/profiler.cc
|
| +++ b/runtime/vm/profiler.cc
|
| @@ -79,7 +79,6 @@ void Profiler::InitOnce() {
|
| initialized_ = true;
|
| }
|
|
|
| -
|
| void Profiler::InitAllocationSampleBuffer() {
|
| if (FLAG_profiler_native_memory &&
|
| (Profiler::allocation_sample_buffer_ == NULL)) {
|
| @@ -87,7 +86,6 @@ void Profiler::InitAllocationSampleBuffer() {
|
| }
|
| }
|
|
|
| -
|
| void Profiler::Shutdown() {
|
| if (!FLAG_profiler) {
|
| return;
|
| @@ -97,7 +95,6 @@ void Profiler::Shutdown() {
|
| NativeSymbolResolver::ShutdownOnce();
|
| }
|
|
|
| -
|
| void Profiler::SetSampleDepth(intptr_t depth) {
|
| const int kMinimumDepth = 2;
|
| const int kMaximumDepth = 255;
|
| @@ -110,7 +107,6 @@ void Profiler::SetSampleDepth(intptr_t depth) {
|
| }
|
| }
|
|
|
| -
|
| void Profiler::SetSamplePeriod(intptr_t period) {
|
| const int kMinimumProfilePeriod = 50;
|
| if (period < kMinimumProfilePeriod) {
|
| @@ -120,23 +116,19 @@ void Profiler::SetSamplePeriod(intptr_t period) {
|
| }
|
| }
|
|
|
| -
|
| intptr_t Sample::pcs_length_ = 0;
|
| intptr_t Sample::instance_size_ = 0;
|
|
|
| -
|
| void Sample::InitOnce() {
|
| pcs_length_ = kSampleSize;
|
| instance_size_ = sizeof(Sample) + (sizeof(uword) * pcs_length_); // NOLINT.
|
| }
|
|
|
| -
|
| uword* Sample::GetPCArray() const {
|
| return reinterpret_cast<uword*>(reinterpret_cast<uintptr_t>(this) +
|
| sizeof(*this));
|
| }
|
|
|
| -
|
| SampleBuffer::SampleBuffer(intptr_t capacity) {
|
| ASSERT(Sample::instance_size() > 0);
|
|
|
| @@ -159,21 +151,17 @@ SampleBuffer::SampleBuffer(intptr_t capacity) {
|
| }
|
| }
|
|
|
| -
|
| AllocationSampleBuffer::AllocationSampleBuffer(intptr_t capacity)
|
| : SampleBuffer(capacity), mutex_(new Mutex()) {}
|
|
|
| -
|
| SampleBuffer::~SampleBuffer() {
|
| delete memory_;
|
| }
|
|
|
| -
|
| AllocationSampleBuffer::~AllocationSampleBuffer() {
|
| delete mutex_;
|
| }
|
|
|
| -
|
| Sample* SampleBuffer::At(intptr_t idx) const {
|
| ASSERT(idx >= 0);
|
| ASSERT(idx < capacity_);
|
| @@ -182,7 +170,6 @@ Sample* SampleBuffer::At(intptr_t idx) const {
|
| return reinterpret_cast<Sample*>(samples + offset);
|
| }
|
|
|
| -
|
| intptr_t SampleBuffer::ReserveSampleSlot() {
|
| ASSERT(samples_ != NULL);
|
| uintptr_t cursor = AtomicOperations::FetchAndIncrement(&cursor_);
|
| @@ -191,12 +178,10 @@ intptr_t SampleBuffer::ReserveSampleSlot() {
|
| return cursor;
|
| }
|
|
|
| -
|
| Sample* SampleBuffer::ReserveSample() {
|
| return At(ReserveSampleSlot());
|
| }
|
|
|
| -
|
| Sample* SampleBuffer::ReserveSampleAndLink(Sample* previous) {
|
| ASSERT(previous != NULL);
|
| intptr_t next_index = ReserveSampleSlot();
|
| @@ -208,7 +193,6 @@ Sample* SampleBuffer::ReserveSampleAndLink(Sample* previous) {
|
| return next;
|
| }
|
|
|
| -
|
| void AllocationSampleBuffer::FreeAllocationSample(Sample* sample) {
|
| MutexLocker ml(mutex_);
|
| while (sample != NULL) {
|
| @@ -228,7 +212,6 @@ void AllocationSampleBuffer::FreeAllocationSample(Sample* sample) {
|
| }
|
| }
|
|
|
| -
|
| intptr_t AllocationSampleBuffer::ReserveSampleSlotLocked() {
|
| if (free_sample_list_ != NULL) {
|
| Sample* free_sample = free_sample_list_;
|
| @@ -245,7 +228,6 @@ intptr_t AllocationSampleBuffer::ReserveSampleSlotLocked() {
|
| }
|
| }
|
|
|
| -
|
| Sample* AllocationSampleBuffer::ReserveSampleAndLink(Sample* previous) {
|
| MutexLocker ml(mutex_);
|
| ASSERT(previous != NULL);
|
| @@ -265,7 +247,6 @@ Sample* AllocationSampleBuffer::ReserveSampleAndLink(Sample* previous) {
|
| return next;
|
| }
|
|
|
| -
|
| Sample* AllocationSampleBuffer::ReserveSample() {
|
| MutexLocker ml(mutex_);
|
| intptr_t index = ReserveSampleSlotLocked();
|
| @@ -275,7 +256,6 @@ Sample* AllocationSampleBuffer::ReserveSample() {
|
| return At(index);
|
| }
|
|
|
| -
|
| // Attempts to find the true return address when a Dart frame is being setup
|
| // or torn down.
|
| // NOTE: Architecture specific implementations below.
|
| @@ -328,7 +308,6 @@ class ReturnAddressLocator : public ValueObject {
|
| const Code& code_;
|
| };
|
|
|
| -
|
| #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
|
| bool ReturnAddressLocator::LocateReturnAddress(uword* return_address) {
|
| ASSERT(return_address != NULL);
|
| @@ -397,7 +376,6 @@ bool ReturnAddressLocator::LocateReturnAddress(uword* return_address) {
|
| #error ReturnAddressLocator implementation missing for this architecture.
|
| #endif
|
|
|
| -
|
| bool SampleFilter::TimeFilterSample(Sample* sample) {
|
| if ((time_origin_micros_ == -1) || (time_extent_micros_ == -1)) {
|
| // No time filter passed in, always pass.
|
| @@ -408,7 +386,6 @@ bool SampleFilter::TimeFilterSample(Sample* sample) {
|
| return (delta >= 0) && (delta <= time_extent_micros_);
|
| }
|
|
|
| -
|
| bool SampleFilter::TaskFilterSample(Sample* sample) {
|
| const intptr_t task = static_cast<intptr_t>(sample->thread_task());
|
| if (thread_task_mask_ == kNoTaskFilter) {
|
| @@ -417,16 +394,13 @@ bool SampleFilter::TaskFilterSample(Sample* sample) {
|
| return (task & thread_task_mask_) != 0;
|
| }
|
|
|
| -
|
| ClearProfileVisitor::ClearProfileVisitor(Isolate* isolate)
|
| : SampleVisitor(isolate->main_port()) {}
|
|
|
| -
|
| void ClearProfileVisitor::VisitSample(Sample* sample) {
|
| sample->Clear();
|
| }
|
|
|
| -
|
| static void DumpStackFrame(intptr_t frame_index, uword pc) {
|
| Isolate* isolate = Isolate::Current();
|
| if ((isolate != NULL) && isolate->is_runnable()) {
|
| @@ -452,7 +426,6 @@ static void DumpStackFrame(intptr_t frame_index, uword pc) {
|
| }
|
| }
|
|
|
| -
|
| class ProfilerStackWalker : public ValueObject {
|
| public:
|
| ProfilerStackWalker(Dart_Port port_id,
|
| @@ -518,7 +491,6 @@ class ProfilerStackWalker : public ValueObject {
|
| intptr_t total_frames_;
|
| };
|
|
|
| -
|
| // Executing Dart code, walk the stack.
|
| class ProfilerDartStackWalker : public ProfilerStackWalker {
|
| public:
|
| @@ -712,7 +684,6 @@ class ProfilerDartStackWalker : public ProfilerStackWalker {
|
| bool has_exit_frame_;
|
| };
|
|
|
| -
|
| // If the VM is compiled without frame pointers (which is the default on
|
| // recent GCC versions with optimizing enabled) the stack walking code may
|
| // fail.
|
| @@ -825,7 +796,6 @@ class ProfilerNativeStackWalker : public ProfilerStackWalker {
|
| uword lower_bound_;
|
| };
|
|
|
| -
|
| static void CopyStackBuffer(Sample* sample, uword sp_addr) {
|
| ASSERT(sample != NULL);
|
| uword* sp = reinterpret_cast<uword*>(sp_addr);
|
| @@ -840,7 +810,6 @@ static void CopyStackBuffer(Sample* sample, uword sp_addr) {
|
| }
|
| }
|
|
|
| -
|
| #if defined(HOST_OS_WINDOWS)
|
| // On Windows this code is synchronously executed from the thread interrupter
|
| // thread. This means we can safely have a static fault_address.
|
| @@ -919,7 +888,6 @@ static void CollectSample(Isolate* isolate,
|
| #endif
|
| }
|
|
|
| -
|
| static bool ValidateThreadStackBounds(uintptr_t fp,
|
| uintptr_t sp,
|
| uword stack_lower,
|
| @@ -942,7 +910,6 @@ static bool ValidateThreadStackBounds(uintptr_t fp,
|
| return true;
|
| }
|
|
|
| -
|
| // Get |isolate|'s stack boundary and verify that |sp| and |fp| are within
|
| // it. If |get_os_thread_bounds| is true then if |isolate| stackbounds are
|
| // not available we fallback to using underlying OS thread bounds. This only
|
| @@ -998,7 +965,6 @@ static bool GetAndValidateThreadStackBounds(Thread* thread,
|
| return ValidateThreadStackBounds(fp, sp, *stack_lower, *stack_upper);
|
| }
|
|
|
| -
|
| // Some simple sanity checking of |pc|, |fp|, and |sp|.
|
| static bool InitialRegisterCheck(uintptr_t pc, uintptr_t fp, uintptr_t sp) {
|
| if ((sp == 0) || (fp == 0) || (pc == 0)) {
|
| @@ -1015,7 +981,6 @@ static bool InitialRegisterCheck(uintptr_t pc, uintptr_t fp, uintptr_t sp) {
|
| return true;
|
| }
|
|
|
| -
|
| static Sample* SetupSample(Thread* thread,
|
| SampleBuffer* sample_buffer,
|
| ThreadId tid) {
|
| @@ -1040,7 +1005,6 @@ static Sample* SetupSample(Thread* thread,
|
| return sample;
|
| }
|
|
|
| -
|
| static Sample* SetupSampleNative(SampleBuffer* sample_buffer, ThreadId tid) {
|
| Sample* sample = sample_buffer->ReserveSample();
|
| if (sample == NULL) {
|
| @@ -1058,7 +1022,6 @@ static Sample* SetupSampleNative(SampleBuffer* sample_buffer, ThreadId tid) {
|
| return sample;
|
| }
|
|
|
| -
|
| static bool CheckIsolate(Isolate* isolate) {
|
| if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) {
|
| // No isolate.
|
| @@ -1067,7 +1030,6 @@ static bool CheckIsolate(Isolate* isolate) {
|
| return isolate != Dart::vm_isolate();
|
| }
|
|
|
| -
|
| void Profiler::DumpStackTrace(void* context) {
|
| #if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS)
|
| ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context);
|
| @@ -1082,7 +1044,6 @@ void Profiler::DumpStackTrace(void* context) {
|
| #endif
|
| }
|
|
|
| -
|
| void Profiler::DumpStackTrace(bool for_crash) {
|
| uintptr_t sp = Thread::GetCurrentStackPointer();
|
| uintptr_t fp = 0;
|
| @@ -1093,7 +1054,6 @@ void Profiler::DumpStackTrace(bool for_crash) {
|
| DumpStackTrace(sp, fp, pc, for_crash);
|
| }
|
|
|
| -
|
| void Profiler::DumpStackTrace(uword sp, uword fp, uword pc, bool for_crash) {
|
| if (for_crash) {
|
| // Allow only one stack trace to prevent recursively printing stack traces
|
| @@ -1142,7 +1102,6 @@ void Profiler::DumpStackTrace(uword sp, uword fp, uword pc, bool for_crash) {
|
| OS::PrintErr("-- End of DumpStackTrace\n");
|
| }
|
|
|
| -
|
| void Profiler::SampleAllocation(Thread* thread, intptr_t cid) {
|
| ASSERT(thread != NULL);
|
| OSThread* os_thread = thread->os_thread();
|
| @@ -1201,7 +1160,6 @@ void Profiler::SampleAllocation(Thread* thread, intptr_t cid) {
|
| }
|
| }
|
|
|
| -
|
| Sample* Profiler::SampleNativeAllocation(intptr_t skip_count,
|
| uword address,
|
| uintptr_t allocation_size) {
|
| @@ -1256,7 +1214,6 @@ Sample* Profiler::SampleNativeAllocation(intptr_t skip_count,
|
| return sample;
|
| }
|
|
|
| -
|
| void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) {
|
| ASSERT(thread != NULL);
|
| OSThread* os_thread = thread->os_thread();
|
| @@ -1282,7 +1239,6 @@ void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) {
|
| sample->SetAt(0, pc);
|
| }
|
|
|
| -
|
| void Profiler::SampleThread(Thread* thread,
|
| const InterruptedThreadState& state) {
|
| ASSERT(thread != NULL);
|
| @@ -1395,32 +1351,26 @@ void Profiler::SampleThread(Thread* thread,
|
| &counters_);
|
| }
|
|
|
| -
|
| CodeDescriptor::CodeDescriptor(const Code& code) : code_(code) {
|
| ASSERT(!code_.IsNull());
|
| }
|
|
|
| -
|
| uword CodeDescriptor::Start() const {
|
| return code_.PayloadStart();
|
| }
|
|
|
| -
|
| uword CodeDescriptor::Size() const {
|
| return code_.Size();
|
| }
|
|
|
| -
|
| int64_t CodeDescriptor::CompileTimestamp() const {
|
| return code_.compile_timestamp();
|
| }
|
|
|
| -
|
| CodeLookupTable::CodeLookupTable(Thread* thread) {
|
| Build(thread);
|
| }
|
|
|
| -
|
| class CodeLookupTableBuilder : public ObjectVisitor {
|
| public:
|
| explicit CodeLookupTableBuilder(CodeLookupTable* table) : table_(table) {
|
| @@ -1446,7 +1396,6 @@ class CodeLookupTableBuilder : public ObjectVisitor {
|
| CodeLookupTable* table_;
|
| };
|
|
|
| -
|
| void CodeLookupTable::Build(Thread* thread) {
|
| ASSERT(thread != NULL);
|
| Isolate* isolate = thread->isolate();
|
| @@ -1485,14 +1434,12 @@ void CodeLookupTable::Build(Thread* thread) {
|
| #endif
|
| }
|
|
|
| -
|
| void CodeLookupTable::Add(const Code& code) {
|
| ASSERT(!code.IsNull());
|
| CodeDescriptor* cd = new CodeDescriptor(code);
|
| code_objects_.Add(cd);
|
| }
|
|
|
| -
|
| const CodeDescriptor* CodeLookupTable::FindCode(uword pc) const {
|
| intptr_t first = 0;
|
| intptr_t count = length();
|
| @@ -1523,7 +1470,6 @@ const CodeDescriptor* CodeLookupTable::FindCode(uword pc) const {
|
| return NULL;
|
| }
|
|
|
| -
|
| ProcessedSampleBuffer* SampleBuffer::BuildProcessedSampleBuffer(
|
| SampleFilter* filter) {
|
| ASSERT(filter != NULL);
|
| @@ -1574,7 +1520,6 @@ ProcessedSampleBuffer* SampleBuffer::BuildProcessedSampleBuffer(
|
| return buffer;
|
| }
|
|
|
| -
|
| ProcessedSample* SampleBuffer::BuildProcessedSample(
|
| Sample* sample,
|
| const CodeLookupTable& clt) {
|
| @@ -1619,7 +1564,6 @@ ProcessedSample* SampleBuffer::BuildProcessedSample(
|
| return processed_sample;
|
| }
|
|
|
| -
|
| Sample* SampleBuffer::Next(Sample* sample) {
|
| if (!sample->is_continuation_sample()) return NULL;
|
| Sample* next_sample = At(sample->continuation_index());
|
| @@ -1638,7 +1582,6 @@ Sample* SampleBuffer::Next(Sample* sample) {
|
| return next_sample;
|
| }
|
|
|
| -
|
| ProcessedSample::ProcessedSample()
|
| : pcs_(kSampleSize),
|
| timestamp_(0),
|
| @@ -1648,7 +1591,6 @@ ProcessedSample::ProcessedSample()
|
| truncated_(false),
|
| timeline_trie_(NULL) {}
|
|
|
| -
|
| void ProcessedSample::FixupCaller(const CodeLookupTable& clt,
|
| uword pc_marker,
|
| uword* stack_buffer) {
|
| @@ -1664,7 +1606,6 @@ void ProcessedSample::FixupCaller(const CodeLookupTable& clt,
|
| CheckForMissingDartFrame(clt, cd, pc_marker, stack_buffer);
|
| }
|
|
|
| -
|
| void ProcessedSample::CheckForMissingDartFrame(const CodeLookupTable& clt,
|
| const CodeDescriptor* cd,
|
| uword pc_marker,
|
| @@ -1719,7 +1660,6 @@ void ProcessedSample::CheckForMissingDartFrame(const CodeLookupTable& clt,
|
| }
|
| }
|
|
|
| -
|
| ProcessedSampleBuffer::ProcessedSampleBuffer()
|
| : code_lookup_table_(new CodeLookupTable(Thread::Current())) {
|
| ASSERT(code_lookup_table_ != NULL);
|
|
|