| Index: src/profile-generator.cc
|
| diff --git a/src/profile-generator.cc b/src/profile-generator.cc
|
| index 292e3325d1df42f7d397cb326ce3627d59104d24..6f58cc54a39e7687800ca167a222e7531925aba3 100644
|
| --- a/src/profile-generator.cc
|
| +++ b/src/profile-generator.cc
|
| @@ -169,10 +169,12 @@ CodeEntry::~CodeEntry() {
|
| }
|
|
|
|
|
| -uint32_t CodeEntry::GetCallUid() const {
|
| +uint32_t CodeEntry::GetHash() const {
|
| uint32_t hash = ComputeIntegerHash(tag(), v8::internal::kZeroHashSeed);
|
| - if (shared_id_ != 0) {
|
| - hash ^= ComputeIntegerHash(static_cast<uint32_t>(shared_id_),
|
| + if (script_id_ != v8::UnboundScript::kNoScriptId) {
|
| + hash ^= ComputeIntegerHash(static_cast<uint32_t>(script_id_),
|
| + v8::internal::kZeroHashSeed);
|
| + hash ^= ComputeIntegerHash(static_cast<uint32_t>(position_),
|
| v8::internal::kZeroHashSeed);
|
| } else {
|
| hash ^= ComputeIntegerHash(
|
| @@ -190,13 +192,14 @@ uint32_t CodeEntry::GetCallUid() const {
|
| }
|
|
|
|
|
| -bool CodeEntry::IsSameAs(CodeEntry* entry) const {
|
| - return this == entry ||
|
| - (tag() == entry->tag() && shared_id_ == entry->shared_id_ &&
|
| - (shared_id_ != 0 ||
|
| - (name_prefix_ == entry->name_prefix_ && name_ == entry->name_ &&
|
| - resource_name_ == entry->resource_name_ &&
|
| - line_number_ == entry->line_number_)));
|
| +bool CodeEntry::IsSameFunctionAs(CodeEntry* entry) const {
|
| + if (this == entry) return true;
|
| + if (script_id_ != v8::UnboundScript::kNoScriptId) {
|
| + return script_id_ == entry->script_id_ && position_ == entry->position_;
|
| + }
|
| + return name_prefix_ == entry->name_prefix_ && name_ == entry->name_ &&
|
| + resource_name_ == entry->resource_name_ &&
|
| + line_number_ == entry->line_number_;
|
| }
|
|
|
|
|
| @@ -214,6 +217,15 @@ int CodeEntry::GetSourceLine(int pc_offset) const {
|
| }
|
|
|
|
|
| +void CodeEntry::FillFunctionInfo(SharedFunctionInfo* shared) {
|
| + if (!shared->script()->IsScript()) return;
|
| + Script* script = Script::cast(shared->script());
|
| + set_script_id(script->id()->value());
|
| + set_position(shared->start_position());
|
| + set_bailout_reason(GetBailoutReason(shared->disable_optimization_reason()));
|
| +}
|
| +
|
| +
|
| void ProfileNode::CollectDeoptInfo(CodeEntry* entry) {
|
| deopt_infos_.Add(DeoptInfo(entry->deopt_reason(), entry->deopt_location()));
|
| entry->clear_deopt_info();
|
| @@ -316,8 +328,9 @@ class DeleteNodesCallback {
|
| ProfileTree::ProfileTree()
|
| : root_entry_(Logger::FUNCTION_TAG, "(root)"),
|
| next_node_id_(1),
|
| - root_(new ProfileNode(this, &root_entry_)) {
|
| -}
|
| + root_(new ProfileNode(this, &root_entry_)),
|
| + next_function_id_(1),
|
| + function_ids_(ProfileNode::CodeEntriesMatch) {}
|
|
|
|
|
| ProfileTree::~ProfileTree() {
|
| @@ -326,6 +339,17 @@ ProfileTree::~ProfileTree() {
|
| }
|
|
|
|
|
| +unsigned ProfileTree::GetFunctionId(const ProfileNode* node) {
|
| + CodeEntry* code_entry = node->entry();
|
| + HashMap::Entry* entry =
|
| + function_ids_.Lookup(code_entry, code_entry->GetHash(), true);
|
| + if (!entry->value) {
|
| + entry->value = reinterpret_cast<void*>(next_function_id_++);
|
| + }
|
| + return static_cast<unsigned>(reinterpret_cast<uintptr_t>(entry->value));
|
| +}
|
| +
|
| +
|
| ProfileNode* ProfileTree::AddPathFromEnd(const Vector<CodeEntry*>& path,
|
| int src_line) {
|
| ProfileNode* node = root_;
|
| @@ -427,7 +451,6 @@ void CpuProfile::Print() {
|
| }
|
|
|
|
|
| -CodeEntry* const CodeMap::kSharedFunctionCodeEntry = NULL;
|
| const CodeMap::CodeTreeConfig::Key CodeMap::CodeTreeConfig::kNoKey = NULL;
|
|
|
|
|
| @@ -469,22 +492,6 @@ CodeEntry* CodeMap::FindEntry(Address addr, Address* start) {
|
| }
|
|
|
|
|
| -int CodeMap::GetSharedId(Address addr) {
|
| - CodeTree::Locator locator;
|
| - // For shared function entries, 'size' field is used to store their IDs.
|
| - if (tree_.Find(addr, &locator)) {
|
| - const CodeEntryInfo& entry = locator.value();
|
| - DCHECK(entry.entry == kSharedFunctionCodeEntry);
|
| - return entry.size;
|
| - } else {
|
| - tree_.Insert(addr, &locator);
|
| - int id = next_shared_id_++;
|
| - locator.set_value(CodeEntryInfo(kSharedFunctionCodeEntry, id));
|
| - return id;
|
| - }
|
| -}
|
| -
|
| -
|
| void CodeMap::MoveCode(Address from, Address to) {
|
| if (from == to) return;
|
| CodeTree::Locator locator;
|
| @@ -497,12 +504,7 @@ void CodeMap::MoveCode(Address from, Address to) {
|
|
|
| void CodeMap::CodeTreePrinter::Call(
|
| const Address& key, const CodeMap::CodeEntryInfo& value) {
|
| - // For shared function entries, 'size' field is used to store their IDs.
|
| - if (value.entry == kSharedFunctionCodeEntry) {
|
| - base::OS::Print("%p SharedFunctionInfo %d\n", key, value.size);
|
| - } else {
|
| - base::OS::Print("%p %5d %s\n", key, value.size, value.entry->name());
|
| - }
|
| + base::OS::Print("%p %5d %s\n", key, value.size, value.entry->name());
|
| }
|
|
|
|
|
|
|