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

Unified Diff: src/frames.cc

Issue 9401019: Support for return-address rewriting profilers. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Supply return address resolution function through an API. Created 8 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: src/frames.cc
diff --git a/src/frames.cc b/src/frames.cc
index 40df12c437281bb6006c66af0e8a55871c14623d..81b75c889e326af68a6630032debab2c57c1a0bd 100644
--- a/src/frames.cc
+++ b/src/frames.cc
@@ -41,6 +41,22 @@
namespace v8 {
namespace internal {
+
+ReturnAddressLocationResolver return_address_location_resolver = NULL;
Vyacheslav Egorov (Chromium) 2012/02/24 10:34:02 declare it static
Sigurður Ásgeirsson 2012/02/24 14:46:04 Done.
+
+
+// Resolves pc_address through the resolution address function if one is set.
+Address* ResolveReturnAddressLocation(Address* pc_address) {
Vyacheslav Egorov (Chromium) 2012/02/24 10:34:02 declare it static
Sigurður Ásgeirsson 2012/02/24 14:46:04 Done. Does this warrant "static inline" or are the
Vyacheslav Egorov (Chromium) 2012/02/24 14:48:21 Yes, I think there is no harm declaring it inline
Sigurður Ásgeirsson 2012/02/24 14:59:40 Done.
+ if (return_address_location_resolver == NULL) {
+ return pc_address;
+ } else {
+ return reinterpret_cast<Address*>(
+ return_address_location_resolver(
+ reinterpret_cast<uintptr_t>(pc_address)));
+ }
+}
+
+
// Iterator that supports traversing the stack handlers of a
// particular frame. Needs to know the top of the handler chain.
class StackHandlerIterator BASE_EMBEDDED {
@@ -155,8 +171,8 @@ void StackFrameIterator::Reset() {
ASSERT(fp_ != NULL);
state.fp = fp_;
state.sp = sp_;
- state.pc_address =
- reinterpret_cast<Address*>(StandardFrame::ComputePCAddress(fp_));
+ state.pc_address = ResolveReturnAddressLocation(
+ reinterpret_cast<Address*>(StandardFrame::ComputePCAddress(fp_)));
type = StackFrame::ComputeType(isolate(), &state);
}
if (SingletonFor(type) == NULL) return;
@@ -413,6 +429,11 @@ void StackFrame::IteratePc(ObjectVisitor* v,
}
}
Vyacheslav Egorov (Chromium) 2012/02/24 10:34:02 add empty line
Sigurður Ásgeirsson 2012/02/24 14:46:04 Done.
+void StackFrame::SetReturnAddressLocationResolver(
+ ReturnAddressLocationResolver resolver) {
+ return_address_location_resolver = resolver;
Vyacheslav Egorov (Chromium) 2012/02/24 10:34:02 assert that we don't have any other resolver insta
Sigurður Ásgeirsson 2012/02/24 14:46:04 Done.
+}
+
StackFrame::Type StackFrame::ComputeType(Isolate* isolate, State* state) {
ASSERT(state->fp != NULL);
@@ -488,8 +509,8 @@ void ExitFrame::ComputeCallerState(State* state) const {
// Set up the caller state.
state->sp = caller_sp();
state->fp = Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset);
- state->pc_address
- = reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset);
+ state->pc_address = ResolveReturnAddressLocation(
+ reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset));
}
@@ -523,7 +544,8 @@ StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) {
void ExitFrame::FillState(Address fp, Address sp, State* state) {
state->sp = sp;
state->fp = fp;
- state->pc_address = reinterpret_cast<Address*>(sp - 1 * kPointerSize);
+ state->pc_address = ResolveReturnAddressLocation(
+ reinterpret_cast<Address*>(sp - 1 * kPointerSize));
}
@@ -558,7 +580,8 @@ int StandardFrame::ComputeExpressionsCount() const {
void StandardFrame::ComputeCallerState(State* state) const {
state->sp = caller_sp();
state->fp = caller_fp();
- state->pc_address = reinterpret_cast<Address*>(ComputePCAddress(fp()));
+ state->pc_address = ResolveReturnAddressLocation(
+ reinterpret_cast<Address*>(ComputePCAddress(fp())));
}

Powered by Google App Engine
This is Rietveld 408576698