Commit 9a149afc authored by Camillo Bruni's avatar Camillo Bruni Committed by Commit Bot

[heap-object-stats] Account PreparseData and scope_data together

Drive-by-fix:
- Add several iterator instance types to user objects
- Add JSProxy instance type to user objects
- Rename *PRE_PARSED_SCOPE* to *PREPARSE_DATA*

Change-Id: Ia1304871c91bb4e7e46ae0aef6084ded985b9a9f
Reviewed-on: https://chromium-review.googlesource.com/c/1405040Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
Reviewed-by: 's avatarMichael Lippautz <mlippautz@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58745}
parent 234f27b5
......@@ -13357,8 +13357,8 @@ TNode<Code> CodeStubAssembler::GetSharedFunctionInfoCode(
int32_t case_values[] = {BYTECODE_ARRAY_TYPE,
WASM_EXPORTED_FUNCTION_DATA_TYPE,
ASM_WASM_DATA_TYPE,
UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE,
UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE,
UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE,
UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE,
FUNCTION_TEMPLATE_INFO_TYPE};
Label check_is_bytecode_array(this);
Label check_is_exported_function_data(this);
......
......@@ -318,9 +318,9 @@ Type::bitset BitsetType::Lub(const MapRefLike& map) {
case MODULE_TYPE:
case MODULE_INFO_ENTRY_TYPE:
case CELL_TYPE:
case PRE_PARSED_SCOPE_DATA_TYPE:
case UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE:
case PREPARSE_DATA_TYPE:
case UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE:
case UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE:
return kOtherInternal;
// Remaining instance types are unsupported for now. If any of them do
......
......@@ -401,6 +401,7 @@ class ObjectStatsCollectorImpl {
void RecordVirtualExternalStringDetails(ExternalString script);
void RecordVirtualSharedFunctionInfoDetails(SharedFunctionInfo info);
void RecordVirtualJSFunctionDetails(JSFunction function);
void RecordVirtualPreparseDataDetails(PreparseData data);
void RecordVirtualArrayBoilerplateDescription(
ArrayBoilerplateDescription description);
......@@ -607,48 +608,58 @@ static ObjectStats::VirtualInstanceType GetFeedbackSlotType(
void ObjectStatsCollectorImpl::RecordVirtualFeedbackVectorDetails(
FeedbackVector vector) {
if (virtual_objects_.find(vector) == virtual_objects_.end()) {
// Manually insert the feedback vector into the virtual object list, since
// we're logging its component parts separately.
virtual_objects_.insert(vector);
size_t calculated_size = 0;
// Log the feedback vector's header (fixed fields).
size_t header_size = vector->slots_start().address() - vector->address();
stats_->RecordVirtualObjectStats(ObjectStats::FEEDBACK_VECTOR_HEADER_TYPE,
header_size,
ObjectStats::kNoOverAllocation);
calculated_size += header_size;
// Iterate over the feedback slots and log each one.
if (!vector->shared_function_info()->HasFeedbackMetadata()) return;
FeedbackMetadataIterator it(vector->metadata());
while (it.HasNext()) {
FeedbackSlot slot = it.Next();
// Log the entry (or entries) taken up by this slot.
size_t slot_size = it.entry_size() * kTaggedSize;
stats_->RecordVirtualObjectStats(
GetFeedbackSlotType(vector->Get(slot), it.kind(), heap_->isolate()),
slot_size, ObjectStats::kNoOverAllocation);
calculated_size += slot_size;
// Log the monomorphic/polymorphic helper objects that this slot owns.
for (int i = 0; i < it.entry_size(); i++) {
MaybeObject raw_object = vector->get(slot.ToInt() + i);
HeapObject object;
if (raw_object->GetHeapObject(&object)) {
if (object->IsCell() || object->IsWeakFixedArray()) {
RecordSimpleVirtualObjectStats(
vector, object, ObjectStats::FEEDBACK_VECTOR_ENTRY_TYPE);
}
if (virtual_objects_.find(vector) != virtual_objects_.end()) return;
// Manually insert the feedback vector into the virtual object list, since
// we're logging its component parts separately.
virtual_objects_.insert(vector);
size_t calculated_size = 0;
// Log the feedback vector's header (fixed fields).
size_t header_size = vector->slots_start().address() - vector->address();
stats_->RecordVirtualObjectStats(ObjectStats::FEEDBACK_VECTOR_HEADER_TYPE,
header_size, ObjectStats::kNoOverAllocation);
calculated_size += header_size;
// Iterate over the feedback slots and log each one.
if (!vector->shared_function_info()->HasFeedbackMetadata()) return;
FeedbackMetadataIterator it(vector->metadata());
while (it.HasNext()) {
FeedbackSlot slot = it.Next();
// Log the entry (or entries) taken up by this slot.
size_t slot_size = it.entry_size() * kTaggedSize;
stats_->RecordVirtualObjectStats(
GetFeedbackSlotType(vector->Get(slot), it.kind(), heap_->isolate()),
slot_size, ObjectStats::kNoOverAllocation);
calculated_size += slot_size;
// Log the monomorphic/polymorphic helper objects that this slot owns.
for (int i = 0; i < it.entry_size(); i++) {
MaybeObject raw_object = vector->get(slot.ToInt() + i);
HeapObject object;
if (raw_object->GetHeapObject(&object)) {
if (object->IsCell() || object->IsWeakFixedArray()) {
RecordSimpleVirtualObjectStats(
vector, object, ObjectStats::FEEDBACK_VECTOR_ENTRY_TYPE);
}
}
}
CHECK_EQ(calculated_size, vector->Size());
}
CHECK_EQ(calculated_size, vector->Size());
}
void ObjectStatsCollectorImpl::RecordVirtualPreparseDataDetails(
PreparseData data) {
if (virtual_objects_.find(data) != virtual_objects_.end()) return;
// Manually insert the PreparseData since we're combining the size with it's
// byte_data size.
virtual_objects_.insert(data);
virtual_objects_.insert(data->scope_data());
size_t size = data->Size() + data->scope_data()->Size();
DCHECK_LE(0, data->scope_data()->length());
stats_->RecordObjectStats(PREPARSE_DATA_TYPE, size);
}
void ObjectStatsCollectorImpl::RecordVirtualFixedArrayDetails(
......@@ -695,6 +706,8 @@ void ObjectStatsCollectorImpl::CollectStatistics(
} else if (obj->IsArrayBoilerplateDescription()) {
RecordVirtualArrayBoilerplateDescription(
ArrayBoilerplateDescription::cast(obj));
} else if (obj->IsPreparseData()) {
RecordVirtualPreparseDataDetails(PreparseData::cast(obj));
} else if (obj->IsFixedArrayExact()) {
// Has to go last as it triggers too eagerly.
RecordVirtualFixedArrayDetails(FixedArray::cast(obj));
......
......@@ -489,11 +489,11 @@ bool Heap::CreateInitialMaps() {
ALLOCATE_MAP(CALL_HANDLER_INFO_TYPE, CallHandlerInfo::kSize,
next_call_side_effect_free_call_handler_info)
ALLOCATE_VARSIZE_MAP(PRE_PARSED_SCOPE_DATA_TYPE, preparse_data)
ALLOCATE_MAP(UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE,
ALLOCATE_VARSIZE_MAP(PREPARSE_DATA_TYPE, preparse_data)
ALLOCATE_MAP(UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE,
UncompiledDataWithoutPreparseData::kSize,
uncompiled_data_without_preparse_data)
ALLOCATE_MAP(UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE,
ALLOCATE_MAP(UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE,
UncompiledDataWithPreparseData::kSize,
uncompiled_data_with_preparse_data)
ALLOCATE_MAP(SHARED_FUNCTION_INFO_TYPE, SharedFunctionInfo::kAlignedSize,
......
......@@ -992,12 +992,12 @@ ReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3, T4 p4) {
case CODE_DATA_CONTAINER_TYPE:
return Op::template apply<CodeDataContainer::BodyDescriptor>(p1, p2, p3,
p4);
case PRE_PARSED_SCOPE_DATA_TYPE:
case PREPARSE_DATA_TYPE:
return Op::template apply<PreparseData::BodyDescriptor>(p1, p2, p3, p4);
case UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE:
return Op::template apply<
UncompiledDataWithoutPreparseData::BodyDescriptor>(p1, p2, p3, p4);
case UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE:
return Op::template apply<UncompiledDataWithPreparseData::BodyDescriptor>(
p1, p2, p3, p4);
case HEAP_NUMBER_TYPE:
......
......@@ -367,14 +367,14 @@ void HeapObject::HeapObjectVerify(Isolate* isolate) {
case FOREIGN_TYPE:
Foreign::cast(*this)->ForeignVerify(isolate);
break;
case PRE_PARSED_SCOPE_DATA_TYPE:
case PREPARSE_DATA_TYPE:
PreparseData::cast(*this)->PreparseDataVerify(isolate);
break;
case UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE:
UncompiledDataWithoutPreparseData::cast(*this)
->UncompiledDataWithoutPreparseDataVerify(isolate);
break;
case UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE:
UncompiledDataWithPreparseData::cast(*this)
->UncompiledDataWithPreparseDataVerify(isolate);
break;
......
......@@ -164,7 +164,7 @@ namespace internal {
V(FEEDBACK_CELL_TYPE) \
V(FEEDBACK_VECTOR_TYPE) \
V(LOAD_HANDLER_TYPE) \
V(PRE_PARSED_SCOPE_DATA_TYPE) \
V(PREPARSE_DATA_TYPE) \
V(PROPERTY_ARRAY_TYPE) \
V(PROPERTY_CELL_TYPE) \
V(SHARED_FUNCTION_INFO_TYPE) \
......@@ -172,8 +172,8 @@ namespace internal {
V(SMALL_ORDERED_HASH_SET_TYPE) \
V(SMALL_ORDERED_NAME_DICTIONARY_TYPE) \
V(STORE_HANDLER_TYPE) \
V(UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE) \
V(UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE) \
V(UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE) \
V(UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE) \
V(WEAK_ARRAY_LIST_TYPE) \
\
V(JS_PROXY_TYPE) \
......
......@@ -1083,7 +1083,7 @@ int HeapObject::SizeFromMap(Map map) const {
if (instance_type == BIGINT_TYPE) {
return BigInt::SizeFor(BigInt::unchecked_cast(*this)->length());
}
if (instance_type == PRE_PARSED_SCOPE_DATA_TYPE) {
if (instance_type == PREPARSE_DATA_TYPE) {
return PreparseData::SizeFor(PreparseData::unchecked_cast(*this)->length());
}
if (instance_type == CODE_TYPE) {
......
......@@ -316,14 +316,14 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT
case CALL_HANDLER_INFO_TYPE:
CallHandlerInfo::cast(*this)->CallHandlerInfoPrint(os);
break;
case PRE_PARSED_SCOPE_DATA_TYPE:
case PREPARSE_DATA_TYPE:
PreparseData::cast(*this)->PreparseDataPrint(os);
break;
case UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE:
UncompiledDataWithoutPreparseData::cast(*this)
->UncompiledDataWithoutPreparseDataPrint(os);
break;
case UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE:
UncompiledDataWithPreparseData::cast(*this)
->UncompiledDataWithPreparseDataPrint(os);
break;
......
......@@ -3232,13 +3232,13 @@ VisitorId Map::GetVisitorId(Map map) {
case WASM_INSTANCE_TYPE:
return kVisitWasmInstanceObject;
case PRE_PARSED_SCOPE_DATA_TYPE:
case PREPARSE_DATA_TYPE:
return kVisitPreparseData;
case UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE:
return kVisitUncompiledDataWithoutPreparseData;
case UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE:
case UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE:
return kVisitUncompiledDataWithPreparseData;
case JS_OBJECT_TYPE:
......@@ -3598,13 +3598,13 @@ void HeapObject::HeapObjectShortPrint(std::ostream& os) { // NOLINT
TYPED_ARRAYS(TYPED_ARRAY_SHORT_PRINT)
#undef TYPED_ARRAY_SHORT_PRINT
case PRE_PARSED_SCOPE_DATA_TYPE: {
case PREPARSE_DATA_TYPE: {
PreparseData data = PreparseData::cast(*this);
os << "<PreparseData[" << data->length() << "]>";
break;
}
case UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE: {
case UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE: {
UncompiledDataWithoutPreparseData data =
UncompiledDataWithoutPreparseData::cast(*this);
os << "<UncompiledDataWithoutPreparseData (" << data->start_position()
......@@ -3612,7 +3612,7 @@ void HeapObject::HeapObjectShortPrint(std::ostream& os) { // NOLINT
break;
}
case UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE: {
case UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE: {
UncompiledDataWithPreparseData data =
UncompiledDataWithPreparseData::cast(*this);
os << "<UncompiledDataWithPreparseData (" << data->start_position()
......
This diff is collapsed.
......@@ -46,16 +46,15 @@ class PreparseData : public HeapObject {
DECL_VERIFIER(PreparseData)
// Layout description.
#define PRE_PARSED_SCOPE_DATA_FIELDS(V) \
#define PREPARSE_DATA_FIELDS(V) \
V(kScopeDataOffset, kTaggedSize) \
V(kLengthOffset, kIntSize) \
V(kOptionalPaddingOffset, POINTER_SIZE_PADDING(kOptionalPaddingOffset)) \
/* Header size. */ \
V(kChildDataStartOffset, 0)
DEFINE_FIELD_OFFSET_CONSTANTS(HeapObject::kHeaderSize,
PRE_PARSED_SCOPE_DATA_FIELDS)
#undef PRE_PARSED_SCOPE_DATA_FIELDS
DEFINE_FIELD_OFFSET_CONSTANTS(HeapObject::kHeaderSize, PREPARSE_DATA_FIELDS)
#undef PREPARSE_DATA_FIELDS
class BodyDescriptor;
......@@ -148,16 +147,16 @@ class UncompiledDataWithPreparseData : public UncompiledData {
// Layout description.
#define UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_FIELDS(V) \
V(kStartOfPointerFieldsOffset, 0) \
V(kPreparseDataOffset, kTaggedSize) \
V(kEndOfTaggedFieldsOffset, 0) \
/* Total size. */ \
#define UNCOMPILED_DATA_WITH_PREPARSE_DATA_FIELDS(V) \
V(kStartOfPointerFieldsOffset, 0) \
V(kPreparseDataOffset, kTaggedSize) \
V(kEndOfTaggedFieldsOffset, 0) \
/* Total size. */ \
V(kSize, 0)
DEFINE_FIELD_OFFSET_CONSTANTS(UncompiledData::kSize,
UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_FIELDS)
#undef UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_FIELDS
UNCOMPILED_DATA_WITH_PREPARSE_DATA_FIELDS)
#undef UNCOMPILED_DATA_WITH_PREPARSE_DATA_FIELDS
// Make sure the size is aligned
STATIC_ASSERT(kSize == POINTER_SIZE_ALIGN(kSize));
......
......@@ -34,6 +34,7 @@ const CATEGORIES = new Map([
'INTERNALIZED_STRING_TYPE',
'JS_ARGUMENTS_TYPE',
'JS_ARRAY_BUFFER_TYPE',
'JS_ARRAY_ITERATOR_TYPE',
'JS_ARRAY_TYPE',
'JS_BOUND_FUNCTION_TYPE',
'JS_DATE_TYPE',
......@@ -59,13 +60,16 @@ const CATEGORIES = new Map([
'JS_INTL_SEGMENT_ITERATOR_TYPE',
'JS_INTL_SEGMENTER_TYPE',
'JS_INTL_V8_BREAK_ITERATOR_TYPE',
'JS_MAP_KEY_ITERATOR_TYPE',
'JS_MAP_KEY_VALUE_ITERATOR_TYPE',
'JS_MAP_TYPE',
'JS_MAP_VALUE_ITERATOR_TYPE',
'JS_MESSAGE_OBJECT_TYPE',
'JS_OBJECT_TYPE',
'JS_PROMISE_TYPE',
'JS_PROXY_TYPE',
'JS_REGEXP_TYPE',
'JS_SET_KEY_VALUE_ITERATOR_TYPE',
'JS_SET_TYPE',
'JS_SET_VALUE_ITERATOR_TYPE',
'JS_STRING_ITERATOR_TYPE',
......@@ -80,10 +84,6 @@ const CATEGORIES = new Map([
'ONE_BYTE_STRING_TYPE',
'OTHER_CONTEXT_TYPE',
'PROPERTY_ARRAY_TYPE',
'UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE',
'UNCACHED_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE',
'UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE',
'UNCACHED_EXTERNAL_STRING_TYPE',
'SLICED_ONE_BYTE_STRING_TYPE',
'SLICED_STRING_TYPE',
'STRING_EXTERNAL_RESOURCE_ONE_BYTE_TYPE',
......@@ -92,6 +92,10 @@ const CATEGORIES = new Map([
'SYMBOL_TYPE',
'THIN_ONE_BYTE_STRING_TYPE',
'THIN_STRING_TYPE',
'UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE',
'UNCACHED_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE',
'UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE',
'UNCACHED_EXTERNAL_STRING_TYPE',
'WASM_INSTANCE_TYPE',
'WASM_MEMORY_TYPE',
'WASM_MODULE_TYPE',
......@@ -176,7 +180,7 @@ const CATEGORIES = new Map([
'NOSCRIPT_SHARED_FUNCTION_INFOS_TYPE',
'OPTIMIZED_CODE_LITERALS_TYPE',
'OPTIMIZED_FUNCTION',
'PRE_PARSED_SCOPE_DATA_TYPE',
'PREPARSE_DATA_TYPE',
'REGEXP',
'RELOC_INFO_TYPE',
'SCRIPT_SOURCE_EXTERNAL_ONE_BYTE_TYPE',
......@@ -189,8 +193,8 @@ const CATEGORIES = new Map([
'SOURCE_POSITION_TABLE_TYPE',
'STORE_HANDLER_TYPE',
'STUB',
'UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE',
'UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE',
'UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE',
'UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE',
'UNCOMPILED_JS_FUNCTION_TYPE',
'UNCOMPILED_SHARED_FUNCTION_INFO_TYPE'
])
......
......@@ -121,7 +121,7 @@ INSTANCE_TYPES = {
217: "FEEDBACK_CELL_TYPE",
218: "FEEDBACK_VECTOR_TYPE",
219: "LOAD_HANDLER_TYPE",
220: "PRE_PARSED_SCOPE_DATA_TYPE",
220: "PREPARSE_DATA_TYPE",
221: "PROPERTY_ARRAY_TYPE",
222: "PROPERTY_CELL_TYPE",
223: "SHARED_FUNCTION_INFO_TYPE",
......@@ -129,8 +129,8 @@ INSTANCE_TYPES = {
225: "SMALL_ORDERED_HASH_SET_TYPE",
226: "SMALL_ORDERED_NAME_DICTIONARY_TYPE",
227: "STORE_HANDLER_TYPE",
228: "UNCOMPILED_DATA_WITHOUT_PRE_PARSED_SCOPE_TYPE",
229: "UNCOMPILED_DATA_WITH_PRE_PARSED_SCOPE_TYPE",
228: "UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE",
229: "UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE",
230: "WEAK_ARRAY_LIST_TYPE",
1024: "JS_PROXY_TYPE",
1025: "JS_GLOBAL_OBJECT_TYPE",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment