basic-memory-chunk.cc 4.54 KB
Newer Older
1 2 3 4 5 6 7 8 9
// 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 "src/heap/basic-memory-chunk.h"

#include <cstdlib>

#include "src/heap/heap-write-barrier-inl.h"
10
#include "src/heap/incremental-marking.h"
11
#include "src/objects/heap-object.h"
12
#include "src/utils/allocation.h"
13 14 15 16 17

namespace v8 {
namespace internal {

// Verify write barrier offsets match the the real offsets.
18
static_assert(BasicMemoryChunk::Flag::IS_EXECUTABLE ==
19
              heap_internals::MemoryChunk::kIsExecutableBit);
20 21
static_assert(BasicMemoryChunk::Flag::IN_SHARED_HEAP ==
              heap_internals::MemoryChunk::kInSharedHeapBit);
22
static_assert(BasicMemoryChunk::Flag::INCREMENTAL_MARKING ==
23
              heap_internals::MemoryChunk::kMarkingBit);
24
static_assert(BasicMemoryChunk::Flag::FROM_PAGE ==
25
              heap_internals::MemoryChunk::kFromPageBit);
26
static_assert(BasicMemoryChunk::Flag::TO_PAGE ==
27
              heap_internals::MemoryChunk::kToPageBit);
28
static_assert(BasicMemoryChunk::Flag::READ_ONLY_HEAP ==
29
              heap_internals::MemoryChunk::kReadOnlySpaceBit);
30
static_assert(BasicMemoryChunk::kFlagsOffset ==
31
              heap_internals::MemoryChunk::kFlagsOffset);
32
static_assert(BasicMemoryChunk::kHeapOffset ==
33 34
              heap_internals::MemoryChunk::kHeapOffset);

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
// static
constexpr BasicMemoryChunk::MainThreadFlags BasicMemoryChunk::kAllFlagsMask;
// static
constexpr BasicMemoryChunk::MainThreadFlags
    BasicMemoryChunk::kPointersToHereAreInterestingMask;
// static
constexpr BasicMemoryChunk::MainThreadFlags
    BasicMemoryChunk::kPointersFromHereAreInterestingMask;
// static
constexpr BasicMemoryChunk::MainThreadFlags
    BasicMemoryChunk::kEvacuationCandidateMask;
// static
constexpr BasicMemoryChunk::MainThreadFlags
    BasicMemoryChunk::kIsInYoungGenerationMask;
// static
constexpr BasicMemoryChunk::MainThreadFlags BasicMemoryChunk::kIsLargePageMask;
// static
constexpr BasicMemoryChunk::MainThreadFlags
    BasicMemoryChunk::kSkipEvacuationSlotsRecordingMask;

55 56 57 58 59 60 61 62 63 64 65 66 67
BasicMemoryChunk::BasicMemoryChunk(Heap* heap, BaseSpace* space,
                                   size_t chunk_size, Address area_start,
                                   Address area_end, VirtualMemory reservation)
    : size_(chunk_size),
      heap_(heap),
      area_start_(area_start),
      area_end_(area_end),
      allocated_bytes_(area_end - area_start),
      wasted_memory_(0),
      high_water_mark_(area_start - reinterpret_cast<Address>(this)),
      owner_(space),
      reservation_(std::move(reservation)) {
  marking_bitmap<AccessMode::NON_ATOMIC>()->Clear();
68 69
}

70 71 72 73 74 75 76 77 78
bool BasicMemoryChunk::InOldSpace() const {
  return owner()->identity() == OLD_SPACE;
}

bool BasicMemoryChunk::InLargeObjectSpace() const {
  return owner()->identity() == LO_SPACE;
}

#ifdef THREAD_SANITIZER
79 80 81 82 83
void BasicMemoryChunk::SynchronizedHeapLoad() const {
  CHECK(reinterpret_cast<Heap*>(
            base::Acquire_Load(reinterpret_cast<base::AtomicWord*>(
                &(const_cast<BasicMemoryChunk*>(this)->heap_)))) != nullptr ||
        InReadOnlySpaceRaw());
84 85 86
}
#endif

87 88
class BasicMemoryChunkValidator {
  // Computed offsets should match the compiler generated ones.
89
  static_assert(BasicMemoryChunk::kSizeOffset ==
90
                offsetof(BasicMemoryChunk, size_));
91
  static_assert(BasicMemoryChunk::kFlagsOffset ==
92
                offsetof(BasicMemoryChunk, main_thread_flags_));
93
  static_assert(BasicMemoryChunk::kHeapOffset ==
94
                offsetof(BasicMemoryChunk, heap_));
95
  static_assert(offsetof(BasicMemoryChunk, size_) ==
96
                MemoryChunkLayout::kSizeOffset);
97
  static_assert(offsetof(BasicMemoryChunk, heap_) ==
98
                MemoryChunkLayout::kHeapOffset);
99
  static_assert(offsetof(BasicMemoryChunk, area_start_) ==
100
                MemoryChunkLayout::kAreaStartOffset);
101
  static_assert(offsetof(BasicMemoryChunk, area_end_) ==
102
                MemoryChunkLayout::kAreaEndOffset);
103
  static_assert(offsetof(BasicMemoryChunk, allocated_bytes_) ==
104
                MemoryChunkLayout::kAllocatedBytesOffset);
105
  static_assert(offsetof(BasicMemoryChunk, wasted_memory_) ==
106
                MemoryChunkLayout::kWastedMemoryOffset);
107
  static_assert(offsetof(BasicMemoryChunk, high_water_mark_) ==
108
                MemoryChunkLayout::kHighWaterMarkOffset);
109
  static_assert(offsetof(BasicMemoryChunk, owner_) ==
110
                MemoryChunkLayout::kOwnerOffset);
111
  static_assert(offsetof(BasicMemoryChunk, reservation_) ==
112 113 114
                MemoryChunkLayout::kReservationOffset);
};

115 116
}  // namespace internal
}  // namespace v8