• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 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 #ifndef V8_DEOPTIMIZER_TRANSLATION_ARRAY_H_
6 #define V8_DEOPTIMIZER_TRANSLATION_ARRAY_H_
7 
8 #include "src/codegen/register.h"
9 #include "src/deoptimizer/translation-opcode.h"
10 #include "src/objects/fixed-array.h"
11 #include "src/zone/zone-containers.h"
12 
13 #if V8_ENABLE_WEBASSEMBLY
14 #include "src/wasm/value-type.h"
15 #endif  // V8_ENABLE_WEBASSEMBLY
16 
17 namespace v8 {
18 namespace internal {
19 
20 class Factory;
21 
22 // The TranslationArray is the on-heap representation of translations created
23 // during code generation in a (zone-allocated) TranslationArrayBuilder. The
24 // translation array specifies how to transform an optimized frame back into
25 // one or more unoptimized frames.
26 // TODO(jgruber): Consider a real type instead of this type alias.
27 using TranslationArray = ByteArray;
28 
29 class TranslationArrayIterator {
30  public:
31   TranslationArrayIterator(TranslationArray buffer, int index);
32 
33   int32_t Next();
34 
35   bool HasNext() const;
36 
Skip(int n)37   void Skip(int n) {
38     for (int i = 0; i < n; i++) Next();
39   }
40 
41  private:
42   std::vector<int32_t> uncompressed_contents_;
43   TranslationArray buffer_;
44   int index_;
45 };
46 
47 class TranslationArrayBuilder {
48  public:
TranslationArrayBuilder(Zone * zone)49   explicit TranslationArrayBuilder(Zone* zone)
50       : contents_(zone), contents_for_compression_(zone), zone_(zone) {}
51 
52   Handle<TranslationArray> ToTranslationArray(Factory* factory);
53 
BeginTranslation(int frame_count,int jsframe_count,int update_feedback_count)54   int BeginTranslation(int frame_count, int jsframe_count,
55                        int update_feedback_count) {
56     int start_index = Size();
57     auto opcode = TranslationOpcode::BEGIN;
58     Add(opcode);
59     Add(frame_count);
60     Add(jsframe_count);
61     Add(update_feedback_count);
62     DCHECK_EQ(TranslationOpcodeOperandCount(opcode), 3);
63     return start_index;
64   }
65 
66   void BeginInterpretedFrame(BytecodeOffset bytecode_offset, int literal_id,
67                              unsigned height, int return_value_offset,
68                              int return_value_count);
69   void BeginArgumentsAdaptorFrame(int literal_id, unsigned height);
70   void BeginConstructStubFrame(BytecodeOffset bailout_id, int literal_id,
71                                unsigned height);
72   void BeginBuiltinContinuationFrame(BytecodeOffset bailout_id, int literal_id,
73                                      unsigned height);
74 #if V8_ENABLE_WEBASSEMBLY
75   void BeginJSToWasmBuiltinContinuationFrame(
76       BytecodeOffset bailout_id, int literal_id, unsigned height,
77       base::Optional<wasm::ValueKind> return_kind);
78 #endif  // V8_ENABLE_WEBASSEMBLY
79   void BeginJavaScriptBuiltinContinuationFrame(BytecodeOffset bailout_id,
80                                                int literal_id, unsigned height);
81   void BeginJavaScriptBuiltinContinuationWithCatchFrame(
82       BytecodeOffset bailout_id, int literal_id, unsigned height);
83   void ArgumentsElements(CreateArgumentsType type);
84   void ArgumentsLength();
85   void BeginCapturedObject(int length);
86   void AddUpdateFeedback(int vector_literal, int slot);
87   void DuplicateObject(int object_index);
88   void StoreRegister(Register reg);
89   void StoreInt32Register(Register reg);
90   void StoreInt64Register(Register reg);
91   void StoreUint32Register(Register reg);
92   void StoreBoolRegister(Register reg);
93   void StoreFloatRegister(FloatRegister reg);
94   void StoreDoubleRegister(DoubleRegister reg);
95   void StoreStackSlot(int index);
96   void StoreInt32StackSlot(int index);
97   void StoreInt64StackSlot(int index);
98   void StoreUint32StackSlot(int index);
99   void StoreBoolStackSlot(int index);
100   void StoreFloatStackSlot(int index);
101   void StoreDoubleStackSlot(int index);
102   void StoreLiteral(int literal_id);
103   void StoreJSFrameFunction();
104 
105  private:
106   void Add(int32_t value);
Add(TranslationOpcode opcode)107   void Add(TranslationOpcode opcode) { Add(static_cast<int32_t>(opcode)); }
108 
Size()109   int Size() const {
110     return V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)
111                ? static_cast<int>(contents_for_compression_.size())
112                : static_cast<int>(contents_.size());
113   }
SizeInBytes()114   int SizeInBytes() const {
115     return V8_UNLIKELY(FLAG_turbo_compress_translation_arrays)
116                ? Size() * kInt32Size
117                : Size();
118   }
119 
zone()120   Zone* zone() const { return zone_; }
121 
122   ZoneVector<uint8_t> contents_;
123   ZoneVector<int32_t> contents_for_compression_;
124   Zone* const zone_;
125 };
126 
127 }  // namespace internal
128 }  // namespace v8
129 
130 #endif  // V8_DEOPTIMIZER_TRANSLATION_ARRAY_H_
131