// Copyright 2021 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. #ifndef V8_HEAP_CODE_RANGE_H_ #define V8_HEAP_CODE_RANGE_H_ #include <unordered_map> #include <vector> #include "src/base/platform/mutex.h" #include "src/common/globals.h" #include "src/utils/allocation.h" #include "v8-internal.h" namespace v8 { namespace internal { // The process-wide singleton that keeps track of code range regions with the // intention to reuse free code range regions as a workaround for CFG memory // leaks (see crbug.com/870054). class CodeRangeAddressHint { … }; // A code range is a virtual memory cage that may contain executable code. It // has the following layout. // // +---------+-----+----------------- ~~~ -+ // | RW | ... | ... | // +---------+-----+------------------ ~~~ -+ // ^ ^ // base allocatable base // // <--------> <-------------------------> // reserved allocatable region // <-----------------------------------------> // CodeRange // // The start of the reservation may include reserved page with read-write access // as required by some platforms (Win64) followed by an unmapped region which // make allocatable base MemoryChunk::kAlignment-aligned. The cage's page // allocator explicitly marks the optional reserved page as occupied, so it's // excluded from further allocations. // // The following conditions hold: // 1) |reservation()->region()| == [base(), base() + size()[, // 2) if optional RW pages are not necessary, then |base| == |allocatable base|, // 3) both |base| and |allocatable base| are MemoryChunk::kAlignment-aligned. class CodeRange final : public VirtualMemoryCage { … }; } // namespace internal } // namespace v8 #endif // V8_HEAP_CODE_RANGE_H_