Revert "CpuProfiler: eliminate 2 layers of 4 for CodeCreateEvent calls."
This reverts commit 76adf84b83ec3c0b261cbc29369ce4ac83f9d002. windows compilation failed BUG=none TBR=yurys@chromium.org Review URL: https://codereview.chromium.org/18344002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15406 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
eb14637367
commit
baa3a7e47b
@ -64,6 +64,16 @@ TickSample* ProfilerEventsProcessor::TickSampleEvent() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ProfilerEventsProcessor::FilterOutCodeCreateEvent(
|
||||||
|
Logger::LogEventsAndTags tag) {
|
||||||
|
return FLAG_prof_browser_mode
|
||||||
|
&& (tag != Logger::CALLBACK_TAG
|
||||||
|
&& tag != Logger::FUNCTION_TAG
|
||||||
|
&& tag != Logger::LAZY_COMPILE_TAG
|
||||||
|
&& tag != Logger::REG_EXP_TAG
|
||||||
|
&& tag != Logger::SCRIPT_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
} } // namespace v8::internal
|
} } // namespace v8::internal
|
||||||
|
|
||||||
#endif // V8_CPU_PROFILER_INL_H_
|
#endif // V8_CPU_PROFILER_INL_H_
|
||||||
|
@ -58,9 +58,120 @@ ProfilerEventsProcessor::ProfilerEventsProcessor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ProfilerEventsProcessor::Enqueue(const CodeEventsContainer& event) {
|
void ProfilerEventsProcessor::CallbackCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
event.generic.order = ++enqueue_order_;
|
const char* prefix,
|
||||||
events_buffer_.Enqueue(event);
|
Name* name,
|
||||||
|
Address start) {
|
||||||
|
if (FilterOutCodeCreateEvent(tag)) return;
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::CODE_CREATION;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->start = start;
|
||||||
|
rec->entry = profiles_->NewCodeEntry(tag, prefix, name);
|
||||||
|
rec->size = 1;
|
||||||
|
rec->shared = NULL;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
Name* name,
|
||||||
|
String* resource_name,
|
||||||
|
int line_number,
|
||||||
|
Address start,
|
||||||
|
unsigned size,
|
||||||
|
Address shared,
|
||||||
|
CompilationInfo* info) {
|
||||||
|
if (FilterOutCodeCreateEvent(tag)) return;
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::CODE_CREATION;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->start = start;
|
||||||
|
rec->entry = profiles_->NewCodeEntry(tag, name, resource_name, line_number);
|
||||||
|
if (info) {
|
||||||
|
rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges());
|
||||||
|
}
|
||||||
|
rec->size = size;
|
||||||
|
rec->shared = shared;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
const char* name,
|
||||||
|
Address start,
|
||||||
|
unsigned size) {
|
||||||
|
if (FilterOutCodeCreateEvent(tag)) return;
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::CODE_CREATION;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->start = start;
|
||||||
|
rec->entry = profiles_->NewCodeEntry(tag, name);
|
||||||
|
rec->size = size;
|
||||||
|
rec->shared = NULL;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProfilerEventsProcessor::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
int args_count,
|
||||||
|
Address start,
|
||||||
|
unsigned size) {
|
||||||
|
if (FilterOutCodeCreateEvent(tag)) return;
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::CODE_CREATION;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->start = start;
|
||||||
|
rec->entry = profiles_->NewCodeEntry(tag, args_count);
|
||||||
|
rec->size = size;
|
||||||
|
rec->shared = NULL;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProfilerEventsProcessor::CodeMoveEvent(Address from, Address to) {
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::CODE_MOVE;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->from = from;
|
||||||
|
rec->to = to;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProfilerEventsProcessor::SharedFunctionInfoMoveEvent(Address from,
|
||||||
|
Address to) {
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
SharedFunctionInfoMoveEventRecord* rec =
|
||||||
|
&evt_rec.SharedFunctionInfoMoveEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::SHARED_FUNC_MOVE;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->from = from;
|
||||||
|
rec->to = to;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ProfilerEventsProcessor::RegExpCodeCreateEvent(
|
||||||
|
Logger::LogEventsAndTags tag,
|
||||||
|
const char* prefix,
|
||||||
|
String* name,
|
||||||
|
Address start,
|
||||||
|
unsigned size) {
|
||||||
|
if (FilterOutCodeCreateEvent(tag)) return;
|
||||||
|
CodeEventsContainer evt_rec;
|
||||||
|
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
||||||
|
rec->type = CodeEventRecord::CODE_CREATION;
|
||||||
|
rec->order = ++enqueue_order_;
|
||||||
|
rec->start = start;
|
||||||
|
rec->entry = profiles_->NewCodeEntry(tag, prefix, name);
|
||||||
|
rec->size = size;
|
||||||
|
events_buffer_.Enqueue(evt_rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -194,56 +305,30 @@ bool CpuProfiler::HasDetachedProfiles() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag) {
|
|
||||||
return FLAG_prof_browser_mode
|
|
||||||
&& (tag != Logger::CALLBACK_TAG
|
|
||||||
&& tag != Logger::FUNCTION_TAG
|
|
||||||
&& tag != Logger::LAZY_COMPILE_TAG
|
|
||||||
&& tag != Logger::REG_EXP_TAG
|
|
||||||
&& tag != Logger::SCRIPT_TAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::CallbackEvent(Name* name, Address entry_point) {
|
void CpuProfiler::CallbackEvent(Name* name, Address entry_point) {
|
||||||
if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return;
|
processor_->CallbackCreateEvent(
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
Logger::CALLBACK_TAG, CodeEntry::kEmptyNamePrefix, name, entry_point);
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = entry_point;
|
|
||||||
rec->entry = profiles_->NewCodeEntry(
|
|
||||||
Logger::CALLBACK_TAG,
|
|
||||||
profiles_->GetName(name),
|
|
||||||
TokenEnumerator::kInheritsSecurityToken);
|
|
||||||
rec->size = 1;
|
|
||||||
rec->shared = NULL;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
Code* code,
|
Code* code, const char* comment) {
|
||||||
const char* name) {
|
processor_->CodeCreateEvent(
|
||||||
if (FilterOutCodeCreateEvent(tag)) return;
|
tag, comment, code->address(), code->ExecutableSize());
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = code->address();
|
|
||||||
rec->entry = profiles_->NewCodeEntry(tag, profiles_->GetFunctionName(name));
|
|
||||||
rec->size = code->ExecutableSize();
|
|
||||||
rec->shared = NULL;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
Code* code,
|
Code* code, Name* name) {
|
||||||
Name* name) {
|
processor_->CodeCreateEvent(
|
||||||
if (FilterOutCodeCreateEvent(tag)) return;
|
tag,
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
name,
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
isolate_->heap()->empty_string(),
|
||||||
rec->start = code->address();
|
v8::CpuProfileNode::kNoLineNumberInfo,
|
||||||
rec->entry = profiles_->NewCodeEntry(tag, profiles_->GetFunctionName(name));
|
code->address(),
|
||||||
rec->size = code->ExecutableSize();
|
code->ExecutableSize(),
|
||||||
rec->shared = NULL;
|
NULL,
|
||||||
processor_->Enqueue(evt_rec);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -252,17 +337,15 @@ void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
|||||||
SharedFunctionInfo* shared,
|
SharedFunctionInfo* shared,
|
||||||
CompilationInfo* info,
|
CompilationInfo* info,
|
||||||
Name* name) {
|
Name* name) {
|
||||||
if (FilterOutCodeCreateEvent(tag)) return;
|
processor_->CodeCreateEvent(
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
tag,
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
name,
|
||||||
rec->start = code->address();
|
isolate_->heap()->empty_string(),
|
||||||
rec->entry = profiles_->NewCodeEntry(tag, profiles_->GetFunctionName(name));
|
v8::CpuProfileNode::kNoLineNumberInfo,
|
||||||
rec->entry->set_no_frame_ranges(info ?
|
code->address(),
|
||||||
info->ReleaseNoFrameRanges() :
|
code->ExecutableSize(),
|
||||||
NULL);
|
shared->address(),
|
||||||
rec->size = code->ExecutableSize();
|
info);
|
||||||
rec->shared = shared->address();
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -271,50 +354,30 @@ void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
|||||||
SharedFunctionInfo* shared,
|
SharedFunctionInfo* shared,
|
||||||
CompilationInfo* info,
|
CompilationInfo* info,
|
||||||
String* source, int line) {
|
String* source, int line) {
|
||||||
if (FilterOutCodeCreateEvent(tag)) return;
|
processor_->CodeCreateEvent(
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = code->address();
|
|
||||||
rec->entry = profiles_->NewCodeEntry(
|
|
||||||
tag,
|
tag,
|
||||||
profiles_->GetFunctionName(shared->DebugName()),
|
shared->DebugName(),
|
||||||
TokenEnumerator::kNoSecurityToken,
|
source,
|
||||||
CodeEntry::kEmptyNamePrefix,
|
line,
|
||||||
profiles_->GetName(source),
|
code->address(),
|
||||||
line);
|
code->ExecutableSize(),
|
||||||
rec->entry->set_no_frame_ranges(info ?
|
shared->address(),
|
||||||
info->ReleaseNoFrameRanges() :
|
info);
|
||||||
NULL);
|
|
||||||
rec->size = code->ExecutableSize();
|
|
||||||
rec->shared = shared->address();
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
Code* code,
|
Code* code, int args_count) {
|
||||||
int args_count) {
|
processor_->CodeCreateEvent(
|
||||||
if (FilterOutCodeCreateEvent(tag)) return;
|
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = code->address();
|
|
||||||
rec->entry = profiles_->NewCodeEntry(
|
|
||||||
tag,
|
tag,
|
||||||
profiles_->GetName(args_count),
|
args_count,
|
||||||
TokenEnumerator::kInheritsSecurityToken,
|
code->address(),
|
||||||
"args_count: ");
|
code->ExecutableSize());
|
||||||
rec->size = code->ExecutableSize();
|
|
||||||
rec->shared = NULL;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::CodeMoveEvent(Address from, Address to) {
|
void CpuProfiler::CodeMoveEvent(Address from, Address to) {
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE);
|
processor_->CodeMoveEvent(from, to);
|
||||||
CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_;
|
|
||||||
rec->from = from;
|
|
||||||
rec->to = to;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -323,59 +386,29 @@ void CpuProfiler::CodeDeleteEvent(Address from) {
|
|||||||
|
|
||||||
|
|
||||||
void CpuProfiler::SharedFunctionInfoMoveEvent(Address from, Address to) {
|
void CpuProfiler::SharedFunctionInfoMoveEvent(Address from, Address to) {
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::SHARED_FUNC_MOVE);
|
processor_->SharedFunctionInfoMoveEvent(from, to);
|
||||||
SharedFunctionInfoMoveEventRecord* rec =
|
|
||||||
&evt_rec.SharedFunctionInfoMoveEventRecord_;
|
|
||||||
rec->from = from;
|
|
||||||
rec->to = to;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) {
|
void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) {
|
||||||
if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return;
|
processor_->CallbackCreateEvent(
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
Logger::CALLBACK_TAG, "get ", name, entry_point);
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = entry_point;
|
|
||||||
rec->entry = profiles_->NewCodeEntry(
|
|
||||||
Logger::CALLBACK_TAG,
|
|
||||||
profiles_->GetName(name),
|
|
||||||
TokenEnumerator::kInheritsSecurityToken,
|
|
||||||
"get ");
|
|
||||||
rec->size = 1;
|
|
||||||
rec->shared = NULL;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) {
|
void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) {
|
||||||
if (FilterOutCodeCreateEvent(Logger::REG_EXP_TAG)) return;
|
processor_->RegExpCodeCreateEvent(
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = code->address();
|
|
||||||
rec->entry = profiles_->NewCodeEntry(
|
|
||||||
Logger::REG_EXP_TAG,
|
Logger::REG_EXP_TAG,
|
||||||
profiles_->GetName(source),
|
"RegExp: ",
|
||||||
TokenEnumerator::kInheritsSecurityToken,
|
source,
|
||||||
"RegExp: ");
|
code->address(),
|
||||||
rec->size = code->ExecutableSize();
|
code->ExecutableSize());
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) {
|
void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) {
|
||||||
if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return;
|
processor_->CallbackCreateEvent(
|
||||||
CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION);
|
Logger::CALLBACK_TAG, "set ", name, entry_point);
|
||||||
CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_;
|
|
||||||
rec->start = entry_point;
|
|
||||||
rec->entry = profiles_->NewCodeEntry(
|
|
||||||
Logger::CALLBACK_TAG,
|
|
||||||
profiles_->GetName(name),
|
|
||||||
TokenEnumerator::kInheritsSecurityToken,
|
|
||||||
"set ");
|
|
||||||
rec->size = 1;
|
|
||||||
rec->shared = NULL;
|
|
||||||
processor_->Enqueue(evt_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -391,21 +424,6 @@ CpuProfiler::CpuProfiler(Isolate* isolate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CpuProfiler::CpuProfiler(Isolate* isolate,
|
|
||||||
CpuProfilesCollection* test_profiles,
|
|
||||||
ProfileGenerator* test_generator,
|
|
||||||
ProfilerEventsProcessor* test_processor)
|
|
||||||
: isolate_(isolate),
|
|
||||||
profiles_(test_profiles),
|
|
||||||
next_profile_uid_(1),
|
|
||||||
token_enumerator_(new TokenEnumerator()),
|
|
||||||
generator_(test_generator),
|
|
||||||
processor_(test_processor),
|
|
||||||
need_to_stop_sampler_(false),
|
|
||||||
is_profiling_(false) {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CpuProfiler::~CpuProfiler() {
|
CpuProfiler::~CpuProfiler() {
|
||||||
delete token_enumerator_;
|
delete token_enumerator_;
|
||||||
delete profiles_;
|
delete profiles_;
|
||||||
|
@ -63,7 +63,7 @@ class CodeEventRecord {
|
|||||||
#undef DECLARE_TYPE
|
#undef DECLARE_TYPE
|
||||||
|
|
||||||
Type type;
|
Type type;
|
||||||
mutable unsigned order;
|
unsigned order;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -122,21 +122,6 @@ class TickSampleEventRecord {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class CodeEventsContainer {
|
|
||||||
public:
|
|
||||||
explicit CodeEventsContainer(
|
|
||||||
CodeEventRecord::Type type = CodeEventRecord::NONE) {
|
|
||||||
generic.type = type;
|
|
||||||
}
|
|
||||||
union {
|
|
||||||
CodeEventRecord generic;
|
|
||||||
#define DECLARE_CLASS(ignore, type) type type##_;
|
|
||||||
CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
|
|
||||||
#undef DECLARE_TYPE
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// This class implements both the profile events processor thread and
|
// This class implements both the profile events processor thread and
|
||||||
// methods called by event producers: VM and stack sampler threads.
|
// methods called by event producers: VM and stack sampler threads.
|
||||||
class ProfilerEventsProcessor : public Thread {
|
class ProfilerEventsProcessor : public Thread {
|
||||||
@ -149,8 +134,29 @@ class ProfilerEventsProcessor : public Thread {
|
|||||||
virtual void Run();
|
virtual void Run();
|
||||||
inline void Stop() { running_ = false; }
|
inline void Stop() { running_ = false; }
|
||||||
INLINE(bool running()) { return running_; }
|
INLINE(bool running()) { return running_; }
|
||||||
void Enqueue(const CodeEventsContainer& event);
|
|
||||||
|
|
||||||
|
// Events adding methods. Called by VM threads.
|
||||||
|
void CallbackCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
const char* prefix, Name* name,
|
||||||
|
Address start);
|
||||||
|
void CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
Name* name,
|
||||||
|
String* resource_name, int line_number,
|
||||||
|
Address start, unsigned size,
|
||||||
|
Address shared,
|
||||||
|
CompilationInfo* info);
|
||||||
|
void CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
const char* name,
|
||||||
|
Address start, unsigned size);
|
||||||
|
void CodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
int args_count,
|
||||||
|
Address start, unsigned size);
|
||||||
|
void CodeMoveEvent(Address from, Address to);
|
||||||
|
void CodeDeleteEvent(Address from);
|
||||||
|
void SharedFunctionInfoMoveEvent(Address from, Address to);
|
||||||
|
void RegExpCodeCreateEvent(Logger::LogEventsAndTags tag,
|
||||||
|
const char* prefix, String* name,
|
||||||
|
Address start, unsigned size);
|
||||||
// Puts current stack into tick sample events buffer.
|
// Puts current stack into tick sample events buffer.
|
||||||
void AddCurrentStack();
|
void AddCurrentStack();
|
||||||
|
|
||||||
@ -161,10 +167,19 @@ class ProfilerEventsProcessor : public Thread {
|
|||||||
INLINE(TickSample* TickSampleEvent());
|
INLINE(TickSample* TickSampleEvent());
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
union CodeEventsContainer {
|
||||||
|
CodeEventRecord generic;
|
||||||
|
#define DECLARE_CLASS(ignore, type) type type##_;
|
||||||
|
CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
|
||||||
|
#undef DECLARE_TYPE
|
||||||
|
};
|
||||||
|
|
||||||
// Called from events processing thread (Run() method.)
|
// Called from events processing thread (Run() method.)
|
||||||
bool ProcessCodeEvent(unsigned* dequeue_order);
|
bool ProcessCodeEvent(unsigned* dequeue_order);
|
||||||
bool ProcessTicks(unsigned dequeue_order);
|
bool ProcessTicks(unsigned dequeue_order);
|
||||||
|
|
||||||
|
INLINE(static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag));
|
||||||
|
|
||||||
ProfileGenerator* generator_;
|
ProfileGenerator* generator_;
|
||||||
CpuProfilesCollection* profiles_;
|
CpuProfilesCollection* profiles_;
|
||||||
bool running_;
|
bool running_;
|
||||||
@ -189,12 +204,6 @@ class ProfilerEventsProcessor : public Thread {
|
|||||||
class CpuProfiler {
|
class CpuProfiler {
|
||||||
public:
|
public:
|
||||||
explicit CpuProfiler(Isolate* isolate);
|
explicit CpuProfiler(Isolate* isolate);
|
||||||
|
|
||||||
CpuProfiler(Isolate* isolate,
|
|
||||||
CpuProfilesCollection* test_collection,
|
|
||||||
ProfileGenerator* test_generator,
|
|
||||||
ProfilerEventsProcessor* test_processor);
|
|
||||||
|
|
||||||
~CpuProfiler();
|
~CpuProfiler();
|
||||||
|
|
||||||
void StartProfiling(const char* title, bool record_samples = false);
|
void StartProfiling(const char* title, bool record_samples = false);
|
||||||
|
@ -44,9 +44,9 @@ const char* StringsStorage::GetFunctionName(const char* name) {
|
|||||||
|
|
||||||
|
|
||||||
CodeEntry::CodeEntry(Logger::LogEventsAndTags tag,
|
CodeEntry::CodeEntry(Logger::LogEventsAndTags tag,
|
||||||
|
const char* name_prefix,
|
||||||
const char* name,
|
const char* name,
|
||||||
int security_token_id,
|
int security_token_id,
|
||||||
const char* name_prefix,
|
|
||||||
const char* resource_name,
|
const char* resource_name,
|
||||||
int line_number)
|
int line_number)
|
||||||
: tag_(tag),
|
: tag_(tag),
|
||||||
|
@ -298,7 +298,7 @@ class DeleteNodesCallback {
|
|||||||
|
|
||||||
|
|
||||||
ProfileTree::ProfileTree()
|
ProfileTree::ProfileTree()
|
||||||
: root_entry_(Logger::FUNCTION_TAG, "(root)"),
|
: root_entry_(Logger::FUNCTION_TAG, "", "(root)"),
|
||||||
next_node_id_(1),
|
next_node_id_(1),
|
||||||
root_(new ProfileNode(this, &root_entry_)) {
|
root_(new ProfileNode(this, &root_entry_)) {
|
||||||
}
|
}
|
||||||
@ -787,6 +787,54 @@ List<CpuProfile*>* CpuProfilesCollection::Profiles(int security_token_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
|
Name* name,
|
||||||
|
String* resource_name,
|
||||||
|
int line_number) {
|
||||||
|
CodeEntry* entry = new CodeEntry(tag,
|
||||||
|
CodeEntry::kEmptyNamePrefix,
|
||||||
|
GetFunctionName(name),
|
||||||
|
TokenEnumerator::kNoSecurityToken,
|
||||||
|
GetName(resource_name),
|
||||||
|
line_number);
|
||||||
|
code_entries_.Add(entry);
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
|
const char* name) {
|
||||||
|
CodeEntry* entry = new CodeEntry(tag,
|
||||||
|
CodeEntry::kEmptyNamePrefix,
|
||||||
|
GetFunctionName(name));
|
||||||
|
code_entries_.Add(entry);
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
|
const char* name_prefix,
|
||||||
|
Name* name) {
|
||||||
|
CodeEntry* entry = new CodeEntry(tag,
|
||||||
|
name_prefix,
|
||||||
|
GetName(name),
|
||||||
|
TokenEnumerator::kInheritsSecurityToken);
|
||||||
|
code_entries_.Add(entry);
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
|
int args_count) {
|
||||||
|
CodeEntry* entry = new CodeEntry(tag,
|
||||||
|
"args_count: ",
|
||||||
|
GetName(args_count),
|
||||||
|
TokenEnumerator::kInheritsSecurityToken);
|
||||||
|
code_entries_.Add(entry);
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CpuProfilesCollection::AddPathToCurrentProfiles(
|
void CpuProfilesCollection::AddPathToCurrentProfiles(
|
||||||
const Vector<CodeEntry*>& path) {
|
const Vector<CodeEntry*>& path) {
|
||||||
// As starting / stopping profiles is rare relatively to this
|
// As starting / stopping profiles is rare relatively to this
|
||||||
@ -800,24 +848,6 @@ void CpuProfilesCollection::AddPathToCurrentProfiles(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CodeEntry* CpuProfilesCollection::NewCodeEntry(
|
|
||||||
Logger::LogEventsAndTags tag,
|
|
||||||
const char* name,
|
|
||||||
int security_token_id,
|
|
||||||
const char* name_prefix,
|
|
||||||
const char* resource_name,
|
|
||||||
int line_number) {
|
|
||||||
CodeEntry* code_entry = new CodeEntry(tag,
|
|
||||||
name,
|
|
||||||
security_token_id,
|
|
||||||
name_prefix,
|
|
||||||
resource_name,
|
|
||||||
line_number);
|
|
||||||
code_entries_.Add(code_entry);
|
|
||||||
return code_entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SampleRateCalculator::Tick() {
|
void SampleRateCalculator::Tick() {
|
||||||
if (--wall_time_query_countdown_ == 0)
|
if (--wall_time_query_countdown_ == 0)
|
||||||
UpdateMeasurements(OS::TimeCurrentMillis());
|
UpdateMeasurements(OS::TimeCurrentMillis());
|
||||||
|
@ -97,9 +97,9 @@ class CodeEntry {
|
|||||||
public:
|
public:
|
||||||
// CodeEntry doesn't own name strings, just references them.
|
// CodeEntry doesn't own name strings, just references them.
|
||||||
INLINE(CodeEntry(Logger::LogEventsAndTags tag,
|
INLINE(CodeEntry(Logger::LogEventsAndTags tag,
|
||||||
|
const char* name_prefix,
|
||||||
const char* name,
|
const char* name,
|
||||||
int security_token_id = TokenEnumerator::kNoSecurityToken,
|
int security_token_id = TokenEnumerator::kNoSecurityToken,
|
||||||
const char* name_prefix = CodeEntry::kEmptyNamePrefix,
|
|
||||||
const char* resource_name = CodeEntry::kEmptyResourceName,
|
const char* resource_name = CodeEntry::kEmptyResourceName,
|
||||||
int line_number = v8::CpuProfileNode::kNoLineNumberInfo));
|
int line_number = v8::CpuProfileNode::kNoLineNumberInfo));
|
||||||
~CodeEntry();
|
~CodeEntry();
|
||||||
@ -318,24 +318,18 @@ class CpuProfilesCollection {
|
|||||||
const char* GetName(int args_count) {
|
const char* GetName(int args_count) {
|
||||||
return function_and_resource_names_.GetName(args_count);
|
return function_and_resource_names_.GetName(args_count);
|
||||||
}
|
}
|
||||||
const char* GetFunctionName(Name* name) {
|
|
||||||
return function_and_resource_names_.GetFunctionName(name);
|
|
||||||
}
|
|
||||||
const char* GetFunctionName(const char* name) {
|
|
||||||
return function_and_resource_names_.GetFunctionName(name);
|
|
||||||
}
|
|
||||||
CpuProfile* GetProfile(int security_token_id, unsigned uid);
|
CpuProfile* GetProfile(int security_token_id, unsigned uid);
|
||||||
bool IsLastProfile(const char* title);
|
bool IsLastProfile(const char* title);
|
||||||
void RemoveProfile(CpuProfile* profile);
|
void RemoveProfile(CpuProfile* profile);
|
||||||
bool HasDetachedProfiles() { return detached_profiles_.length() > 0; }
|
bool HasDetachedProfiles() { return detached_profiles_.length() > 0; }
|
||||||
|
|
||||||
CodeEntry* NewCodeEntry(
|
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
Logger::LogEventsAndTags tag,
|
Name* name, String* resource_name, int line_number);
|
||||||
const char* name,
|
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name);
|
||||||
int security_token_id = TokenEnumerator::kNoSecurityToken,
|
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag,
|
||||||
const char* name_prefix = CodeEntry::kEmptyNamePrefix,
|
const char* name_prefix, Name* name);
|
||||||
const char* resource_name = CodeEntry::kEmptyResourceName,
|
CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, int args_count);
|
||||||
int line_number = v8::CpuProfileNode::kNoLineNumberInfo);
|
CodeEntry* NewCodeEntry(int security_token_id);
|
||||||
|
|
||||||
// Called from profile generator thread.
|
// Called from profile generator thread.
|
||||||
void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path);
|
void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path);
|
||||||
@ -344,6 +338,12 @@ class CpuProfilesCollection {
|
|||||||
static const int kMaxSimultaneousProfiles = 100;
|
static const int kMaxSimultaneousProfiles = 100;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
const char* GetFunctionName(Name* name) {
|
||||||
|
return function_and_resource_names_.GetFunctionName(name);
|
||||||
|
}
|
||||||
|
const char* GetFunctionName(const char* name) {
|
||||||
|
return function_and_resource_names_.GetFunctionName(name);
|
||||||
|
}
|
||||||
int GetProfileIndex(unsigned uid);
|
int GetProfileIndex(unsigned uid);
|
||||||
List<CpuProfile*>* GetProfilesList(int security_token_id);
|
List<CpuProfile*>* GetProfilesList(int security_token_id);
|
||||||
int TokenToIndex(int security_token_id);
|
int TokenToIndex(int security_token_id);
|
||||||
|
@ -97,87 +97,64 @@ class TestSetup {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
i::Code* CreateCode(LocalContext* env) {
|
|
||||||
static int counter = 0;
|
|
||||||
char script[256];
|
|
||||||
char name[32];
|
|
||||||
snprintf(name, sizeof(name), "function_%d", ++counter);
|
|
||||||
snprintf(script, sizeof(script),
|
|
||||||
"function %s() {\n"
|
|
||||||
"var counter = 0;\n"
|
|
||||||
"for (var i = 0; i < %d; ++i) counter += i;\n"
|
|
||||||
"return '%s_' + counter;\n"
|
|
||||||
"}\n"
|
|
||||||
"%s();\n", name, counter, name, name);
|
|
||||||
CompileRun(script);
|
|
||||||
i::Handle<i::JSFunction> fun = v8::Utils::OpenHandle(
|
|
||||||
*v8::Local<v8::Function>::Cast((*env)->Global()->Get(v8_str(name))));
|
|
||||||
fprintf(stderr, "code size: %d\n", fun->code()->ExecutableSize());
|
|
||||||
return fun->code();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEST(CodeEvents) {
|
TEST(CodeEvents) {
|
||||||
CcTest::InitializeVM();
|
CcTest::InitializeVM();
|
||||||
LocalContext env;
|
|
||||||
i::Isolate* isolate = i::Isolate::Current();
|
i::Isolate* isolate = i::Isolate::Current();
|
||||||
|
i::Heap* heap = isolate->heap();
|
||||||
i::Factory* factory = isolate->factory();
|
i::Factory* factory = isolate->factory();
|
||||||
TestSetup test_setup;
|
TestSetup test_setup;
|
||||||
|
CpuProfilesCollection profiles;
|
||||||
i::HandleScope scope(isolate);
|
profiles.StartProfiling("", 1, false);
|
||||||
|
ProfileGenerator generator(&profiles);
|
||||||
i::Code* aaa_code = CreateCode(&env);
|
ProfilerEventsProcessor processor(&generator, &profiles);
|
||||||
i::Code* comment_code = CreateCode(&env);
|
|
||||||
i::Code* args5_code = CreateCode(&env);
|
|
||||||
i::Code* comment2_code = CreateCode(&env);
|
|
||||||
i::Code* moved_code = CreateCode(&env);
|
|
||||||
i::Code* args3_code = CreateCode(&env);
|
|
||||||
i::Code* args4_code = CreateCode(&env);
|
|
||||||
|
|
||||||
CpuProfilesCollection* profiles = new CpuProfilesCollection;
|
|
||||||
profiles->StartProfiling("", 1, false);
|
|
||||||
ProfileGenerator generator(profiles);
|
|
||||||
ProfilerEventsProcessor processor(&generator, profiles);
|
|
||||||
processor.Start();
|
processor.Start();
|
||||||
CpuProfiler profiler(isolate, profiles, &generator, &processor);
|
|
||||||
|
|
||||||
// Enqueue code creation events.
|
// Enqueue code creation events.
|
||||||
|
i::HandleScope scope(isolate);
|
||||||
const char* aaa_str = "aaa";
|
const char* aaa_str = "aaa";
|
||||||
i::Handle<i::String> aaa_name = factory->NewStringFromAscii(
|
i::Handle<i::String> aaa_name = factory->NewStringFromAscii(
|
||||||
i::Vector<const char>(aaa_str, i::StrLength(aaa_str)));
|
i::Vector<const char>(aaa_str, i::StrLength(aaa_str)));
|
||||||
profiler.CodeCreateEvent(i::Logger::FUNCTION_TAG, aaa_code, *aaa_name);
|
processor.CodeCreateEvent(i::Logger::FUNCTION_TAG,
|
||||||
profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, comment_code, "comment");
|
*aaa_name,
|
||||||
profiler.CodeCreateEvent(i::Logger::STUB_TAG, args5_code, 5);
|
heap->empty_string(),
|
||||||
profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, comment2_code, "comment2");
|
0,
|
||||||
profiler.CodeMoveEvent(comment2_code->address(), moved_code->address());
|
ToAddress(0x1000),
|
||||||
profiler.CodeCreateEvent(i::Logger::STUB_TAG, args3_code, 3);
|
0x100,
|
||||||
profiler.CodeCreateEvent(i::Logger::STUB_TAG, args4_code, 4);
|
ToAddress(0x10000),
|
||||||
|
NULL);
|
||||||
|
processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
|
||||||
|
"bbb",
|
||||||
|
ToAddress(0x1200),
|
||||||
|
0x80);
|
||||||
|
processor.CodeCreateEvent(i::Logger::STUB_TAG, 5, ToAddress(0x1300), 0x10);
|
||||||
|
processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
|
||||||
|
"ddd",
|
||||||
|
ToAddress(0x1400),
|
||||||
|
0x80);
|
||||||
|
processor.CodeMoveEvent(ToAddress(0x1400), ToAddress(0x1500));
|
||||||
|
processor.CodeCreateEvent(i::Logger::STUB_TAG, 3, ToAddress(0x1600), 0x10);
|
||||||
|
processor.CodeCreateEvent(i::Logger::STUB_TAG, 4, ToAddress(0x1605), 0x10);
|
||||||
// Enqueue a tick event to enable code events processing.
|
// Enqueue a tick event to enable code events processing.
|
||||||
EnqueueTickSampleEvent(&processor, aaa_code->address());
|
EnqueueTickSampleEvent(&processor, ToAddress(0x1000));
|
||||||
|
|
||||||
processor.Stop();
|
processor.Stop();
|
||||||
processor.Join();
|
processor.Join();
|
||||||
|
|
||||||
// Check the state of profile generator.
|
// Check the state of profile generator.
|
||||||
CodeEntry* aaa = generator.code_map()->FindEntry(aaa_code->address());
|
CodeEntry* entry1 = generator.code_map()->FindEntry(ToAddress(0x1000));
|
||||||
CHECK_NE(NULL, aaa);
|
CHECK_NE(NULL, entry1);
|
||||||
CHECK_EQ(aaa_str, aaa->name());
|
CHECK_EQ(aaa_str, entry1->name());
|
||||||
|
CodeEntry* entry2 = generator.code_map()->FindEntry(ToAddress(0x1200));
|
||||||
CodeEntry* comment = generator.code_map()->FindEntry(comment_code->address());
|
CHECK_NE(NULL, entry2);
|
||||||
CHECK_NE(NULL, comment);
|
CHECK_EQ("bbb", entry2->name());
|
||||||
CHECK_EQ("comment", comment->name());
|
CodeEntry* entry3 = generator.code_map()->FindEntry(ToAddress(0x1300));
|
||||||
|
CHECK_NE(NULL, entry3);
|
||||||
CodeEntry* args5 = generator.code_map()->FindEntry(args5_code->address());
|
CHECK_EQ("5", entry3->name());
|
||||||
CHECK_NE(NULL, args5);
|
CHECK_EQ(NULL, generator.code_map()->FindEntry(ToAddress(0x1400)));
|
||||||
CHECK_EQ("5", args5->name());
|
CodeEntry* entry4 = generator.code_map()->FindEntry(ToAddress(0x1500));
|
||||||
|
CHECK_NE(NULL, entry4);
|
||||||
CHECK_EQ(NULL, generator.code_map()->FindEntry(comment2_code->address()));
|
CHECK_EQ("ddd", entry4->name());
|
||||||
|
CHECK_EQ(NULL, generator.code_map()->FindEntry(ToAddress(0x1600)));
|
||||||
CodeEntry* comment2 = generator.code_map()->FindEntry(moved_code->address());
|
|
||||||
CHECK_NE(NULL, comment2);
|
|
||||||
CHECK_EQ("comment2", comment2->name());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -188,40 +165,32 @@ static int CompareProfileNodes(const T* p1, const T* p2) {
|
|||||||
|
|
||||||
TEST(TickEvents) {
|
TEST(TickEvents) {
|
||||||
TestSetup test_setup;
|
TestSetup test_setup;
|
||||||
LocalContext env;
|
CpuProfilesCollection profiles;
|
||||||
i::Isolate* isolate = i::Isolate::Current();
|
profiles.StartProfiling("", 1, false);
|
||||||
i::HandleScope scope(isolate);
|
ProfileGenerator generator(&profiles);
|
||||||
|
ProfilerEventsProcessor processor(&generator, &profiles);
|
||||||
i::Code* frame1_code = CreateCode(&env);
|
|
||||||
i::Code* frame2_code = CreateCode(&env);
|
|
||||||
i::Code* frame3_code = CreateCode(&env);
|
|
||||||
|
|
||||||
CpuProfilesCollection* profiles = new CpuProfilesCollection;
|
|
||||||
profiles->StartProfiling("", 1, false);
|
|
||||||
ProfileGenerator generator(profiles);
|
|
||||||
ProfilerEventsProcessor processor(&generator, profiles);
|
|
||||||
processor.Start();
|
processor.Start();
|
||||||
CpuProfiler profiler(isolate, profiles, &generator, &processor);
|
|
||||||
|
|
||||||
profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, frame1_code, "bbb");
|
processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
|
||||||
profiler.CodeCreateEvent(i::Logger::STUB_TAG, frame2_code, 5);
|
"bbb",
|
||||||
profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, frame3_code, "ddd");
|
ToAddress(0x1200),
|
||||||
|
0x80);
|
||||||
EnqueueTickSampleEvent(&processor, frame1_code->instruction_start());
|
processor.CodeCreateEvent(i::Logger::STUB_TAG, 5, ToAddress(0x1300), 0x10);
|
||||||
EnqueueTickSampleEvent(
|
processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
|
||||||
&processor,
|
"ddd",
|
||||||
frame2_code->instruction_start() + frame2_code->ExecutableSize() / 2,
|
ToAddress(0x1400),
|
||||||
frame1_code->instruction_start() + frame2_code->ExecutableSize() / 2);
|
0x80);
|
||||||
EnqueueTickSampleEvent(
|
EnqueueTickSampleEvent(&processor, ToAddress(0x1210));
|
||||||
&processor,
|
EnqueueTickSampleEvent(&processor, ToAddress(0x1305), ToAddress(0x1220));
|
||||||
frame3_code->instruction_end() - 1,
|
EnqueueTickSampleEvent(&processor,
|
||||||
frame2_code->instruction_end() - 1,
|
ToAddress(0x1404),
|
||||||
frame1_code->instruction_end() - 1);
|
ToAddress(0x1305),
|
||||||
|
ToAddress(0x1230));
|
||||||
|
|
||||||
processor.Stop();
|
processor.Stop();
|
||||||
processor.Join();
|
processor.Join();
|
||||||
CpuProfile* profile =
|
CpuProfile* profile =
|
||||||
profiles->StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1);
|
profiles.StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1);
|
||||||
CHECK_NE(NULL, profile);
|
CHECK_NE(NULL, profile);
|
||||||
|
|
||||||
// Check call trees.
|
// Check call trees.
|
||||||
@ -260,33 +229,29 @@ TEST(CrashIfStoppingLastNonExistentProfile) {
|
|||||||
// Long stacks (exceeding max frames limit) must not be erased.
|
// Long stacks (exceeding max frames limit) must not be erased.
|
||||||
TEST(Issue1398) {
|
TEST(Issue1398) {
|
||||||
TestSetup test_setup;
|
TestSetup test_setup;
|
||||||
LocalContext env;
|
CpuProfilesCollection profiles;
|
||||||
i::Isolate* isolate = i::Isolate::Current();
|
profiles.StartProfiling("", 1, false);
|
||||||
i::HandleScope scope(isolate);
|
ProfileGenerator generator(&profiles);
|
||||||
|
ProfilerEventsProcessor processor(&generator, &profiles);
|
||||||
i::Code* code = CreateCode(&env);
|
|
||||||
|
|
||||||
CpuProfilesCollection* profiles = new CpuProfilesCollection;
|
|
||||||
profiles->StartProfiling("", 1, false);
|
|
||||||
ProfileGenerator generator(profiles);
|
|
||||||
ProfilerEventsProcessor processor(&generator, profiles);
|
|
||||||
processor.Start();
|
processor.Start();
|
||||||
CpuProfiler profiler(isolate, profiles, &generator, &processor);
|
|
||||||
|
|
||||||
profiler.CodeCreateEvent(i::Logger::BUILTIN_TAG, code, "bbb");
|
processor.CodeCreateEvent(i::Logger::BUILTIN_TAG,
|
||||||
|
"bbb",
|
||||||
|
ToAddress(0x1200),
|
||||||
|
0x80);
|
||||||
|
|
||||||
i::TickSample* sample = processor.TickSampleEvent();
|
i::TickSample* sample = processor.TickSampleEvent();
|
||||||
sample->pc = code->address();
|
sample->pc = ToAddress(0x1200);
|
||||||
sample->tos = 0;
|
sample->tos = 0;
|
||||||
sample->frames_count = i::TickSample::kMaxFramesCount;
|
sample->frames_count = i::TickSample::kMaxFramesCount;
|
||||||
for (int i = 0; i < sample->frames_count; ++i) {
|
for (int i = 0; i < sample->frames_count; ++i) {
|
||||||
sample->stack[i] = code->address();
|
sample->stack[i] = ToAddress(0x1200);
|
||||||
}
|
}
|
||||||
|
|
||||||
processor.Stop();
|
processor.Stop();
|
||||||
processor.Join();
|
processor.Join();
|
||||||
CpuProfile* profile =
|
CpuProfile* profile =
|
||||||
profiles->StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1);
|
profiles.StopProfiling(TokenEnumerator::kNoSecurityToken, "", 1);
|
||||||
CHECK_NE(NULL, profile);
|
CHECK_NE(NULL, profile);
|
||||||
|
|
||||||
int actual_depth = 0;
|
int actual_depth = 0;
|
||||||
|
@ -87,17 +87,17 @@ TEST(TokenEnumerator) {
|
|||||||
TEST(ProfileNodeFindOrAddChild) {
|
TEST(ProfileNodeFindOrAddChild) {
|
||||||
ProfileTree tree;
|
ProfileTree tree;
|
||||||
ProfileNode node(&tree, NULL);
|
ProfileNode node(&tree, NULL);
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa");
|
||||||
ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
|
ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
|
||||||
CHECK_NE(NULL, childNode1);
|
CHECK_NE(NULL, childNode1);
|
||||||
CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb");
|
||||||
ProfileNode* childNode2 = node.FindOrAddChild(&entry2);
|
ProfileNode* childNode2 = node.FindOrAddChild(&entry2);
|
||||||
CHECK_NE(NULL, childNode2);
|
CHECK_NE(NULL, childNode2);
|
||||||
CHECK_NE(childNode1, childNode2);
|
CHECK_NE(childNode1, childNode2);
|
||||||
CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
||||||
CHECK_EQ(childNode2, node.FindOrAddChild(&entry2));
|
CHECK_EQ(childNode2, node.FindOrAddChild(&entry2));
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc");
|
||||||
ProfileNode* childNode3 = node.FindOrAddChild(&entry3);
|
ProfileNode* childNode3 = node.FindOrAddChild(&entry3);
|
||||||
CHECK_NE(NULL, childNode3);
|
CHECK_NE(NULL, childNode3);
|
||||||
CHECK_NE(childNode1, childNode3);
|
CHECK_NE(childNode1, childNode3);
|
||||||
@ -109,18 +109,19 @@ TEST(ProfileNodeFindOrAddChild) {
|
|||||||
|
|
||||||
|
|
||||||
TEST(ProfileNodeFindOrAddChildForSameFunction) {
|
TEST(ProfileNodeFindOrAddChildForSameFunction) {
|
||||||
|
const char* empty = "";
|
||||||
const char* aaa = "aaa";
|
const char* aaa = "aaa";
|
||||||
ProfileTree tree;
|
ProfileTree tree;
|
||||||
ProfileNode node(&tree, NULL);
|
ProfileNode node(&tree, NULL);
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, aaa);
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, empty, aaa);
|
||||||
ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
|
ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
|
||||||
CHECK_NE(NULL, childNode1);
|
CHECK_NE(NULL, childNode1);
|
||||||
CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
||||||
// The same function again.
|
// The same function again.
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, aaa);
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, empty, aaa);
|
||||||
CHECK_EQ(childNode1, node.FindOrAddChild(&entry2));
|
CHECK_EQ(childNode1, node.FindOrAddChild(&entry2));
|
||||||
// Now with a different security token.
|
// Now with a different security token.
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, aaa,
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, empty, aaa,
|
||||||
TokenEnumerator::kNoSecurityToken + 1);
|
TokenEnumerator::kNoSecurityToken + 1);
|
||||||
CHECK_EQ(childNode1, node.FindOrAddChild(&entry3));
|
CHECK_EQ(childNode1, node.FindOrAddChild(&entry3));
|
||||||
}
|
}
|
||||||
@ -156,9 +157,9 @@ class ProfileTreeTestHelper {
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
TEST(ProfileTreeAddPathFromStart) {
|
TEST(ProfileTreeAddPathFromStart) {
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa");
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb");
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc");
|
||||||
ProfileTree tree;
|
ProfileTree tree;
|
||||||
ProfileTreeTestHelper helper(&tree);
|
ProfileTreeTestHelper helper(&tree);
|
||||||
CHECK_EQ(NULL, helper.Walk(&entry1));
|
CHECK_EQ(NULL, helper.Walk(&entry1));
|
||||||
@ -223,9 +224,9 @@ TEST(ProfileTreeAddPathFromStart) {
|
|||||||
|
|
||||||
|
|
||||||
TEST(ProfileTreeAddPathFromEnd) {
|
TEST(ProfileTreeAddPathFromEnd) {
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa");
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb");
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc");
|
||||||
ProfileTree tree;
|
ProfileTree tree;
|
||||||
ProfileTreeTestHelper helper(&tree);
|
ProfileTreeTestHelper helper(&tree);
|
||||||
CHECK_EQ(NULL, helper.Walk(&entry1));
|
CHECK_EQ(NULL, helper.Walk(&entry1));
|
||||||
@ -303,7 +304,7 @@ TEST(ProfileTreeCalculateTotalTicks) {
|
|||||||
CHECK_EQ(1, empty_tree.root()->total_ticks());
|
CHECK_EQ(1, empty_tree.root()->total_ticks());
|
||||||
CHECK_EQ(1, empty_tree.root()->self_ticks());
|
CHECK_EQ(1, empty_tree.root()->self_ticks());
|
||||||
|
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa");
|
||||||
CodeEntry* e1_path[] = {&entry1};
|
CodeEntry* e1_path[] = {&entry1};
|
||||||
Vector<CodeEntry*> e1_path_vec(
|
Vector<CodeEntry*> e1_path_vec(
|
||||||
e1_path, sizeof(e1_path) / sizeof(e1_path[0]));
|
e1_path, sizeof(e1_path) / sizeof(e1_path[0]));
|
||||||
@ -324,7 +325,7 @@ TEST(ProfileTreeCalculateTotalTicks) {
|
|||||||
CHECK_EQ(1, node1->total_ticks());
|
CHECK_EQ(1, node1->total_ticks());
|
||||||
CHECK_EQ(1, node1->self_ticks());
|
CHECK_EQ(1, node1->self_ticks());
|
||||||
|
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb");
|
||||||
CodeEntry* e1_e2_path[] = {&entry1, &entry2};
|
CodeEntry* e1_e2_path[] = {&entry1, &entry2};
|
||||||
Vector<CodeEntry*> e1_e2_path_vec(
|
Vector<CodeEntry*> e1_e2_path_vec(
|
||||||
e1_e2_path, sizeof(e1_e2_path) / sizeof(e1_e2_path[0]));
|
e1_e2_path, sizeof(e1_e2_path) / sizeof(e1_e2_path[0]));
|
||||||
@ -359,7 +360,7 @@ TEST(ProfileTreeCalculateTotalTicks) {
|
|||||||
CodeEntry* e2_path[] = {&entry2};
|
CodeEntry* e2_path[] = {&entry2};
|
||||||
Vector<CodeEntry*> e2_path_vec(
|
Vector<CodeEntry*> e2_path_vec(
|
||||||
e2_path, sizeof(e2_path) / sizeof(e2_path[0]));
|
e2_path, sizeof(e2_path) / sizeof(e2_path[0]));
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc");
|
||||||
CodeEntry* e3_path[] = {&entry3};
|
CodeEntry* e3_path[] = {&entry3};
|
||||||
Vector<CodeEntry*> e3_path_vec(
|
Vector<CodeEntry*> e3_path_vec(
|
||||||
e3_path, sizeof(e3_path) / sizeof(e3_path[0]));
|
e3_path, sizeof(e3_path) / sizeof(e3_path[0]));
|
||||||
@ -417,10 +418,10 @@ TEST(ProfileTreeCalculateTotalTicks) {
|
|||||||
TEST(ProfileTreeFilteredClone) {
|
TEST(ProfileTreeFilteredClone) {
|
||||||
ProfileTree source_tree;
|
ProfileTree source_tree;
|
||||||
const int token0 = 0, token1 = 1, token2 = 2;
|
const int token0 = 0, token1 = 1, token2 = 2;
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", token0);
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa", token0);
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", token1);
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb", token1);
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc", token0);
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc", token0);
|
||||||
CodeEntry entry4(i::Logger::FUNCTION_TAG, "ddd",
|
CodeEntry entry4(i::Logger::FUNCTION_TAG, "", "ddd",
|
||||||
TokenEnumerator::kInheritsSecurityToken);
|
TokenEnumerator::kInheritsSecurityToken);
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -518,10 +519,10 @@ static inline i::Address ToAddress(int n) {
|
|||||||
|
|
||||||
TEST(CodeMapAddCode) {
|
TEST(CodeMapAddCode) {
|
||||||
CodeMap code_map;
|
CodeMap code_map;
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa");
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb");
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc");
|
||||||
CodeEntry entry4(i::Logger::FUNCTION_TAG, "ddd");
|
CodeEntry entry4(i::Logger::FUNCTION_TAG, "", "ddd");
|
||||||
code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
|
code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
|
||||||
code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
|
code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
|
||||||
code_map.AddCode(ToAddress(0x1900), &entry3, 0x50);
|
code_map.AddCode(ToAddress(0x1900), &entry3, 0x50);
|
||||||
@ -548,8 +549,8 @@ TEST(CodeMapAddCode) {
|
|||||||
|
|
||||||
TEST(CodeMapMoveAndDeleteCode) {
|
TEST(CodeMapMoveAndDeleteCode) {
|
||||||
CodeMap code_map;
|
CodeMap code_map;
|
||||||
CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
CodeEntry entry1(i::Logger::FUNCTION_TAG, "", "aaa");
|
||||||
CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
CodeEntry entry2(i::Logger::FUNCTION_TAG, "", "bbb");
|
||||||
code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
|
code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
|
||||||
code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
|
code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
|
||||||
CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
|
CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
|
||||||
@ -557,7 +558,7 @@ TEST(CodeMapMoveAndDeleteCode) {
|
|||||||
code_map.MoveCode(ToAddress(0x1500), ToAddress(0x1700)); // Deprecate bbb.
|
code_map.MoveCode(ToAddress(0x1500), ToAddress(0x1700)); // Deprecate bbb.
|
||||||
CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1500)));
|
CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1500)));
|
||||||
CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1700)));
|
CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1700)));
|
||||||
CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
CodeEntry entry3(i::Logger::FUNCTION_TAG, "", "ccc");
|
||||||
code_map.AddCode(ToAddress(0x1750), &entry3, 0x100);
|
code_map.AddCode(ToAddress(0x1750), &entry3, 0x100);
|
||||||
CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700)));
|
CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700)));
|
||||||
CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1750)));
|
CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1750)));
|
||||||
|
Loading…
Reference in New Issue
Block a user