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 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 } | 752 } |
753 | 753 |
754 const uword stack_upper_; | 754 const uword stack_upper_; |
755 const uword original_pc_; | 755 const uword original_pc_; |
756 const uword original_fp_; | 756 const uword original_fp_; |
757 const uword original_sp_; | 757 const uword original_sp_; |
758 uword lower_bound_; | 758 uword lower_bound_; |
759 }; | 759 }; |
760 | 760 |
761 | 761 |
762 static void CopyPCMarkerIfSafe(Sample* sample, uword fp_addr, uword sp_addr) { | |
763 ASSERT(sample != NULL); | |
764 | |
765 if (sample->vm_tag() != VMTag::kDartTagId) { | |
766 // We can only trust the stack pointer if we are executing Dart code. | |
767 // See http://dartbug.com/20421 for details. | |
768 return; | |
769 } | |
770 uword* fp = reinterpret_cast<uword*>(fp_addr); | |
771 uword* sp = reinterpret_cast<uword*>(sp_addr); | |
772 | |
773 // If FP == SP, the pc marker hasn't been pushed. | |
774 if (fp > sp) { | |
775 uword* pc_marker_ptr = fp + kPcMarkerSlotFromFp; | |
776 // MSan/ASan are unaware of frames initialized by generated code. | |
777 MSAN_UNPOISON(pc_marker_ptr, kWordSize); | |
778 ASAN_UNPOISON(pc_marker_ptr, kWordSize); | |
779 sample->set_pc_marker(*pc_marker_ptr); | |
780 } | |
781 } | |
782 | |
783 | |
784 static void CopyStackBuffer(Sample* sample, uword sp_addr) { | 762 static void CopyStackBuffer(Sample* sample, uword sp_addr) { |
785 ASSERT(sample != NULL); | 763 ASSERT(sample != NULL); |
786 if (sample->vm_tag() != VMTag::kDartTagId) { | |
787 // We can only trust the stack pointer if we are executing Dart code. | |
788 // See http://dartbug.com/20421 for details. | |
789 return; | |
790 } | |
791 uword* sp = reinterpret_cast<uword*>(sp_addr); | 764 uword* sp = reinterpret_cast<uword*>(sp_addr); |
792 uword* buffer = sample->GetStackBuffer(); | 765 uword* buffer = sample->GetStackBuffer(); |
793 if (sp != NULL) { | 766 if (sp != NULL) { |
794 for (intptr_t i = 0; i < Sample::kStackBufferSizeInWords; i++) { | 767 for (intptr_t i = 0; i < Sample::kStackBufferSizeInWords; i++) { |
795 MSAN_UNPOISON(sp, kWordSize); | 768 MSAN_UNPOISON(sp, kWordSize); |
796 ASAN_UNPOISON(sp, kWordSize); | 769 ASAN_UNPOISON(sp, kWordSize); |
797 buffer[i] = *sp; | 770 buffer[i] = *sp; |
798 sp++; | 771 sp++; |
799 } | 772 } |
800 } | 773 } |
(...skipping 26 matching lines...) Expand all Loading... |
827 ProfilerDartExitStackWalker* dart_exit_stack_walker, | 800 ProfilerDartExitStackWalker* dart_exit_stack_walker, |
828 ProfilerDartStackWalker* dart_stack_walker, | 801 ProfilerDartStackWalker* dart_stack_walker, |
829 uword pc, | 802 uword pc, |
830 uword fp, | 803 uword fp, |
831 uword sp) { | 804 uword sp) { |
832 #if defined(TARGET_OS_WINDOWS) | 805 #if defined(TARGET_OS_WINDOWS) |
833 // Use structured exception handling to trap guard page access on Windows. | 806 // Use structured exception handling to trap guard page access on Windows. |
834 __try { | 807 __try { |
835 #endif | 808 #endif |
836 | 809 |
837 CopyStackBuffer(sample, sp); | 810 if (in_dart_code) { |
838 CopyPCMarkerIfSafe(sample, fp, sp); | 811 // We can only trust the stack pointer if we are executing Dart code. |
| 812 // See http://dartbug.com/20421 for details. |
| 813 CopyStackBuffer(sample, sp); |
| 814 } |
839 | 815 |
840 if (FLAG_profile_vm) { | 816 if (FLAG_profile_vm) { |
841 // Always walk the native stack collecting both native and Dart frames. | 817 // Always walk the native stack collecting both native and Dart frames. |
842 native_stack_walker->walk(); | 818 native_stack_walker->walk(); |
843 } else if (exited_dart_code) { | 819 } else if (exited_dart_code) { |
844 // We have a valid exit frame info, use the Dart stack walker. | 820 // We have a valid exit frame info, use the Dart stack walker. |
845 dart_exit_stack_walker->walk(); | 821 dart_exit_stack_walker->walk(); |
846 } else if (in_dart_code) { | 822 } else if (in_dart_code) { |
847 // We are executing Dart code. We have frame pointers. | 823 // We are executing Dart code. We have frame pointers. |
848 dart_stack_walker->walk(); | 824 dart_stack_walker->walk(); |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1409 uword pc) { | 1385 uword pc) { |
1410 return vm_isolate->heap()->CodeContains(pc) | 1386 return vm_isolate->heap()->CodeContains(pc) |
1411 || isolate->heap()->CodeContains(pc); | 1387 || isolate->heap()->CodeContains(pc); |
1412 } | 1388 } |
1413 | 1389 |
1414 | 1390 |
1415 ProcessedSampleBuffer::ProcessedSampleBuffer() { | 1391 ProcessedSampleBuffer::ProcessedSampleBuffer() { |
1416 } | 1392 } |
1417 | 1393 |
1418 } // namespace dart | 1394 } // namespace dart |
OLD | NEW |