| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/address_sanitizer.h" | 5 #include "platform/address_sanitizer.h" |
| 6 #include "platform/memory_sanitizer.h" | 6 #include "platform/memory_sanitizer.h" |
| 7 #include "platform/utils.h" | 7 #include "platform/utils.h" |
| 8 | 8 |
| 9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
| 10 #include "vm/atomic.h" | 10 #include "vm/atomic.h" |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 } | 457 } |
| 458 | 458 |
| 459 void walk() { | 459 void walk() { |
| 460 sample_->set_exit_frame_sample(false); | 460 sample_->set_exit_frame_sample(false); |
| 461 if (!ValidFramePointer()) { | 461 if (!ValidFramePointer()) { |
| 462 sample_->set_ignore_sample(true); | 462 sample_->set_ignore_sample(true); |
| 463 return; | 463 return; |
| 464 } | 464 } |
| 465 ASSERT(ValidFramePointer()); | 465 ASSERT(ValidFramePointer()); |
| 466 uword return_pc = InitialReturnAddress(); | 466 uword return_pc = InitialReturnAddress(); |
| 467 if (StubCode::InInvocationStubForIsolate(isolate_, return_pc)) { | 467 if (StubCode::InInvocationStub(return_pc)) { |
| 468 // Edge case- we have called out from the Invocation Stub but have not | 468 // Edge case- we have called out from the Invocation Stub but have not |
| 469 // created the stack frame of the callee. Attempt to locate the exit | 469 // created the stack frame of the callee. Attempt to locate the exit |
| 470 // frame before walking the stack. | 470 // frame before walking the stack. |
| 471 if (!NextExit() || !ValidFramePointer()) { | 471 if (!NextExit() || !ValidFramePointer()) { |
| 472 // Nothing to sample. | 472 // Nothing to sample. |
| 473 sample_->set_ignore_sample(true); | 473 sample_->set_ignore_sample(true); |
| 474 return; | 474 return; |
| 475 } | 475 } |
| 476 } | 476 } |
| 477 for (int i = 0; i < NumberOfFramesToCollect(); i++) { | 477 for (int i = 0; i < NumberOfFramesToCollect(); i++) { |
| 478 sample_->SetAt(i, reinterpret_cast<uword>(pc_)); | 478 sample_->SetAt(i, reinterpret_cast<uword>(pc_)); |
| 479 if (!Next()) { | 479 if (!Next()) { |
| 480 return; | 480 return; |
| 481 } | 481 } |
| 482 } | 482 } |
| 483 sample_->set_truncated_trace(true); | 483 sample_->set_truncated_trace(true); |
| 484 } | 484 } |
| 485 | 485 |
| 486 private: | 486 private: |
| 487 bool Next() { | 487 bool Next() { |
| 488 if (!ValidFramePointer()) { | 488 if (!ValidFramePointer()) { |
| 489 return false; | 489 return false; |
| 490 } | 490 } |
| 491 if (StubCode::InInvocationStubForIsolate(isolate_, | 491 if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_))) { |
| 492 reinterpret_cast<uword>(pc_))) { | |
| 493 // In invocation stub. | 492 // In invocation stub. |
| 494 return NextExit(); | 493 return NextExit(); |
| 495 } | 494 } |
| 496 // In regular Dart frame. | 495 // In regular Dart frame. |
| 497 uword* new_pc = CallerPC(); | 496 uword* new_pc = CallerPC(); |
| 498 // Check if we've moved into the invocation stub. | 497 // Check if we've moved into the invocation stub. |
| 499 if (StubCode::InInvocationStubForIsolate(isolate_, | 498 if (StubCode::InInvocationStub(reinterpret_cast<uword>(new_pc))) { |
| 500 reinterpret_cast<uword>(new_pc))) { | |
| 501 // New PC is inside invocation stub, skip. | 499 // New PC is inside invocation stub, skip. |
| 502 return NextExit(); | 500 return NextExit(); |
| 503 } | 501 } |
| 504 uword* new_fp = CallerFP(); | 502 uword* new_fp = CallerFP(); |
| 505 if (new_fp <= fp_) { | 503 if (new_fp <= fp_) { |
| 506 // FP didn't move to a higher address. | 504 // FP didn't move to a higher address. |
| 507 return false; | 505 return false; |
| 508 } | 506 } |
| 509 // Success, update fp and pc. | 507 // Success, update fp and pc. |
| 510 fp_ = new_fp; | 508 fp_ = new_fp; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 } | 818 } |
| 821 | 819 |
| 822 | 820 |
| 823 void Profiler::RecordAllocation(Isolate* isolate, intptr_t cid) { | 821 void Profiler::RecordAllocation(Isolate* isolate, intptr_t cid) { |
| 824 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { | 822 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { |
| 825 // No isolate. | 823 // No isolate. |
| 826 return; | 824 return; |
| 827 } | 825 } |
| 828 ASSERT(isolate != Dart::vm_isolate()); | 826 ASSERT(isolate != Dart::vm_isolate()); |
| 829 | 827 |
| 830 const bool exited_dart_code = (isolate->stub_code() != NULL) && | 828 const bool exited_dart_code = (isolate->top_exit_frame_info() != 0) && |
| 831 (isolate->top_exit_frame_info() != 0) && | |
| 832 (isolate->vm_tag() != VMTag::kDartTagId); | 829 (isolate->vm_tag() != VMTag::kDartTagId); |
| 833 | 830 |
| 834 if (!exited_dart_code) { | 831 if (!exited_dart_code) { |
| 835 // No Dart frames on stack. | 832 // No Dart frames on stack. |
| 836 // TODO(johnmccutchan): Support collecting native stack. | 833 // TODO(johnmccutchan): Support collecting native stack. |
| 837 return; | 834 return; |
| 838 } | 835 } |
| 839 | 836 |
| 840 IsolateProfilerData* profiler_data = isolate->profiler_data(); | 837 IsolateProfilerData* profiler_data = isolate->profiler_data(); |
| 841 if (profiler_data == NULL) { | 838 if (profiler_data == NULL) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 const InterruptedThreadState& state, | 873 const InterruptedThreadState& state, |
| 877 void* data) { | 874 void* data) { |
| 878 Isolate* isolate = reinterpret_cast<Isolate*>(data); | 875 Isolate* isolate = reinterpret_cast<Isolate*>(data); |
| 879 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { | 876 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { |
| 880 // No isolate. | 877 // No isolate. |
| 881 return; | 878 return; |
| 882 } | 879 } |
| 883 | 880 |
| 884 ASSERT(isolate != Dart::vm_isolate()); | 881 ASSERT(isolate != Dart::vm_isolate()); |
| 885 | 882 |
| 886 const bool exited_dart_code = (isolate->stub_code() != NULL) && | 883 const bool exited_dart_code = (isolate->top_exit_frame_info() != 0) && |
| 887 (isolate->top_exit_frame_info() != 0) && | |
| 888 (isolate->vm_tag() != VMTag::kDartTagId); | 884 (isolate->vm_tag() != VMTag::kDartTagId); |
| 889 const bool in_dart_code = (isolate->stub_code() != NULL) && | 885 const bool in_dart_code = (isolate->top_exit_frame_info() == 0) && |
| 890 (isolate->top_exit_frame_info() == 0) && | |
| 891 (isolate->vm_tag() == VMTag::kDartTagId); | 886 (isolate->vm_tag() == VMTag::kDartTagId); |
| 892 | 887 |
| 893 uintptr_t sp = 0; | 888 uintptr_t sp = 0; |
| 894 uintptr_t fp = state.fp; | 889 uintptr_t fp = state.fp; |
| 895 uintptr_t pc = state.pc; | 890 uintptr_t pc = state.pc; |
| 896 uintptr_t lr = state.lr; | 891 uintptr_t lr = state.lr; |
| 897 #if defined(USING_SIMULATOR) | 892 #if defined(USING_SIMULATOR) |
| 898 Simulator* simulator = NULL; | 893 Simulator* simulator = NULL; |
| 899 #endif | 894 #endif |
| 900 | 895 |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1232 uword pc) { | 1227 uword pc) { |
| 1233 return vm_isolate->heap()->CodeContains(pc) | 1228 return vm_isolate->heap()->CodeContains(pc) |
| 1234 || isolate->heap()->CodeContains(pc); | 1229 || isolate->heap()->CodeContains(pc); |
| 1235 } | 1230 } |
| 1236 | 1231 |
| 1237 | 1232 |
| 1238 ProcessedSampleBuffer::ProcessedSampleBuffer() { | 1233 ProcessedSampleBuffer::ProcessedSampleBuffer() { |
| 1239 } | 1234 } |
| 1240 | 1235 |
| 1241 } // namespace dart | 1236 } // namespace dart |
| OLD | NEW |