Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/api.cc

Issue 1926863003: Make Isolate::GetStackSample API support simulator (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« include/v8.h ('K') | « include/v8.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 7509 matching lines...) Expand 10 before | Expand all | Expand 10 after
7520 7520
7521 7521
7522 void Isolate::GetStackSample(const RegisterState& state, void** frames, 7522 void Isolate::GetStackSample(const RegisterState& state, void** frames,
7523 size_t frames_limit, SampleInfo* sample_info) { 7523 size_t frames_limit, SampleInfo* sample_info) {
7524 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 7524 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
7525 i::TickSample::GetStackSample(isolate, state, i::TickSample::kSkipCEntryFrame, 7525 i::TickSample::GetStackSample(isolate, state, i::TickSample::kSkipCEntryFrame,
7526 frames, frames_limit, sample_info); 7526 frames, frames_limit, sample_info);
7527 } 7527 }
7528 7528
7529 7529
7530 void Isolate::GetStackSample(RegisterState* state, void** frames,
alph 2016/04/27 22:29:20 v8 usually do not put that much implementation spe
7531 size_t frames_limit, SampleInfo* sample_info) {
7532 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
7533 #if defined(USE_SIMULATOR)
7534 i::Simulator *simulator = isolate->thread_local_top()->simulator_;
7535 if (simulator != NULL) {
7536 #if V8_TARGET_ARCH_ARM
7537 if (!simulator->has_bad_pc()) {
7538 state->pc = reinterpret_cast<void*>(simulator->get_pc());
7539 }
7540 state->sp = reinterpret_cast<void*>(simulator->get_register(
7541 i::Simulator::sp));
7542 state->fp = reinterpret_cast<void*>(simulator->get_register(
7543 i::Simulator::r11));
7544 #elif V8_TARGET_ARCH_ARM64
7545 if (simulator->sp() == 0 || simulator->fp() == 0) {
7546 // It's possible that the simulator is interrupted while it is updating
7547 // the sp or fp register. ARM64 simulator does this in two steps:
7548 // first setting it to zero and then setting it to a new value.
7549 // Bailout if sp/fp doesn't contain the new value.
7550 //
7551 // FIXME: The above doesn't really solve the issue.
7552 // If a 64-bit target is executed on a 32-bit host even the final
7553 // write is non-atomic, so it might obtain a half of the result.
7554 // Moreover as long as the register set code uses memcpy (as of now),
7555 // it is not guaranteed to be atomic even when both host and target
7556 // are of same bitness.
7557 return;
7558 }
7559 state->pc = reinterpret_cast<void*>(simulator->pc());
7560 state->sp = reinterpret_cast<void*>(simulator->sp());
7561 state->fp = reinterpret_cast<void*>(simulator->fp());
7562 #elif V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
7563 if (!simulator->has_bad_pc()) {
7564 state->pc = reinterpret_cast<void*>(simulator->get_pc());
7565 }
7566 state->sp = reinterpret_cast<void*>(simulator->get_register(
7567 i::Simulator::sp));
7568 state->fp = reinterpret_cast<void*>(simulator->get_register(
7569 i::Simulator::fp));
7570 #elif V8_TARGET_ARCH_PPC
7571 if (!simulator->has_bad_pc()) {
7572 state->pc = reinterpret_cast<void*>(simulator->get_pc());
7573 }
7574 state->sp =
7575 reinterpret_cast<void*>(simulator->get_register(i::Simulator::sp));
7576 state->fp =
7577 reinterpret_cast<void*>(simulator->get_register(i::Simulator::fp));
7578 #elif V8_TARGET_ARCH_S390
7579 if (!simulator->has_bad_pc()) {
7580 state->pc = reinterpret_cast<void*>(simulator->get_pc());
7581 }
7582 state->sp =
7583 reinterpret_cast<void*>(simulator->get_register(i::Simulator::sp));
7584 state->fp =
7585 reinterpret_cast<void*>(simulator->get_register(i::Simulator::fp));
7586 #endif
7587 }
7588 #endif // USE_SIMULATOR
7589 i::TickSample::GetStackSample(isolate, *state,
7590 i::TickSample::kSkipCEntryFrame,
7591 frames, frames_limit, sample_info);
7592 }
7593
7594
7530 void Isolate::SetEventLogger(LogEventCallback that) { 7595 void Isolate::SetEventLogger(LogEventCallback that) {
7531 // Do not overwrite the event logger if we want to log explicitly. 7596 // Do not overwrite the event logger if we want to log explicitly.
7532 if (i::FLAG_log_internal_timer_events) return; 7597 if (i::FLAG_log_internal_timer_events) return;
7533 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 7598 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
7534 isolate->set_event_logger(that); 7599 isolate->set_event_logger(that);
7535 } 7600 }
7536 7601
7537 7602
7538 void Isolate::AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback) { 7603 void Isolate::AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback) {
7539 if (callback == NULL) return; 7604 if (callback == NULL) return;
(...skipping 1298 matching lines...) Expand 10 before | Expand all | Expand 10 after
8838 Address callback_address = 8903 Address callback_address =
8839 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8904 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8840 VMState<EXTERNAL> state(isolate); 8905 VMState<EXTERNAL> state(isolate);
8841 ExternalCallbackScope call_scope(isolate, callback_address); 8906 ExternalCallbackScope call_scope(isolate, callback_address);
8842 callback(info); 8907 callback(info);
8843 } 8908 }
8844 8909
8845 8910
8846 } // namespace internal 8911 } // namespace internal
8847 } // namespace v8 8912 } // namespace v8
OLDNEW
« include/v8.h ('K') | « include/v8.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698