references.h 4.06 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 11
#include "src/execution/isolate.h"
#include "src/utils/identity-map.h"
12 13 14 15

namespace v8 {
namespace internal {

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

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

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

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

  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 {
55
    return TypeBits::decode(bit_field_) == kBackReference;
56 57
  }

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

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

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

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

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

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

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

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

  uint32_t bit_field_;
95 96 97 98

  friend class SerializerReferenceMap;
};

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

class SerializerReferenceMap {
103
 public:
104 105 106 107 108 109 110 111 112 113
  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);
  }
114

115 116 117 118 119
  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;
  }
120

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

126 127 128
  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);
129 130
  }

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

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

}  // namespace internal
}  // namespace v8

#endif  // V8_SNAPSHOT_REFERENCES_H_