Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: src/profiler/heap-snapshot-generator.cc

Issue 2209673002: Remove non essential weak next_* links from the heap snapshot. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/profiler/heap-snapshot-generator.h" 5 #include "src/profiler/heap-snapshot-generator.h"
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/conversions.h" 8 #include "src/conversions.h"
9 #include "src/debug/debug.h" 9 #include "src/debug/debug.h"
10 #include "src/objects-body-descriptors.h" 10 #include "src/objects-body-descriptors.h"
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 SetInternalReference(js_fun, entry, "literals", js_fun->literals(), 1125 SetInternalReference(js_fun, entry, "literals", js_fun->literals(),
1126 JSFunction::kLiteralsOffset); 1126 JSFunction::kLiteralsOffset);
1127 TagObject(shared_info, "(shared function info)"); 1127 TagObject(shared_info, "(shared function info)");
1128 SetInternalReference(js_fun, entry, 1128 SetInternalReference(js_fun, entry,
1129 "shared", shared_info, 1129 "shared", shared_info,
1130 JSFunction::kSharedFunctionInfoOffset); 1130 JSFunction::kSharedFunctionInfoOffset);
1131 TagObject(js_fun->context(), "(context)"); 1131 TagObject(js_fun->context(), "(context)");
1132 SetInternalReference(js_fun, entry, 1132 SetInternalReference(js_fun, entry,
1133 "context", js_fun->context(), 1133 "context", js_fun->context(),
1134 JSFunction::kContextOffset); 1134 JSFunction::kContextOffset);
1135 SetWeakReference(js_fun, entry,
1136 "next_function_link", js_fun->next_function_link(),
1137 JSFunction::kNextFunctionLinkOffset);
1138 // Ensure no new weak references appeared in JSFunction. 1135 // Ensure no new weak references appeared in JSFunction.
1139 STATIC_ASSERT(JSFunction::kCodeEntryOffset == 1136 STATIC_ASSERT(JSFunction::kCodeEntryOffset ==
1140 JSFunction::kNonWeakFieldsEndOffset); 1137 JSFunction::kNonWeakFieldsEndOffset);
1141 STATIC_ASSERT(JSFunction::kCodeEntryOffset + kPointerSize == 1138 STATIC_ASSERT(JSFunction::kCodeEntryOffset + kPointerSize ==
1142 JSFunction::kNextFunctionLinkOffset); 1139 JSFunction::kNextFunctionLinkOffset);
1143 STATIC_ASSERT(JSFunction::kNextFunctionLinkOffset + kPointerSize 1140 STATIC_ASSERT(JSFunction::kNextFunctionLinkOffset + kPointerSize
1144 == JSFunction::kSize); 1141 == JSFunction::kSize);
1145 } else if (obj->IsJSGlobalObject()) { 1142 } else if (obj->IsJSGlobalObject()) {
1146 JSGlobalObject* global_obj = JSGlobalObject::cast(obj); 1143 JSGlobalObject* global_obj = JSGlobalObject::cast(obj);
1147 SetInternalReference(global_obj, entry, "native_context", 1144 SetInternalReference(global_obj, entry, "native_context",
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 EXTRACT_CONTEXT_FIELD(EXTENSION_INDEX, HeapObject, extension); 1239 EXTRACT_CONTEXT_FIELD(EXTENSION_INDEX, HeapObject, extension);
1243 EXTRACT_CONTEXT_FIELD(NATIVE_CONTEXT_INDEX, Context, native_context); 1240 EXTRACT_CONTEXT_FIELD(NATIVE_CONTEXT_INDEX, Context, native_context);
1244 if (context->IsNativeContext()) { 1241 if (context->IsNativeContext()) {
1245 TagObject(context->normalized_map_cache(), "(context norm. map cache)"); 1242 TagObject(context->normalized_map_cache(), "(context norm. map cache)");
1246 TagObject(context->embedder_data(), "(context data)"); 1243 TagObject(context->embedder_data(), "(context data)");
1247 NATIVE_CONTEXT_FIELDS(EXTRACT_CONTEXT_FIELD) 1244 NATIVE_CONTEXT_FIELDS(EXTRACT_CONTEXT_FIELD)
1248 EXTRACT_CONTEXT_FIELD(OPTIMIZED_FUNCTIONS_LIST, unused, 1245 EXTRACT_CONTEXT_FIELD(OPTIMIZED_FUNCTIONS_LIST, unused,
1249 optimized_functions_list); 1246 optimized_functions_list);
1250 EXTRACT_CONTEXT_FIELD(OPTIMIZED_CODE_LIST, unused, optimized_code_list); 1247 EXTRACT_CONTEXT_FIELD(OPTIMIZED_CODE_LIST, unused, optimized_code_list);
1251 EXTRACT_CONTEXT_FIELD(DEOPTIMIZED_CODE_LIST, unused, deoptimized_code_list); 1248 EXTRACT_CONTEXT_FIELD(DEOPTIMIZED_CODE_LIST, unused, deoptimized_code_list);
1252 EXTRACT_CONTEXT_FIELD(NEXT_CONTEXT_LINK, unused, next_context_link);
1253 #undef EXTRACT_CONTEXT_FIELD 1249 #undef EXTRACT_CONTEXT_FIELD
1254 STATIC_ASSERT(Context::OPTIMIZED_FUNCTIONS_LIST == 1250 STATIC_ASSERT(Context::OPTIMIZED_FUNCTIONS_LIST ==
1255 Context::FIRST_WEAK_SLOT); 1251 Context::FIRST_WEAK_SLOT);
1256 STATIC_ASSERT(Context::NEXT_CONTEXT_LINK + 1 == 1252 STATIC_ASSERT(Context::NEXT_CONTEXT_LINK + 1 ==
1257 Context::NATIVE_CONTEXT_SLOTS); 1253 Context::NATIVE_CONTEXT_SLOTS);
1258 STATIC_ASSERT(Context::FIRST_WEAK_SLOT + 4 == 1254 STATIC_ASSERT(Context::FIRST_WEAK_SLOT + 4 ==
1259 Context::NATIVE_CONTEXT_SLOTS); 1255 Context::NATIVE_CONTEXT_SLOTS);
1260 } 1256 }
1261 } 1257 }
1262 1258
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 Code::kHandlerTableOffset); 1444 Code::kHandlerTableOffset);
1449 TagObject(code->deoptimization_data(), "(code deopt data)"); 1445 TagObject(code->deoptimization_data(), "(code deopt data)");
1450 SetInternalReference(code, entry, 1446 SetInternalReference(code, entry,
1451 "deoptimization_data", code->deoptimization_data(), 1447 "deoptimization_data", code->deoptimization_data(),
1452 Code::kDeoptimizationDataOffset); 1448 Code::kDeoptimizationDataOffset);
1453 TagObject(code->source_position_table(), "(source position table)"); 1449 TagObject(code->source_position_table(), "(source position table)");
1454 SetInternalReference(code, entry, "source_position_table", 1450 SetInternalReference(code, entry, "source_position_table",
1455 code->source_position_table(), 1451 code->source_position_table(),
1456 Code::kSourcePositionTableOffset); 1452 Code::kSourcePositionTableOffset);
1457 if (code->kind() == Code::FUNCTION) { 1453 if (code->kind() == Code::FUNCTION) {
1458 SetInternalReference(code, entry, 1454 SetInternalReference(code, entry, "type_feedback_info",
1459 "type_feedback_info", code->type_feedback_info(), 1455 code->type_feedback_info(),
1460 Code::kTypeFeedbackInfoOffset); 1456 Code::kTypeFeedbackInfoOffset);
1461 } 1457 }
1462 SetInternalReference(code, entry, 1458 SetInternalReference(code, entry, "gc_metadata", code->gc_metadata(),
1463 "gc_metadata", code->gc_metadata(),
1464 Code::kGCMetadataOffset); 1459 Code::kGCMetadataOffset);
1465 if (code->kind() == Code::OPTIMIZED_FUNCTION) {
1466 SetWeakReference(code, entry,
1467 "next_code_link", code->next_code_link(),
1468 Code::kNextCodeLinkOffset);
1469 }
1470 } 1460 }
1471 1461
1472 void V8HeapExplorer::ExtractBoxReferences(int entry, Box* box) { 1462 void V8HeapExplorer::ExtractBoxReferences(int entry, Box* box) {
1473 SetInternalReference(box, entry, "value", box->value(), Box::kValueOffset); 1463 SetInternalReference(box, entry, "value", box->value(), Box::kValueOffset);
1474 } 1464 }
1475 1465
1476 void V8HeapExplorer::ExtractCellReferences(int entry, Cell* cell) { 1466 void V8HeapExplorer::ExtractCellReferences(int entry, Cell* cell) {
1477 SetInternalReference(cell, entry, "value", cell->value(), Cell::kValueOffset); 1467 SetInternalReference(cell, entry, "value", cell->value(), Cell::kValueOffset);
1478 } 1468 }
1479 1469
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1834 object != heap_->free_space_map() && 1824 object != heap_->free_space_map() &&
1835 object != heap_->one_pointer_filler_map() && 1825 object != heap_->one_pointer_filler_map() &&
1836 object != heap_->two_pointer_filler_map(); 1826 object != heap_->two_pointer_filler_map();
1837 } 1827 }
1838 1828
1839 bool V8HeapExplorer::IsEssentialHiddenReference(Object* parent, 1829 bool V8HeapExplorer::IsEssentialHiddenReference(Object* parent,
1840 int field_offset) { 1830 int field_offset) {
1841 if (parent->IsAllocationSite() && 1831 if (parent->IsAllocationSite() &&
1842 field_offset == AllocationSite::kWeakNextOffset) 1832 field_offset == AllocationSite::kWeakNextOffset)
1843 return false; 1833 return false;
1834 if (parent->IsJSFunction() &&
1835 field_offset == JSFunction::kNextFunctionLinkOffset)
1836 return false;
1837 if (parent->IsCode() && field_offset == Code::kNextCodeLinkOffset)
1838 return false;
1839 if (parent->IsContext() &&
1840 field_offset == Context::OffsetOfElementAt(Context::NEXT_CONTEXT_LINK))
1841 return false;
1844 if (parent->IsWeakCell() && field_offset == WeakCell::kNextOffset) 1842 if (parent->IsWeakCell() && field_offset == WeakCell::kNextOffset)
1845 return false; 1843 return false;
1846 // TODO(ulan): JSFunction, Code, and Context also have next weak link, which
1847 // is non-essential. Currently they are handled as normal weak links.
1848 // Move them here.
1849 return true; 1844 return true;
1850 } 1845 }
1851 1846
1852 void V8HeapExplorer::SetContextReference(HeapObject* parent_obj, 1847 void V8HeapExplorer::SetContextReference(HeapObject* parent_obj,
1853 int parent_entry, 1848 int parent_entry,
1854 String* reference_name, 1849 String* reference_name,
1855 Object* child_obj, 1850 Object* child_obj,
1856 int field_offset) { 1851 int field_offset) {
1857 DCHECK(parent_entry == GetEntry(parent_obj)->index()); 1852 DCHECK(parent_entry == GetEntry(parent_obj)->index());
1858 HeapEntry* child_entry = GetEntry(child_obj); 1853 HeapEntry* child_entry = GetEntry(child_obj);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1937 child_entry); 1932 child_entry);
1938 } 1933 }
1939 MarkVisitedField(parent_obj, field_offset); 1934 MarkVisitedField(parent_obj, field_offset);
1940 } 1935 }
1941 1936
1942 void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj, 1937 void V8HeapExplorer::SetHiddenReference(HeapObject* parent_obj,
1943 int parent_entry, int index, 1938 int parent_entry, int index,
1944 Object* child_obj, int field_offset) { 1939 Object* child_obj, int field_offset) {
1945 DCHECK(parent_entry == GetEntry(parent_obj)->index()); 1940 DCHECK(parent_entry == GetEntry(parent_obj)->index());
1946 HeapEntry* child_entry = GetEntry(child_obj); 1941 HeapEntry* child_entry = GetEntry(child_obj);
1947 if (child_entry != NULL && IsEssentialObject(child_obj) && 1942 if (child_entry != nullptr && IsEssentialObject(child_obj) &&
1948 IsEssentialHiddenReference(parent_obj, field_offset)) { 1943 IsEssentialHiddenReference(parent_obj, field_offset)) {
1949 filler_->SetIndexedReference(HeapGraphEdge::kHidden, 1944 filler_->SetIndexedReference(HeapGraphEdge::kHidden, parent_entry, index,
1950 parent_entry,
1951 index,
1952 child_entry); 1945 child_entry);
1953 } 1946 }
1954 } 1947 }
1955 1948
1956 1949
1957 void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj, 1950 void V8HeapExplorer::SetWeakReference(HeapObject* parent_obj,
1958 int parent_entry, 1951 int parent_entry,
1959 const char* reference_name, 1952 const char* reference_name,
1960 Object* child_obj, 1953 Object* child_obj,
1961 int field_offset) { 1954 int field_offset) {
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after
3120 for (int i = 1; i < sorted_strings.length(); ++i) { 3113 for (int i = 1; i < sorted_strings.length(); ++i) {
3121 writer_->AddCharacter(','); 3114 writer_->AddCharacter(',');
3122 SerializeString(sorted_strings[i]); 3115 SerializeString(sorted_strings[i]);
3123 if (writer_->aborted()) return; 3116 if (writer_->aborted()) return;
3124 } 3117 }
3125 } 3118 }
3126 3119
3127 3120
3128 } // namespace internal 3121 } // namespace internal
3129 } // namespace v8 3122 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698