| 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 |