OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_OBJECTS_H_ | 5 #ifndef V8_OBJECTS_H_ |
6 #define V8_OBJECTS_H_ | 6 #define V8_OBJECTS_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/assert-scope.h" | 9 #include "src/assert-scope.h" |
10 #include "src/builtins.h" | 10 #include "src/builtins.h" |
(...skipping 5133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5144 // DeoptimizationInputData is a fixed array used to hold the deoptimization | 5144 // DeoptimizationInputData is a fixed array used to hold the deoptimization |
5145 // data for code generated by the Hydrogen/Lithium compiler. It also | 5145 // data for code generated by the Hydrogen/Lithium compiler. It also |
5146 // contains information about functions that were inlined. If N different | 5146 // contains information about functions that were inlined. If N different |
5147 // functions were inlined then first N elements of the literal array will | 5147 // functions were inlined then first N elements of the literal array will |
5148 // contain these functions. | 5148 // contain these functions. |
5149 // | 5149 // |
5150 // It can be empty. | 5150 // It can be empty. |
5151 class DeoptimizationInputData: public FixedArray { | 5151 class DeoptimizationInputData: public FixedArray { |
5152 public: | 5152 public: |
5153 // Layout description. Indices in the array. | 5153 // Layout description. Indices in the array. |
5154 static const int kDeoptEntryCountIndex = 0; | 5154 static const int kTranslationByteArrayIndex = 0; |
5155 static const int kReturnAddressPatchEntryCountIndex = 1; | 5155 static const int kInlinedFunctionCountIndex = 1; |
5156 static const int kTranslationByteArrayIndex = 2; | 5156 static const int kLiteralArrayIndex = 2; |
5157 static const int kInlinedFunctionCountIndex = 3; | 5157 static const int kOsrAstIdIndex = 3; |
5158 static const int kLiteralArrayIndex = 4; | 5158 static const int kOsrPcOffsetIndex = 4; |
5159 static const int kOsrAstIdIndex = 5; | 5159 static const int kOptimizationIdIndex = 5; |
5160 static const int kOsrPcOffsetIndex = 6; | 5160 static const int kSharedFunctionInfoIndex = 6; |
5161 static const int kOptimizationIdIndex = 7; | 5161 static const int kFirstDeoptEntryIndex = 7; |
5162 static const int kSharedFunctionInfoIndex = 8; | |
5163 static const int kFirstDeoptEntryIndex = 9; | |
5164 | 5162 |
5165 // Offsets of deopt entry elements relative to the start of the entry. | 5163 // Offsets of deopt entry elements relative to the start of the entry. |
5166 static const int kAstIdRawOffset = 0; | 5164 static const int kAstIdRawOffset = 0; |
5167 static const int kTranslationIndexOffset = 1; | 5165 static const int kTranslationIndexOffset = 1; |
5168 static const int kArgumentsStackHeightOffset = 2; | 5166 static const int kArgumentsStackHeightOffset = 2; |
5169 static const int kPcOffset = 3; | 5167 static const int kPcOffset = 3; |
5170 static const int kDeoptEntrySize = 4; | 5168 static const int kDeoptEntrySize = 4; |
5171 | 5169 |
5172 // Offsets of return address patch entry elements relative to the start of the | |
5173 // entry | |
5174 static const int kReturnAddressPcOffset = 0; | |
5175 static const int kPatchedAddressPcOffset = 1; | |
5176 static const int kReturnAddressPatchEntrySize = 2; | |
5177 | |
5178 // Simple element accessors. | 5170 // Simple element accessors. |
5179 #define DEFINE_ELEMENT_ACCESSORS(name, type) \ | 5171 #define DEFINE_ELEMENT_ACCESSORS(name, type) \ |
5180 type* name() { \ | 5172 type* name() { \ |
5181 return type::cast(get(k##name##Index)); \ | 5173 return type::cast(get(k##name##Index)); \ |
5182 } \ | 5174 } \ |
5183 void Set##name(type* value) { \ | 5175 void Set##name(type* value) { \ |
5184 set(k##name##Index, value); \ | 5176 set(k##name##Index, value); \ |
5185 } | 5177 } |
5186 | 5178 |
5187 DEFINE_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray) | 5179 DEFINE_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray) |
5188 DEFINE_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi) | 5180 DEFINE_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi) |
5189 DEFINE_ELEMENT_ACCESSORS(LiteralArray, FixedArray) | 5181 DEFINE_ELEMENT_ACCESSORS(LiteralArray, FixedArray) |
5190 DEFINE_ELEMENT_ACCESSORS(OsrAstId, Smi) | 5182 DEFINE_ELEMENT_ACCESSORS(OsrAstId, Smi) |
5191 DEFINE_ELEMENT_ACCESSORS(OsrPcOffset, Smi) | 5183 DEFINE_ELEMENT_ACCESSORS(OsrPcOffset, Smi) |
5192 DEFINE_ELEMENT_ACCESSORS(OptimizationId, Smi) | 5184 DEFINE_ELEMENT_ACCESSORS(OptimizationId, Smi) |
5193 DEFINE_ELEMENT_ACCESSORS(SharedFunctionInfo, Object) | 5185 DEFINE_ELEMENT_ACCESSORS(SharedFunctionInfo, Object) |
5194 | 5186 |
5195 #undef DEFINE_ELEMENT_ACCESSORS | 5187 #undef DEFINE_ELEMENT_ACCESSORS |
5196 | 5188 |
5197 // Accessors for elements of the ith deoptimization entry. | 5189 // Accessors for elements of the ith deoptimization entry. |
5198 #define DEFINE_DEOPT_ENTRY_ACCESSORS(name, type) \ | 5190 #define DEFINE_ENTRY_ACCESSORS(name, type) \ |
5199 type* name(int i) { \ | 5191 type* name(int i) { \ |
5200 return type::cast(get(IndexForEntry(i) + k##name##Offset)); \ | 5192 return type::cast(get(IndexForEntry(i) + k##name##Offset)); \ |
5201 } \ | 5193 } \ |
5202 void Set##name(int i, type* value) { \ | 5194 void Set##name(int i, type* value) { \ |
5203 set(IndexForEntry(i) + k##name##Offset, value); \ | 5195 set(IndexForEntry(i) + k##name##Offset, value); \ |
5204 } | 5196 } |
5205 | 5197 |
5206 DEFINE_DEOPT_ENTRY_ACCESSORS(AstIdRaw, Smi) | 5198 DEFINE_ENTRY_ACCESSORS(AstIdRaw, Smi) |
5207 DEFINE_DEOPT_ENTRY_ACCESSORS(TranslationIndex, Smi) | 5199 DEFINE_ENTRY_ACCESSORS(TranslationIndex, Smi) |
5208 DEFINE_DEOPT_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi) | 5200 DEFINE_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi) |
5209 DEFINE_DEOPT_ENTRY_ACCESSORS(Pc, Smi) | 5201 DEFINE_ENTRY_ACCESSORS(Pc, Smi) |
5210 | 5202 |
5211 #undef DEFINE_DEOPT_ENTRY_ACCESSORS | 5203 #undef DEFINE_DEOPT_ENTRY_ACCESSORS |
5212 | 5204 |
5213 // Accessors for elements of the ith deoptimization entry. | |
5214 #define DEFINE_PATCH_ENTRY_ACCESSORS(name, type) \ | |
5215 type* name(int i) { \ | |
5216 return type::cast( \ | |
5217 get(IndexForReturnAddressPatchEntry(i) + k##name##Offset)); \ | |
5218 } \ | |
5219 void Set##name(int i, type* value) { \ | |
5220 set(IndexForReturnAddressPatchEntry(i) + k##name##Offset, value); \ | |
5221 } | |
5222 | |
5223 DEFINE_PATCH_ENTRY_ACCESSORS(ReturnAddressPc, Smi) | |
5224 DEFINE_PATCH_ENTRY_ACCESSORS(PatchedAddressPc, Smi) | |
5225 | |
5226 #undef DEFINE_PATCH_ENTRY_ACCESSORS | |
5227 | |
5228 BailoutId AstId(int i) { | 5205 BailoutId AstId(int i) { |
5229 return BailoutId(AstIdRaw(i)->value()); | 5206 return BailoutId(AstIdRaw(i)->value()); |
5230 } | 5207 } |
5231 | 5208 |
5232 void SetAstId(int i, BailoutId value) { | 5209 void SetAstId(int i, BailoutId value) { |
5233 SetAstIdRaw(i, Smi::FromInt(value.ToInt())); | 5210 SetAstIdRaw(i, Smi::FromInt(value.ToInt())); |
5234 } | 5211 } |
5235 | 5212 |
5236 int DeoptCount() { | 5213 int DeoptCount() { |
5237 return length() == 0 ? 0 : Smi::cast(get(kDeoptEntryCountIndex))->value(); | 5214 return (length() - kFirstDeoptEntryIndex) / kDeoptEntrySize; |
5238 } | |
5239 | |
5240 int ReturnAddressPatchCount() { | |
5241 return length() == 0 | |
5242 ? 0 | |
5243 : Smi::cast(get(kReturnAddressPatchEntryCountIndex))->value(); | |
5244 } | 5215 } |
5245 | 5216 |
5246 // Allocates a DeoptimizationInputData. | 5217 // Allocates a DeoptimizationInputData. |
5247 static Handle<DeoptimizationInputData> New(Isolate* isolate, | 5218 static Handle<DeoptimizationInputData> New(Isolate* isolate, |
5248 int deopt_entry_count, | 5219 int deopt_entry_count, |
5249 int return_address_patch_count, | |
5250 PretenureFlag pretenure); | 5220 PretenureFlag pretenure); |
5251 | 5221 |
5252 DECLARE_CAST(DeoptimizationInputData) | 5222 DECLARE_CAST(DeoptimizationInputData) |
5253 | 5223 |
5254 #ifdef ENABLE_DISASSEMBLER | 5224 #ifdef ENABLE_DISASSEMBLER |
5255 void DeoptimizationInputDataPrint(OStream& os); // NOLINT | 5225 void DeoptimizationInputDataPrint(OStream& os); // NOLINT |
5256 #endif | 5226 #endif |
5257 | 5227 |
5258 private: | 5228 private: |
5259 friend class Object; // For accessing LengthFor. | |
5260 | |
5261 static int IndexForEntry(int i) { | 5229 static int IndexForEntry(int i) { |
5262 return kFirstDeoptEntryIndex + (i * kDeoptEntrySize); | 5230 return kFirstDeoptEntryIndex + (i * kDeoptEntrySize); |
5263 } | 5231 } |
5264 | 5232 |
5265 int IndexForReturnAddressPatchEntry(int i) { | |
5266 return kFirstDeoptEntryIndex + (DeoptCount() * kDeoptEntrySize) + | |
5267 (i * kReturnAddressPatchEntrySize); | |
5268 } | |
5269 | 5233 |
5270 static int LengthFor(int deopt_count, int return_address_patch_count) { | 5234 static int LengthFor(int entry_count) { return IndexForEntry(entry_count); } |
5271 return kFirstDeoptEntryIndex + (deopt_count * kDeoptEntrySize) + | |
5272 (return_address_patch_count * kReturnAddressPatchEntrySize); | |
5273 } | |
5274 }; | 5235 }; |
5275 | 5236 |
5276 | 5237 |
5277 // DeoptimizationOutputData is a fixed array used to hold the deoptimization | 5238 // DeoptimizationOutputData is a fixed array used to hold the deoptimization |
5278 // data for code generated by the full compiler. | 5239 // data for code generated by the full compiler. |
5279 // The format of the these objects is | 5240 // The format of the these objects is |
5280 // [i * 2]: Ast ID for ith deoptimization. | 5241 // [i * 2]: Ast ID for ith deoptimization. |
5281 // [i * 2 + 1]: PC and state of ith deoptimization | 5242 // [i * 2 + 1]: PC and state of ith deoptimization |
5282 class DeoptimizationOutputData: public FixedArray { | 5243 class DeoptimizationOutputData: public FixedArray { |
5283 public: | 5244 public: |
(...skipping 5906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11190 } else { | 11151 } else { |
11191 value &= ~(1 << bit_position); | 11152 value &= ~(1 << bit_position); |
11192 } | 11153 } |
11193 return value; | 11154 return value; |
11194 } | 11155 } |
11195 }; | 11156 }; |
11196 | 11157 |
11197 } } // namespace v8::internal | 11158 } } // namespace v8::internal |
11198 | 11159 |
11199 #endif // V8_OBJECTS_H_ | 11160 #endif // V8_OBJECTS_H_ |
OLD | NEW |