v8/tools/debug_helper/heap-constants.cc
Dominik Inführ 2b63d5d093 [heap] Add flag for disabling map space
Now that we are able to compact map space, we can also get rid of the
map space and allocate maps in the old space instead. This CL introduces
a FLAG_map_space for enabling/disabling the map space but the map space
remains enabled by default for now.

Without a separate space for maps, the GC can't prevent relocation of
maps anymore. Therefore this CL always allows compaction of maps when
running without a map space. Rename flag to --compact-maps to better fit
this scenario.

mkgrokdump and debug_helper also need to be updated to look for maps
also in the old space. The map space is now optional.

Bug: v8:12578
Change-Id: Ic4e4abd0b58bee26e64329b1c92dbccb07d8105a
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3424483
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: Seth Brenith <seth.brenith@microsoft.com>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Commit-Queue: Dominik Inführ <dinfuehr@chromium.org>
Cr-Commit-Position: refs/heads/main@{#79165}
2022-02-18 09:03:07 +00:00

100 lines
3.5 KiB
C++

// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "heap-constants.h"
#include "src/common/globals.h"
namespace d = v8::debug_helper;
namespace v8 {
namespace internal {
namespace debug_helper_internal {
std::string FindKnownObject(uintptr_t address,
const d::HeapAddresses& heap_addresses) {
uintptr_t containing_page = address & ~i::kPageAlignmentMask;
uintptr_t offset_in_page = address & i::kPageAlignmentMask;
// If there's a match with a known page, then search only that page.
if (containing_page == heap_addresses.map_space_first_page) {
return FindKnownObjectInMapSpace(offset_in_page);
}
if (containing_page == heap_addresses.old_space_first_page) {
return FindKnownObjectInOldSpace(offset_in_page);
}
if (containing_page == heap_addresses.read_only_space_first_page) {
return FindKnownObjectInReadOnlySpace(offset_in_page);
}
// For any unknown pages, compile a list of things this object might be.
std::string result;
if (heap_addresses.map_space_first_page == 0) {
std::string sub_result = FindKnownObjectInMapSpace(offset_in_page);
if (!sub_result.empty()) {
result += "maybe " + sub_result;
}
}
if (heap_addresses.old_space_first_page == 0) {
std::string sub_result = FindKnownObjectInOldSpace(offset_in_page);
if (!sub_result.empty()) {
result = (result.empty() ? "" : result + ", ") + "maybe " + sub_result;
}
}
if (heap_addresses.read_only_space_first_page == 0) {
std::string sub_result = FindKnownObjectInReadOnlySpace(offset_in_page);
if (!sub_result.empty()) {
result = (result.empty() ? "" : result + ", ") + "maybe " + sub_result;
}
}
return result;
}
KnownInstanceType FindKnownMapInstanceTypes(
uintptr_t address, const d::HeapAddresses& heap_addresses) {
uintptr_t containing_page = address & ~i::kPageAlignmentMask;
uintptr_t offset_in_page = address & i::kPageAlignmentMask;
// If there's a match with a known page, then search only that page.
if (containing_page == heap_addresses.map_space_first_page) {
return KnownInstanceType(
FindKnownMapInstanceTypeInMapSpace(offset_in_page));
}
if (containing_page == heap_addresses.old_space_first_page) {
return KnownInstanceType(
FindKnownMapInstanceTypeInOldSpace(offset_in_page));
}
if (containing_page == heap_addresses.read_only_space_first_page) {
return KnownInstanceType(
FindKnownMapInstanceTypeInReadOnlySpace(offset_in_page));
}
// For any unknown pages, compile a list of things this object might be.
KnownInstanceType result;
if (heap_addresses.map_space_first_page == 0) {
int sub_result = FindKnownMapInstanceTypeInMapSpace(offset_in_page);
if (sub_result >= 0) {
result.types.push_back(static_cast<i::InstanceType>(sub_result));
}
}
if (heap_addresses.old_space_first_page == 0) {
int sub_result = FindKnownMapInstanceTypeInOldSpace(offset_in_page);
if (sub_result >= 0) {
result.types.push_back(static_cast<i::InstanceType>(sub_result));
}
}
if (heap_addresses.read_only_space_first_page == 0) {
int sub_result = FindKnownMapInstanceTypeInReadOnlySpace(offset_in_page);
if (sub_result >= 0) {
result.types.push_back(static_cast<i::InstanceType>(sub_result));
}
}
return result;
}
} // namespace debug_helper_internal
} // namespace internal
} // namespace v8