Index: src/profile-generator.cc |
diff --git a/src/profile-generator.cc b/src/profile-generator.cc |
index 06ee333b90170adb5eca3abdb732493263ad472e..2a3472ccf38f10aafb2ca263d0129b02e82e1df0 100644 |
--- a/src/profile-generator.cc |
+++ b/src/profile-generator.cc |
@@ -156,13 +156,18 @@ void CodeEntry::CopyData(const CodeEntry& source) { |
uint32_t CodeEntry::GetCallUid() const { |
uint32_t hash = ComputeIntegerHash(tag_); |
- hash ^= ComputeIntegerHash( |
- static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name_prefix_))); |
- hash ^= ComputeIntegerHash( |
- static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name_))); |
- hash ^= ComputeIntegerHash( |
- static_cast<uint32_t>(reinterpret_cast<uintptr_t>(resource_name_))); |
- hash ^= ComputeIntegerHash(line_number_); |
+ if (shared_id_ != 0) { |
+ hash ^= ComputeIntegerHash( |
+ static_cast<uint32_t>(shared_id_)); |
+ } else { |
+ hash ^= ComputeIntegerHash( |
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name_prefix_))); |
+ hash ^= ComputeIntegerHash( |
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name_))); |
+ hash ^= ComputeIntegerHash( |
+ static_cast<uint32_t>(reinterpret_cast<uintptr_t>(resource_name_))); |
+ hash ^= ComputeIntegerHash(line_number_); |
+ } |
return hash; |
} |
@@ -170,10 +175,12 @@ uint32_t CodeEntry::GetCallUid() const { |
bool CodeEntry::IsSameAs(CodeEntry* entry) const { |
return this == entry |
|| (tag_ == entry->tag_ |
- && name_prefix_ == entry->name_prefix_ |
- && name_ == entry->name_ |
- && resource_name_ == entry->resource_name_ |
- && line_number_ == entry->line_number_); |
+ && 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_))); |
} |
@@ -458,23 +465,12 @@ void CpuProfile::Print() { |
} |
+const CodeEntry* CodeMap::kSfiCodeEntry = NULL; |
const CodeMap::CodeTreeConfig::Key CodeMap::CodeTreeConfig::kNoKey = NULL; |
const CodeMap::CodeTreeConfig::Value CodeMap::CodeTreeConfig::kNoValue = |
CodeMap::CodeEntryInfo(NULL, 0); |
-void CodeMap::AddAlias(Address start, CodeEntry* entry, Address code_start) { |
- CodeTree::Locator locator; |
- if (tree_.Find(code_start, &locator)) { |
- const CodeEntryInfo& code_info = locator.value(); |
- if (tree_.Insert(start, &locator)) { |
- entry->CopyData(*code_info.entry); |
- locator.set_value(CodeEntryInfo(entry, code_info.size)); |
- } |
- } |
-} |
- |
- |
CodeEntry* CodeMap::FindEntry(Address addr) { |
CodeTree::Locator locator; |
if (tree_.FindGreatestLessThan(addr, &locator)) { |
@@ -487,6 +483,23 @@ CodeEntry* CodeMap::FindEntry(Address addr) { |
} |
+int CodeMap::GetSFITag(Address addr) { |
+ CodeTree::Locator locator; |
+ // For SFI entries, 'size' field is used to store their IDs. |
+ if (tree_.Find(addr, &locator)) { |
+ const CodeEntryInfo& entry = locator.value(); |
+ ASSERT(entry.entry == kSfiCodeEntry); |
+ return entry.size; |
+ } else { |
+ tree_.Insert(addr, &locator); |
+ int tag = next_sfi_tag_++; |
+ locator.set_value( |
+ CodeEntryInfo(const_cast<CodeEntry*>(kSfiCodeEntry), tag)); |
+ return tag; |
+ } |
+} |
+ |
+ |
void CodeMap::CodeTreePrinter::Call( |
const Address& key, const CodeMap::CodeEntryInfo& value) { |
OS::Print("%p %5d %s\n", key, value.size, value.entry->name()); |
@@ -715,13 +728,6 @@ CodeEntry* CpuProfilesCollection::NewCodeEntry(Logger::LogEventsAndTags tag, |
} |
-CodeEntry* CpuProfilesCollection::NewCodeEntry(int security_token_id) { |
- CodeEntry* entry = new CodeEntry(security_token_id); |
- code_entries_.Add(entry); |
- return entry; |
-} |
- |
- |
void CpuProfilesCollection::AddPathToCurrentProfiles( |
const Vector<CodeEntry*>& path) { |
// As starting / stopping profiles is rare relatively to this |
@@ -788,15 +794,6 @@ void ProfileGenerator::RecordTickSample(const TickSample& sample) { |
*entry = code_map_.FindEntry(sample.function); |
if (*entry != NULL && !(*entry)->is_js_function()) { |
*entry = NULL; |
- } else { |
- CodeEntry* pc_entry = *entries.start(); |
- if (pc_entry == NULL) { |
- *entry = NULL; |
- } else if (pc_entry->is_js_function()) { |
- // Use function entry in favor of pc entry, as function |
- // entry has security token. |
- *entries.start() = NULL; |
- } |
} |
entry++; |
} |