mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 00:13:50 +00:00
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:
parent
80aa1914fb
commit
84e1fe5cb5
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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_;
|
||||
};
|
||||
|
||||
|
|
|
@ -51,6 +51,11 @@ _postEvent(String eventKind, String eventData) {
|
|||
}
|
||||
|
||||
|
||||
@patch
|
||||
bool _isDartStreamEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@patch
|
||||
int _getTraceClock() {
|
||||
// TODO.
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue