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