Line data Source code
1 : // Copyright 2017 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #include "src/snapshot/builtin-deserializer.h"
6 :
7 : #include "src/assembler-inl.h"
8 : #include "src/objects-inl.h"
9 : #include "src/snapshot/snapshot.h"
10 :
11 : namespace v8 {
12 : namespace internal {
13 :
14 : // Tracks the builtin currently being deserialized (required for allocation).
15 : class DeserializingBuiltinScope {
16 : public:
17 : DeserializingBuiltinScope(BuiltinDeserializer* builtin_deserializer,
18 : int builtin_id)
19 : : builtin_deserializer_(builtin_deserializer) {
20 : DCHECK_EQ(BuiltinDeserializer::kNoBuiltinId,
21 : builtin_deserializer->current_builtin_id_);
22 25042015 : builtin_deserializer->current_builtin_id_ = builtin_id;
23 : }
24 :
25 : ~DeserializingBuiltinScope() {
26 : builtin_deserializer_->current_builtin_id_ =
27 25042013 : BuiltinDeserializer::kNoBuiltinId;
28 : }
29 :
30 : private:
31 : BuiltinDeserializer* builtin_deserializer_;
32 :
33 : DISALLOW_COPY_AND_ASSIGN(DeserializingBuiltinScope)
34 : };
35 :
36 155730 : BuiltinDeserializer::BuiltinDeserializer(Isolate* isolate,
37 : const BuiltinSnapshotData* data)
38 155730 : : Deserializer(data, false) {
39 155730 : builtin_offsets_ = data->BuiltinOffsets();
40 : DCHECK_EQ(Builtins::builtin_count, builtin_offsets_.length());
41 : DCHECK(std::is_sorted(builtin_offsets_.begin(), builtin_offsets_.end()));
42 :
43 155730 : Initialize(isolate);
44 155730 : }
45 :
46 54973 : void BuiltinDeserializer::DeserializeEagerBuiltins() {
47 : DCHECK(!AllowHeapAllocation::IsAllowed());
48 : DCHECK_EQ(0, source()->position());
49 :
50 54973 : Builtins* builtins = isolate()->builtins();
51 38587305 : for (int i = 0; i < Builtins::builtin_count; i++) {
52 38532337 : if (IsLazyDeserializationEnabled() && Builtins::IsLazy(i)) {
53 : // Do nothing. These builtins have been replaced by DeserializeLazy in
54 : // InitializeBuiltinsTable.
55 : DCHECK_EQ(builtins->builtin(Builtins::kDeserializeLazy),
56 : builtins->builtin(i));
57 : } else {
58 24941251 : builtins->set_builtin(i, DeserializeBuiltinRaw(i));
59 : }
60 : }
61 :
62 : #ifdef DEBUG
63 : for (int i = 0; i < Builtins::builtin_count; i++) {
64 : Object* o = builtins->builtin(i);
65 : DCHECK(o->IsCode() && Code::cast(o)->is_builtin());
66 : }
67 : #endif
68 54968 : }
69 :
70 100762 : Code* BuiltinDeserializer::DeserializeBuiltin(int builtin_id) {
71 100762 : allocator()->ReserveAndInitializeBuiltinsTableForBuiltin(builtin_id);
72 : DisallowHeapAllocation no_gc;
73 100762 : return DeserializeBuiltinRaw(builtin_id);
74 : }
75 :
76 25042015 : Code* BuiltinDeserializer::DeserializeBuiltinRaw(int builtin_id) {
77 : DCHECK(!AllowHeapAllocation::IsAllowed());
78 : DCHECK(Builtins::IsBuiltinId(builtin_id));
79 :
80 : DeserializingBuiltinScope scope(this, builtin_id);
81 :
82 50084049 : const int initial_position = source()->position();
83 50084030 : source()->set_position(builtin_offsets_[builtin_id]);
84 :
85 25042015 : Object* o = ReadDataSingle();
86 : DCHECK(o->IsCode() && Code::cast(o)->is_builtin());
87 :
88 : // Rewind.
89 : source()->set_position(initial_position);
90 :
91 : // Flush the instruction cache.
92 : Code* code = Code::cast(o);
93 25042034 : Assembler::FlushICache(isolate(), code->instruction_start(),
94 50084068 : code->instruction_size());
95 :
96 25042013 : return code;
97 : }
98 :
99 25042063 : uint32_t BuiltinDeserializer::ExtractBuiltinSize(int builtin_id) {
100 : DCHECK(Builtins::IsBuiltinId(builtin_id));
101 :
102 25042063 : const int initial_position = source()->position();
103 :
104 : // Grab the size of the code object.
105 50084126 : source()->set_position(builtin_offsets_[builtin_id]);
106 : byte data = source()->Get();
107 :
108 : USE(data);
109 : DCHECK_EQ(kNewObject | kPlain | kStartOfObject | CODE_SPACE, data);
110 25042063 : const uint32_t result = source()->GetInt() << kObjectAlignmentBits;
111 :
112 : // Rewind.
113 : source()->set_position(initial_position);
114 :
115 25042053 : return result;
116 : }
117 :
118 : } // namespace internal
119 : } // namespace v8
|