Add an intrinsified early out path for Dart timeline calls

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1985813002 .
This commit is contained in:
John McCutchan 2016-05-17 09:45:28 -07:00
parent 80aa1914fb
commit 84e1fe5cb5
13 changed files with 161 additions and 0 deletions

View file

@ -15,6 +15,17 @@ namespace dart {
// Native implementations for the dart:developer library.
DEFINE_NATIVE_ENTRY(Timeline_isDartStreamEnabled, 0) {
if (!FLAG_support_timeline) {
return Bool::False().raw();
}
if (Timeline::GetDartStream()->enabled()) {
return Bool::True().raw();
}
return Bool::False().raw();
}
DEFINE_NATIVE_ENTRY(Timeline_getIsolateNum, 0) {
return Integer::New(static_cast<int64_t>(isolate->main_port()), Heap::kOld);
}

View file

@ -4,6 +4,8 @@
import 'dart:_internal';
patch bool _isDartStreamEnabled() native "Timeline_isDartStreamEnabled";
patch int _getTraceClock() native "Timeline_getTraceClock";
patch int _getThreadCpuClock() native "Timeline_getThreadCpuClock";

View file

@ -162,6 +162,7 @@ namespace dart {
V(Timeline_getNextAsyncId, 0) \
V(Timeline_getTraceClock, 0) \
V(Timeline_getThreadCpuClock, 0) \
V(Timeline_isDartStreamEnabled, 0) \
V(Timeline_reportCompleteEvent, 5) \
V(Timeline_reportInstantEvent, 4) \
V(Timeline_reportTaskEvent, 6) \

View file

@ -15,6 +15,7 @@
#include "vm/object_store.h"
#include "vm/regexp_assembler.h"
#include "vm/symbols.h"
#include "vm/timeline.h"
namespace dart {
@ -2104,6 +2105,29 @@ void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
__ Ret();
}
void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
if (!FLAG_support_timeline) {
__ LoadObject(R0, Bool::False());
__ Ret();
return;
}
Label true_label;
// Load TimelineStream*.
__ ldr(R0, Address(THR, Thread::dart_stream_offset()));
// Load uintptr_t from TimelineStream*.
__ ldr(R0, Address(R0, TimelineStream::enabled_offset()));
__ cmp(R0, Operand(0));
__ b(&true_label, NE);
// Not enabled.
__ LoadObject(R0, Bool::False());
__ Ret();
// Enabled.
__ Bind(&true_label);
__ LoadObject(R0, Bool::True());
__ Ret();
}
} // namespace dart
#endif // defined TARGET_ARCH_ARM

View file

@ -14,6 +14,7 @@
#include "vm/object_store.h"
#include "vm/regexp_assembler.h"
#include "vm/symbols.h"
#include "vm/timeline.h"
namespace dart {
@ -2178,6 +2179,29 @@ void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
__ ret();
}
void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
if (!FLAG_support_timeline) {
__ LoadObject(R0, Bool::False());
__ ret();
return;
}
Label true_label;
// Load TimelineStream*.
__ ldr(R0, Address(THR, Thread::dart_stream_offset()));
// Load uintptr_t from TimelineStream*.
__ ldr(R0, Address(R0, TimelineStream::enabled_offset()));
__ cmp(R0, Operand(0));
__ b(&true_label, NE);
// Not enabled.
__ LoadObject(R0, Bool::False());
__ ret();
// Enabled.
__ Bind(&true_label);
__ LoadObject(R0, Bool::True());
__ ret();
}
} // namespace dart
#endif // defined TARGET_ARCH_ARM64

View file

@ -21,6 +21,7 @@
#include "vm/os.h"
#include "vm/regexp_assembler.h"
#include "vm/symbols.h"
#include "vm/timeline.h"
namespace dart {
@ -2131,7 +2132,31 @@ void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
__ ret();
}
void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
if (!FLAG_support_timeline) {
__ LoadObject(EAX, Bool::False());
__ ret();
return;
}
Label true_label;
// Load TimelineStream*.
__ movl(EAX, Address(THR, Thread::dart_stream_offset()));
// Load uintptr_t from TimelineStream*.
__ movl(EAX, Address(EAX, TimelineStream::enabled_offset()));
__ cmpl(EAX, Immediate(0));
__ j(NOT_ZERO, &true_label, Assembler::kNearJump);
// Not enabled.
__ LoadObject(EAX, Bool::False());
__ ret();
// Enabled.
__ Bind(&true_label);
__ LoadObject(EAX, Bool::True());
__ ret();
}
#undef __
} // namespace dart
#endif // defined TARGET_ARCH_IA32

View file

