13b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
23b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
33b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// found in the LICENSE file.
43b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#ifndef V8_SNAPSHOT_STARTUP_SERIALIZER_H_
63b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define V8_SNAPSHOT_STARTUP_SERIALIZER_H_
73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <bitset>
913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "include/v8.h"
103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/snapshot/serializer.h"
113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 {
133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal {
143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass StartupSerializer : public Serializer {
163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public:
173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  StartupSerializer(
1813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      Isolate* isolate,
1913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      v8::SnapshotCreator::FunctionCodeHandling function_code_handling);
203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  ~StartupSerializer() override;
213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Serialize the current state of the heap.  The order is:
233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 1) Immortal immovable roots
243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 2) Remaining strong references.
253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 3) Partial snapshot cache.
263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // 4) Weak references (e.g. the string table).
273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SerializeStrongReferences();
283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SerializeWeakReferencesAndDeferred();
293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int PartialSnapshotCacheIndex(HeapObject* o);
3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private:
33c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  class PartialCacheIndexMap {
3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch   public:
35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    PartialCacheIndexMap() : map_(), next_index_(0) {}
3613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
3713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // Lookup object in the map. Return its index if found, or create
3813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    // a new entry with new_index as value, and return kInvalidIndex.
3913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    bool LookupOrInsert(HeapObject* obj, int* index_out) {
40c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Maybe<uint32_t> maybe_index = map_.Get(obj);
41c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      if (maybe_index.IsJust()) {
42c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        *index_out = maybe_index.FromJust();
4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return true;
4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      }
4513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      *index_out = next_index_;
46c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      map_.Set(obj, next_index_++);
4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return false;
4813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }
4913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
5013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch   private:
51c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DisallowHeapAllocation no_allocation_;
52c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    HeapObjectToIndexHashMap map_;
5313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    int next_index_;
5413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
5513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    DISALLOW_COPY_AND_ASSIGN(PartialCacheIndexMap);
5613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  };
5713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // The StartupSerializer has to serialize the root array, which is slightly
593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // different.
603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void VisitPointers(Object** start, Object** end) override;
613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SerializeObject(HeapObject* o, HowToCode how_to_code,
623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                       WhereToPoint where_to_point, int skip) override;
633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void Synchronize(VisitorSynchronization::SyncTag tag) override;
643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Some roots should not be serialized, because their actual value depends on
663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // absolute addresses and they are reset after deserialization, anyway.
673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // In the first pass over the root list, we only serialize immortal immovable
683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // roots. In the second pass, we serialize the rest.
693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool RootShouldBeSkipped(int root_index);
703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
7113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool clear_function_code_;
723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool serializing_builtins_;
733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool serializing_immortal_immovables_roots_;
743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  std::bitset<Heap::kStrongRootListLength> root_has_been_serialized_;
7513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  PartialCacheIndexMap partial_cache_index_map_;
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  List<AccessorInfo*> accessor_infos_;
773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(StartupSerializer);
783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace internal
813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace v8
823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif  // V8_SNAPSHOT_STARTUP_SERIALIZER_H_
84