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 913 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 return reinterpret_cast<uintptr_t>(_ReturnAddress()); | 924 return reinterpret_cast<uintptr_t>(_ReturnAddress()); |
925 } | 925 } |
926 #else | 926 #else |
927 static uintptr_t __attribute__((noinline)) GetProgramCounter() { | 927 static uintptr_t __attribute__((noinline)) GetProgramCounter() { |
928 return reinterpret_cast<uintptr_t>( | 928 return reinterpret_cast<uintptr_t>( |
929 __builtin_extract_return_addr(__builtin_return_address(0))); | 929 __builtin_extract_return_addr(__builtin_return_address(0))); |
930 } | 930 } |
931 #endif | 931 #endif |
932 | 932 |
933 | 933 |
| 934 #if defined(TARGET_OS_WINDOWS) |
| 935 static uintptr_t GetFramePointer() { |
| 936 #if defined(HOST_ARCH_IA32) |
| 937 uintptr_t fp = 0; |
| 938 COPY_FP_REGISTER(fp); |
| 939 return fp; |
| 940 #else |
| 941 // We don't have the asm equivalent to get at the frame pointer on |
| 942 // windows x64, return the stack pointer instead. |
| 943 return Thread::GetCurrentStackPointer(); |
| 944 #endif // defined(HOST_ARCH_IA32). |
| 945 } |
| 946 #else |
| 947 static uintptr_t GetFramePointer() { |
| 948 uintptr_t fp = 0; |
| 949 COPY_FP_REGISTER(fp); |
| 950 return fp; |
| 951 } |
| 952 #endif // defined(TARGET_OS_WINDOWS). |
| 953 |
| 954 |
934 void Profiler::DumpStackTrace() { | 955 void Profiler::DumpStackTrace() { |
935 // Allow only one stack trace to prevent recursively printing stack traces if | 956 // Allow only one stack trace to prevent recursively printing stack traces if |
936 // we hit an assert while printing the stack. | 957 // we hit an assert while printing the stack. |
937 static uintptr_t started_dump = 0; | 958 static uintptr_t started_dump = 0; |
938 if (AtomicOperations::FetchAndIncrement(&started_dump) != 0) { | 959 if (AtomicOperations::FetchAndIncrement(&started_dump) != 0) { |
939 OS::PrintErr("Aborting re-entrant request for stack trace.\n"); | 960 OS::PrintErr("Aborting re-entrant request for stack trace.\n"); |
940 return; | 961 return; |
941 } | 962 } |
942 | 963 |
943 Thread* thread = Thread::Current(); | 964 Thread* thread = Thread::Current(); |
944 if (thread == NULL) { | 965 if (thread == NULL) { |
945 return; | 966 return; |
946 } | 967 } |
947 OSThread* os_thread = thread->os_thread(); | 968 OSThread* os_thread = thread->os_thread(); |
948 ASSERT(os_thread != NULL); | 969 ASSERT(os_thread != NULL); |
949 Isolate* isolate = thread->isolate(); | 970 Isolate* isolate = thread->isolate(); |
950 if (!CheckIsolate(isolate)) { | 971 if (!CheckIsolate(isolate)) { |
951 return; | 972 return; |
952 } | 973 } |
953 | 974 |
954 OS::PrintErr("Dumping native stack trace for thread %" Px "\n", | 975 OS::PrintErr("Dumping native stack trace for thread %" Px "\n", |
955 OSThread::ThreadIdToIntPtr(os_thread->trace_id())); | 976 OSThread::ThreadIdToIntPtr(os_thread->trace_id())); |
956 | 977 |
957 uintptr_t sp = Thread::GetCurrentStackPointer(); | 978 uintptr_t sp = Thread::GetCurrentStackPointer(); |
958 uintptr_t fp = 0; | 979 uintptr_t fp = GetFramePointer(); |
959 uintptr_t pc = GetProgramCounter(); | 980 uintptr_t pc = GetProgramCounter(); |
960 | |
961 COPY_FP_REGISTER(fp); | |
962 | |
963 uword stack_lower = 0; | 981 uword stack_lower = 0; |
964 uword stack_upper = 0; | 982 uword stack_upper = 0; |
965 | 983 |
966 if (!InitialRegisterCheck(pc, fp, sp)) { | 984 if (!InitialRegisterCheck(pc, fp, sp)) { |
967 OS::PrintErr("Stack dump aborted because InitialRegisterCheck.\n"); | 985 OS::PrintErr("Stack dump aborted because InitialRegisterCheck.\n"); |
968 return; | 986 return; |
969 } | 987 } |
970 | 988 |
971 if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower, | 989 if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower, |
972 &stack_upper)) { | 990 &stack_upper)) { |
(...skipping 20 matching lines...) Expand all Loading... |
993 | 1011 |
994 const bool exited_dart_code = thread->HasExitedDartCode(); | 1012 const bool exited_dart_code = thread->HasExitedDartCode(); |
995 | 1013 |
996 SampleBuffer* sample_buffer = Profiler::sample_buffer(); | 1014 SampleBuffer* sample_buffer = Profiler::sample_buffer(); |
997 if (sample_buffer == NULL) { | 1015 if (sample_buffer == NULL) { |
998 // Profiler not initialized. | 1016 // Profiler not initialized. |
999 return; | 1017 return; |
1000 } | 1018 } |
1001 | 1019 |
1002 uintptr_t sp = Thread::GetCurrentStackPointer(); | 1020 uintptr_t sp = Thread::GetCurrentStackPointer(); |
1003 uintptr_t fp = 0; | 1021 uintptr_t fp = GetFramePointer(); |
1004 uintptr_t pc = GetProgramCounter(); | 1022 uintptr_t pc = GetProgramCounter(); |
1005 | |
1006 COPY_FP_REGISTER(fp); | |
1007 | |
1008 uword stack_lower = 0; | 1023 uword stack_lower = 0; |
1009 uword stack_upper = 0; | 1024 uword stack_upper = 0; |
1010 | 1025 |
1011 if (!InitialRegisterCheck(pc, fp, sp)) { | 1026 if (!InitialRegisterCheck(pc, fp, sp)) { |
1012 return; | 1027 return; |
1013 } | 1028 } |
1014 | 1029 |
1015 if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower, | 1030 if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower, |
1016 &stack_upper)) { | 1031 &stack_upper)) { |
1017 // Could not get stack boundary. | 1032 // Could not get stack boundary. |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 | 1515 |
1501 | 1516 |
1502 ProcessedSampleBuffer::ProcessedSampleBuffer() | 1517 ProcessedSampleBuffer::ProcessedSampleBuffer() |
1503 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { | 1518 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { |
1504 ASSERT(code_lookup_table_ != NULL); | 1519 ASSERT(code_lookup_table_ != NULL); |
1505 } | 1520 } |
1506 | 1521 |
1507 #endif // !PRODUCT | 1522 #endif // !PRODUCT |
1508 | 1523 |
1509 } // namespace dart | 1524 } // namespace dart |
OLD | NEW |