Reviewers: Jakob,
Message:
Please take a look.
Description:
Also time external callbacks from generated code.
[email protected]
BUG=
Please review this at https://codereview.chromium.org/11411224/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/arm/macro-assembler-arm.cc
M src/assembler.h
M src/assembler.cc
M src/ia32/macro-assembler-ia32.cc
M src/log.h
M src/log.cc
M src/x64/macro-assembler-x64.cc
Index: src/arm/macro-assembler-arm.cc
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
index
158476ecdb241699dcf1a9feecb82929d76bfc64..7f6c60d2af60103b3fa0edf8e0a212ea5415bfb7
100644
--- a/src/arm/macro-assembler-arm.cc
+++ b/src/arm/macro-assembler-arm.cc
@@ -2222,12 +2222,28 @@ void
MacroAssembler::CallApiFunctionAndReturn(ExternalReference function,
add(r6, r6, Operand(1));
str(r6, MemOperand(r7, kLevelOffset));
+ if (FLAG_log_timer_events) {
+ FrameScope frame(this, StackFrame::MANUAL);
+ PushSafepointRegisters();
+ PrepareCallCFunction(0, r0);
+
CallCFunction(ExternalReference::log_enter_external_function(isolate()), 0);
+ PopSafepointRegisters();
+ }
+
// Native call returns to the DirectCEntry stub which redirects to the
// return address pushed on stack (could have moved after GC).
// DirectCEntry stub itself is generated early and never moves.
DirectCEntryStub stub;
stub.GenerateCall(this, function);
+ if (FLAG_log_timer_events) {
+ FrameScope frame(this, StackFrame::MANUAL);
+ PushSafepointRegisters();
+ PrepareCallCFunction(0, r0);
+
CallCFunction(ExternalReference::log_leave_external_function(isolate()), 0);
+ PopSafepointRegisters();
+ }
+
Label promote_scheduled_exception;
Label delete_allocated_handles;
Label leave_exit_frame;
Index: src/assembler.cc
diff --git a/src/assembler.cc b/src/assembler.cc
index
344e203b6da173027c4de1dc5750c4cab9c10dd6..25157be2eb42524c9901b4dbb8050b6cc224bb12
100644
--- a/src/assembler.cc
+++ b/src/assembler.cc
@@ -1056,6 +1056,20 @@ ExternalReference
ExternalReference::compute_output_frames_function(
}
+ExternalReference ExternalReference::log_enter_external_function(
+ Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(Logger::EnterExternal)));
+}
+
+
+ExternalReference ExternalReference::log_leave_external_function(
+ Isolate* isolate) {
+ return ExternalReference(
+ Redirect(isolate, FUNCTION_ADDR(Logger::LeaveExternal)));
+}
+
+
ExternalReference ExternalReference::keyed_lookup_cache_keys(Isolate*
isolate) {
return ExternalReference(isolate->keyed_lookup_cache()->keys_address());
}
Index: src/assembler.h
diff --git a/src/assembler.h b/src/assembler.h
index
76e0569963c9b5e7fc4eca3cb81bf9501a1c3178..4639374c225daf7c929976891c594e5c7caa4a8e
100644
--- a/src/assembler.h
+++ b/src/assembler.h
@@ -661,6 +661,10 @@ class ExternalReference BASE_EMBEDDED {
static ExternalReference new_deoptimizer_function(Isolate* isolate);
static ExternalReference compute_output_frames_function(Isolate*
isolate);
+ // Log support.
+ static ExternalReference log_enter_external_function(Isolate* isolate);
+ static ExternalReference log_leave_external_function(Isolate* isolate);
+
// Static data in the keyed lookup cache.
static ExternalReference keyed_lookup_cache_keys(Isolate* isolate);
static ExternalReference keyed_lookup_cache_field_offsets(Isolate*
isolate);
Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc
b/src/ia32/macro-assembler-ia32.cc
index
41c8667f1c726224776f18f5d2678f453ce76189..14fb8ca85220f1adba75dd26fb86711466bb72ad
100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -1920,9 +1920,25 @@ void
MacroAssembler::CallApiFunctionAndReturn(Address function_address,
mov(edi, Operand::StaticVariable(limit_address));
add(Operand::StaticVariable(level_address), Immediate(1));
+ if (FLAG_log_timer_events) {
+ FrameScope frame(this, StackFrame::MANUAL);
+ PushSafepointRegisters();
+ PrepareCallCFunction(0, eax);
+
CallCFunction(ExternalReference::log_enter_external_function(isolate()), 0);
+ PopSafepointRegisters();
+ }
+
// Call the api function.
call(function_address, RelocInfo::RUNTIME_ENTRY);
+ if (FLAG_log_timer_events) {
+ FrameScope frame(this, StackFrame::MANUAL);
+ PushSafepointRegisters();
+ PrepareCallCFunction(0, eax);
+
CallCFunction(ExternalReference::log_leave_external_function(isolate()), 0);
+ PopSafepointRegisters();
+ }
+
if (!kReturnHandlesDirectly) {
// PrepareCallApiFunction saved pointer to the output slot into
// callee-save register esi.
Index: src/log.cc
diff --git a/src/log.cc b/src/log.cc
index
a40bd92f392a45805ac98ec78957afe7d085c257..76af40067a21779d2b090806d5c3c68c448d8c24
100644
--- a/src/log.cc
+++ b/src/log.cc
@@ -727,6 +727,19 @@ void Logger::ExternalSwitch(StateTag old_tag, StateTag
new_tag) {
}
+void Logger::EnterExternal() {
+ LOGGER->enter_external_ = OS::Ticks();
+}
+
+
+void Logger::LeaveExternal() {
+ if (enter_external_ == 0) return;
+ Logger* logger = LOGGER;
+ logger->TimerEvent("V8.External", enter_external_, OS::Ticks());
+ logger->enter_external_ = 0;
+}
+
+
int64_t Logger::enter_external_ = 0;
Index: src/log.h
diff --git a/src/log.h b/src/log.h
index
97f9ffe80c2c9a6c1da532c592c1ab0745fe52c7..12dc9231a009443f172e43d63a88a6d64b86e400
100644
--- a/src/log.h
+++ b/src/log.h
@@ -280,6 +280,9 @@ class Logger {
void TimerEvent(const char* name, int64_t start, int64_t end);
void ExternalSwitch(StateTag old_tag, StateTag new_tag);
+ static void EnterExternal();
+ static void LeaveExternal();
+
class TimerEventScope {
public:
TimerEventScope(Isolate* isolate, const char* name)
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index
5b85a247d5bf32dbfb93e8294e815b919a25ead8..4e4f2c572c88097c74185c2ebc48a22cb6387e6f
100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -720,11 +720,28 @@ void MacroAssembler::CallApiFunctionAndReturn(Address
function_address,
movq(prev_next_address_reg, Operand(base_reg, kNextOffset));
movq(prev_limit_reg, Operand(base_reg, kLimitOffset));
addl(Operand(base_reg, kLevelOffset), Immediate(1));
+
+ if (FLAG_log_timer_events) {
+ FrameScope frame(this, StackFrame::MANUAL);
+ PushSafepointRegisters();
+ PrepareCallCFunction(0);
+
CallCFunction(ExternalReference::log_enter_external_function(isolate()), 0);
+ PopSafepointRegisters();
+ }
+
// Call the api function!
movq(rax, reinterpret_cast<int64_t>(function_address),
RelocInfo::RUNTIME_ENTRY);
call(rax);
+ if (FLAG_log_timer_events) {
+ FrameScope frame(this, StackFrame::MANUAL);
+ PushSafepointRegisters();
+ PrepareCallCFunction(0);
+
CallCFunction(ExternalReference::log_leave_external_function(isolate()), 0);
+ PopSafepointRegisters();
+ }
+
#if defined(_WIN64) && !defined(__MINGW64__)
// rax keeps a pointer to v8::Handle, unpack it.
movq(rax, Operand(rax, 0));
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev