references.h 4.09 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2018 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_SNAPSHOT_REFERENCES_H_
#define V8_SNAPSHOT_REFERENCES_H_

8
#include "src/base/bit-field.h"
9
#include "src/base/hashmap.h"
10
#include "src/common/assert-scope.h"
11 12
#include "src/execution/isolate.h"
#include "src/utils/identity-map.h"
13 14 15 16

namespace v8 {
namespace internal {

17
enum class SnapshotSpace : byte {
18 19 20 21
  kReadOnlyHeap,
  kOld,
  kCode,
  kMap,
22
};
23 24
static constexpr int kNumberOfSnapshotSpaces =
    static_cast<int>(SnapshotSpace::kMap) + 1;
25

26 27 28
class SerializerReference {
 private:
  enum SpecialValueType {
29
    kBackReference,
30 31 32 33 34 35
    kAttachedReference,
    kOffHeapBackingStore,
    kBuiltinReference,
  };

  SerializerReference(SpecialValueType type, uint32_t value)
36
      : bit_field_(TypeBits::encode(type) | ValueBits::encode(value)) {}
37 38

 public:
39 40
  static SerializerReference BackReference(uint32_t index) {
    return SerializerReference(kBackReference, index);
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
  }

  static SerializerReference OffHeapBackingStoreReference(uint32_t index) {
    return SerializerReference(kOffHeapBackingStore, index);
  }

  static SerializerReference AttachedReference(uint32_t index) {
    return SerializerReference(kAttachedReference, index);
  }

  static SerializerReference BuiltinReference(uint32_t index) {
    return SerializerReference(kBuiltinReference, index);
  }

  bool is_back_reference() const {
56
    return TypeBits::decode(bit_field_) == kBackReference;
57 58
  }

59
  uint32_t back_ref_index() const {
60
    DCHECK(is_back_reference());
61
    return ValueBits::decode(bit_field_);
62 63 64
  }

  bool is_off_heap_backing_store_reference() const {
65
    return TypeBits::decode(bit_field_) == kOffHeapBackingStore;
66 67 68 69
  }

  uint32_t off_heap_backing_store_index() const {
    DCHECK(is_off_heap_backing_store_reference());
70
    return ValueBits::decode(bit_field_);
71 72 73
  }

  bool is_attached_reference() const {
74
    return TypeBits::decode(bit_field_) == kAttachedReference;
75 76 77 78
  }

  uint32_t attached_reference_index() const {
    DCHECK(is_attached_reference());
79
    return ValueBits::decode(bit_field_);
80 81 82
  }

  bool is_builtin_reference() const {
83
    return TypeBits::decode(bit_field_) == kBuiltinReference;
84 85
  }

86
  uint32_t builtin_index() const {
87
    DCHECK(is_builtin_reference());
88
    return ValueBits::decode(bit_field_);
89 90 91
  }

 private:
92 93 94 95
  using TypeBits = base::BitField<SpecialValueType, 0, 2>;
  using ValueBits = TypeBits::Next<uint32_t, 32 - TypeBits::kSize>;

  uint32_t bit_field_;
96 97 98 99

  friend class SerializerReferenceMap;
};

100 101 102 103
// SerializerReference has to fit in an IdentityMap value field.
STATIC_ASSERT(sizeof(SerializerReference) <= sizeof(void*));

class SerializerReferenceMap {
104
 public:
105 106 107 108 109 110 111 112 113 114
  explicit SerializerReferenceMap(Isolate* isolate)
      : map_(isolate->heap()), attached_reference_index_(0) {}

  const SerializerReference* LookupReference(HeapObject object) const {
    return map_.Find(object);
  }

  const SerializerReference* LookupReference(Handle<HeapObject> object) const {
    return map_.Find(object);
  }
115

116 117 118 119 120
  const SerializerReference* LookupBackingStore(void* backing_store) const {
    auto it = backing_store_map_.find(backing_store);
    if (it == backing_store_map_.end()) return nullptr;
    return &it->second;
  }
121

122 123 124
  void Add(HeapObject object, SerializerReference reference) {
    DCHECK_NULL(LookupReference(object));
    map_.Insert(object, reference);
125 126
  }

127 128 129
  void AddBackingStore(void* backing_store, SerializerReference reference) {
    DCHECK(backing_store_map_.find(backing_store) == backing_store_map_.end());
    backing_store_map_.emplace(backing_store, reference);
130 131
  }

132
  SerializerReference AddAttachedReference(HeapObject object) {
133 134
    SerializerReference reference =
        SerializerReference::AttachedReference(attached_reference_index_++);
135
    map_.Insert(object, reference);
136 137 138 139
    return reference;
  }

 private:
140 141
  IdentityMap<SerializerReference, base::DefaultAllocationPolicy> map_;
  std::unordered_map<void*, SerializerReference> backing_store_map_;
142 143 144 145 146 147 148
  int attached_reference_index_;
};

}  // namespace internal
}  // namespace v8

#endif  // V8_SNAPSHOT_REFERENCES_H_