@ -14,6 +14,7 @@
#include "vm/object_store.h"
#include "vm/regexp_assembler.h"
#include "vm/symbols.h"
#include "vm/timeline.h"
namespace dart {
@ -2208,6 +2209,28 @@ void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
__ delay_slot()->lw(V0, Address(V0, Isolate::current_tag_offset()));
}
void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
if (!FLAG_support_timeline) {
__ LoadObject(V0, Bool::False());
__ Ret();
return;
}
Label true_label;
// Load TimelineStream*.
__ lw(V0, Address(THR, Thread::dart_stream_offset()));
// Load uintptr_t from TimelineStream*.
__ lw(V0, Address(V0, TimelineStream::enabled_offset()));
__ bne(V0, ZR, &true_label);
// Not enabled.
__ LoadObject(V0, Bool::False());
__ Ret();
// Enabled.
__ Bind(&true_label);
__ LoadObject(V0, Bool::True());
__ Ret();
}
} // namespace dart
#endif // defined TARGET_ARCH_MIPS

View file

@ -14,6 +14,7 @@
#include "vm/object_store.h"
#include "vm/regexp_assembler.h"
#include "vm/symbols.h"
#include "vm/timeline.h"
namespace dart {
@ -2086,6 +2087,29 @@ void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) {
__ ret();
}
void Intrinsifier::Timeline_isDartStreamEnabled(Assembler* assembler) {
if (!FLAG_support_timeline) {
__ LoadObject(RAX, Bool::False());
__ ret();
return;
}
Label true_label;
// Load TimelineStream*.
__ movq(RAX, Address(THR, Thread::dart_stream_offset()));
// Load uintptr_t from TimelineStream*.
__ movq(RAX, Address(RAX, TimelineStream::enabled_offset()));
__ cmpq(RAX, Immediate(0));
__ j(NOT_ZERO, &true_label, Assembler::kNearJump);
// Not enabled.
__ LoadObject(RAX, Bool::False());
__ ret();
// Enabled.
__ Bind(&true_label);
__ LoadObject(RAX, Bool::True());
__ ret();
}
#undef __
} // namespace dart

View file

@ -307,6 +307,7 @@ namespace dart {
V(_UserTag, makeCurrent, UserTag_makeCurrent, 187721469) \
V(::, _getDefaultTag, UserTag_defaultTag, 350077879) \
V(::, _getCurrentTag, Profiler_getCurrentTag, 1215225901) \
V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, 1072246292) \
#define ALL_INTRINSICS_NO_INTEGER_LIB_LIST(V) \
CORE_LIB_INTRINSIC_LIST(V) \

View file

@ -98,8 +98,10 @@ Thread::Thread(Isolate* isolate)
safepoint_state_(0),
execution_state_(kThreadInVM),
next_(NULL) {
NOT_IN_PRODUCT(
dart_stream_ = Timeline::GetDartStream();
ASSERT(dart_stream_ != NULL);
)
#define DEFAULT_INIT(type_name, member_name, init_expr, default_init_value) \
member_name = default_init_value;
CACHED_CONSTANTS_LIST(DEFAULT_INIT)

View file

@ -71,6 +71,9 @@ class TimelineStream {
private:
const char* name_;
// This field is accessed by generated code (intrinsic) and expects to see
// 0 or 1. If this becomes a BitField, the generated code must be updated.
uintptr_t enabled_;
};

View file

@ -51,6 +51,11 @@ _postEvent(String eventKind, String eventData) {
}
@patch
bool _isDartStreamEnabled() {
return false;
}
@patch
int _getTraceClock() {
// TODO.

View file

@ -23,6 +23,11 @@ class Timeline {
'name',
'Must be a String');
}
if (!_isDartStreamEnabled()) {
// Push a null onto the stack and return.
_stack.add(null);
return;
}
var block = new _SyncBlock._(name, _getTraceClock(), _getThreadCpuClock());
if (arguments is Map) {
block._appendArguments(arguments);
@ -41,6 +46,10 @@ class Timeline {
}
// Pop top item off of stack.
var block = _stack.removeLast();
if (block == null) {
// Dart stream was disabled when startSync was called.
return;
}
// Finish it.
block.finish();
}
@ -55,6 +64,10 @@ class Timeline {
'name',
'Must be a String');
}
if (!_isDartStreamEnabled()) {
// Stream is disabled.
return;
}
Map instantArguments;
if (arguments is Map) {
instantArguments = new Map.from(arguments);
@ -278,6 +291,9 @@ String _argumentsAsJson(Map arguments) {
return JSON.encode(arguments);
}
/// Returns true if the Dart Timeline stream is enabled.
external bool _isDartStreamEnabled();
/// Returns the next async task id.
external int _getNextAsyncId();