| 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 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 // Attempt to find a better return address. | 526 // Attempt to find a better return address. |
| 527 ReturnAddressLocator ral(sample, code); | 527 ReturnAddressLocator ral(sample, code); |
| 528 | 528 |
| 529 if (!ral.LocateReturnAddress(&return_address)) { | 529 if (!ral.LocateReturnAddress(&return_address)) { |
| 530 ASSERT(return_address == sample->pc_marker()); | 530 ASSERT(return_address == sample->pc_marker()); |
| 531 // Could not find a better return address than the pc_marker. | 531 // Could not find a better return address than the pc_marker. |
| 532 if (code.ContainsInstructionAt(return_address)) { | 532 if (code.ContainsInstructionAt(return_address)) { |
| 533 // PC marker is in the same code as pc, no missing frame. | 533 // PC marker is in the same code as pc, no missing frame. |
| 534 return; | 534 return; |
| 535 } | 535 } |
| 536 if (!ContainedInDartCodeHeaps(return_address)) { | |
| 537 // PC marker is not from the Dart heap. Do not insert. | |
| 538 return; | |
| 539 } | |
| 540 } | 536 } |
| 541 | 537 |
| 538 if (!ContainedInDartCodeHeaps(return_address)) { |
| 539 // return address is not from the Dart heap. Do not insert. |
| 540 return; |
| 541 } |
| 542 |
| 542 if (return_address != 0) { | 543 if (return_address != 0) { |
| 543 sample->InsertCallerForTopFrame(return_address); | 544 sample->InsertCallerForTopFrame(return_address); |
| 544 } | 545 } |
| 545 } | 546 } |
| 546 | 547 |
| 547 | 548 |
| 548 bool PreprocessVisitor::ContainedInDartCodeHeaps(uword pc) const { | 549 bool PreprocessVisitor::ContainedInDartCodeHeaps(uword pc) const { |
| 549 return isolate()->heap()->CodeContains(pc) || | 550 return isolate()->heap()->CodeContains(pc) || |
| 550 vm_isolate()->heap()->CodeContains(pc); | 551 vm_isolate()->heap()->CodeContains(pc); |
| 551 } | 552 } |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 const InterruptedThreadState& state, | 927 const InterruptedThreadState& state, |
| 927 void* data) { | 928 void* data) { |
| 928 Isolate* isolate = reinterpret_cast<Isolate*>(data); | 929 Isolate* isolate = reinterpret_cast<Isolate*>(data); |
| 929 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { | 930 if ((isolate == NULL) || (Dart::vm_isolate() == NULL)) { |
| 930 // No isolate. | 931 // No isolate. |
| 931 return; | 932 return; |
| 932 } | 933 } |
| 933 | 934 |
| 934 ASSERT(isolate != Dart::vm_isolate()); | 935 ASSERT(isolate != Dart::vm_isolate()); |
| 935 | 936 |
| 937 const bool exited_dart_code = (isolate->stub_code() != NULL) && |
| 938 (isolate->top_exit_frame_info() != 0) && |
| 939 (isolate->vm_tag() != VMTag::kDartTagId); |
| 940 const bool in_dart_code = (isolate->stub_code() != NULL) && |
| 941 (isolate->top_exit_frame_info() == 0) && |
| 942 (isolate->vm_tag() == VMTag::kDartTagId); |
| 943 |
| 936 uintptr_t sp = 0; | 944 uintptr_t sp = 0; |
| 937 if ((isolate->stub_code() != NULL) && | 945 |
| 938 (isolate->top_exit_frame_info() == 0) && | 946 if (in_dart_code) { |
| 939 (isolate->vm_tag() == VMTag::kDartTagId)) { | |
| 940 // If we're in Dart code, use the Dart stack pointer. | 947 // If we're in Dart code, use the Dart stack pointer. |
| 941 sp = state.dsp; | 948 sp = state.dsp; |
| 942 } else { | 949 } else { |
| 943 // If we're in runtime code, use the C stack pointer. | 950 // If we're in runtime code, use the C stack pointer. |
| 944 sp = state.csp; | 951 sp = state.csp; |
| 945 } | 952 } |
| 946 | 953 |
| 947 IsolateProfilerData* profiler_data = isolate->profiler_data(); | 954 IsolateProfilerData* profiler_data = isolate->profiler_data(); |
| 948 if (profiler_data == NULL) { | 955 if (profiler_data == NULL) { |
| 949 // Profiler not initialized. | 956 // Profiler not initialized. |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1023 ASSERT(counters != NULL); | 1030 ASSERT(counters != NULL); |
| 1024 counters->Increment(vm_tag); | 1031 counters->Increment(vm_tag); |
| 1025 sample->set_vm_tag(vm_tag); | 1032 sample->set_vm_tag(vm_tag); |
| 1026 sample->set_user_tag(isolate->user_tag()); | 1033 sample->set_user_tag(isolate->user_tag()); |
| 1027 sample->set_sp(sp); | 1034 sample->set_sp(sp); |
| 1028 sample->set_fp(state.fp); | 1035 sample->set_fp(state.fp); |
| 1029 sample->set_lr(state.lr); | 1036 sample->set_lr(state.lr); |
| 1030 CopyStackBuffer(sample); | 1037 CopyStackBuffer(sample); |
| 1031 CopyPCMarkerIfSafe(sample); | 1038 CopyPCMarkerIfSafe(sample); |
| 1032 | 1039 |
| 1033 // Walk the call stack. | |
| 1034 if (FLAG_profile_vm) { | 1040 if (FLAG_profile_vm) { |
| 1035 // Always walk the native stack collecting both native and Dart frames. | 1041 // Always walk the native stack collecting both native and Dart frames. |
| 1036 ProfilerNativeStackWalker stackWalker(sample, | 1042 ProfilerNativeStackWalker stackWalker(sample, |
| 1037 stack_lower, | 1043 stack_lower, |
| 1038 stack_upper, | 1044 stack_upper, |
| 1039 state.pc, | 1045 state.pc, |
| 1040 state.fp, | 1046 state.fp, |
| 1041 sp); | 1047 sp); |
| 1042 stackWalker.walk(); | 1048 stackWalker.walk(); |
| 1049 } else if (exited_dart_code) { |
| 1050 // We have a valid exit frame info, use the Dart stack walker. |
| 1051 ProfilerDartExitStackWalker stackWalker(isolate, sample); |
| 1052 stackWalker.walk(); |
| 1053 } else if (in_dart_code) { |
| 1054 // We are executing Dart code. We have frame pointers. |
| 1055 ProfilerDartStackWalker stackWalker(isolate, |
| 1056 sample, |
| 1057 stack_lower, |
| 1058 stack_upper, |
| 1059 state.pc, |
| 1060 state.fp, |
| 1061 sp); |
| 1062 stackWalker.walk(); |
| 1043 } else { | 1063 } else { |
| 1044 // Attempt to walk only the Dart call stack, falling back to walking | 1064 sample->set_vm_tag(VMTag::kEmbedderTagId); |
| 1045 // the native stack. | 1065 sample->SetAt(0, state.pc); |
| 1046 if ((isolate->stub_code() != NULL) && | |
| 1047 (isolate->top_exit_frame_info() != 0) && | |
| 1048 (isolate->vm_tag() != VMTag::kDartTagId)) { | |
| 1049 // We have a valid exit frame info, use the Dart stack walker. | |
| 1050 ProfilerDartExitStackWalker stackWalker(isolate, sample); | |
| 1051 stackWalker.walk(); | |
| 1052 } else if ((isolate->stub_code() != NULL) && | |
| 1053 (isolate->top_exit_frame_info() == 0) && | |
| 1054 (isolate->vm_tag() == VMTag::kDartTagId)) { | |
| 1055 // We are executing Dart code. We have frame pointers. | |
| 1056 ProfilerDartStackWalker stackWalker(isolate, | |
| 1057 sample, | |
| 1058 stack_lower, | |
| 1059 stack_upper, | |
| 1060 state.pc, | |
| 1061 state.fp, | |
| 1062 sp); | |
| 1063 stackWalker.walk(); | |
| 1064 } else { | |
| 1065 #if defined(TARGET_OS_WINDOWS) && defined(TARGET_ARCH_X64) | |
| 1066 // ProfilerNativeStackWalker is known to cause crashes on Win64. | |
| 1067 // BUG=20423. | |
| 1068 sample->set_ignore_sample(true); | |
| 1069 #else | |
| 1070 // Fall back to an extremely conservative stack walker. | |
| 1071 ProfilerNativeStackWalker stackWalker(sample, | |
| 1072 stack_lower, | |
| 1073 stack_upper, | |
| 1074 state.pc, | |
| 1075 state.fp, | |
| 1076 sp); | |
| 1077 stackWalker.walk(); | |
| 1078 #endif | |
| 1079 } | |
| 1080 } | 1066 } |
| 1081 } | 1067 } |
| 1082 | 1068 |
| 1083 } // namespace dart | 1069 } // namespace dart |
| OLD | NEW |