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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/field-index.h" | 9 #include "src/field-index.h" |
10 #include "src/hydrogen.h" | 10 #include "src/hydrogen.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 LChunk* chunk = LChunk::NewChunk(graph); | 27 LChunk* chunk = LChunk::NewChunk(graph); |
28 if (chunk == NULL) { | 28 if (chunk == NULL) { |
29 FATAL(GetBailoutReason(graph->info()->bailout_reason())); | 29 FATAL(GetBailoutReason(graph->info()->bailout_reason())); |
30 } | 30 } |
31 return chunk; | 31 return chunk; |
32 } | 32 } |
33 | 33 |
34 | 34 |
35 class CodeStubGraphBuilderBase : public HGraphBuilder { | 35 class CodeStubGraphBuilderBase : public HGraphBuilder { |
36 public: | 36 public: |
37 CodeStubGraphBuilderBase(Isolate* isolate, HydrogenCodeStub* stub) | 37 explicit CodeStubGraphBuilderBase(CompilationInfoWithZone* info) |
38 : HGraphBuilder(&info_), | 38 : HGraphBuilder(info), |
39 arguments_length_(NULL), | 39 arguments_length_(NULL), |
40 info_(stub, isolate), | 40 info_(info), |
41 descriptor_(stub), | 41 descriptor_(info->code_stub()), |
42 context_(NULL) { | 42 context_(NULL) { |
43 int parameter_count = descriptor_.GetEnvironmentParameterCount(); | 43 int parameter_count = descriptor_.GetEnvironmentParameterCount(); |
44 parameters_.Reset(new HParameter*[parameter_count]); | 44 parameters_.Reset(new HParameter*[parameter_count]); |
45 } | 45 } |
46 virtual bool BuildGraph(); | 46 virtual bool BuildGraph(); |
47 | 47 |
48 protected: | 48 protected: |
49 virtual HValue* BuildCodeStub() = 0; | 49 virtual HValue* BuildCodeStub() = 0; |
50 HParameter* GetParameter(int parameter) { | 50 HParameter* GetParameter(int parameter) { |
51 DCHECK(parameter < descriptor_.GetEnvironmentParameterCount()); | 51 DCHECK(parameter < descriptor_.GetEnvironmentParameterCount()); |
52 return parameters_[parameter]; | 52 return parameters_[parameter]; |
53 } | 53 } |
54 HValue* GetArgumentsLength() { | 54 HValue* GetArgumentsLength() { |
55 // This is initialized in BuildGraph() | 55 // This is initialized in BuildGraph() |
56 DCHECK(arguments_length_ != NULL); | 56 DCHECK(arguments_length_ != NULL); |
57 return arguments_length_; | 57 return arguments_length_; |
58 } | 58 } |
59 CompilationInfo* info() { return &info_; } | 59 CompilationInfo* info() { return info_; } |
60 HydrogenCodeStub* stub() { return info_.code_stub(); } | 60 HydrogenCodeStub* stub() { return info_->code_stub(); } |
61 HContext* context() { return context_; } | 61 HContext* context() { return context_; } |
62 Isolate* isolate() { return info_.isolate(); } | 62 Isolate* isolate() { return info_->isolate(); } |
63 | 63 |
64 HLoadNamedField* BuildLoadNamedField(HValue* object, | 64 HLoadNamedField* BuildLoadNamedField(HValue* object, |
65 FieldIndex index); | 65 FieldIndex index); |
66 void BuildStoreNamedField(HValue* object, HValue* value, FieldIndex index, | 66 void BuildStoreNamedField(HValue* object, HValue* value, FieldIndex index, |
67 Representation representation, | 67 Representation representation, |
68 bool transition_to_field); | 68 bool transition_to_field); |
69 | 69 |
70 enum ArgumentClass { | 70 enum ArgumentClass { |
71 NONE, | 71 NONE, |
72 SINGLE, | 72 SINGLE, |
(...skipping 26 matching lines...) Expand all Loading... |
99 HValue* shared_info, | 99 HValue* shared_info, |
100 HValue* native_context); | 100 HValue* native_context); |
101 | 101 |
102 private: | 102 private: |
103 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); | 103 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); |
104 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, | 104 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, |
105 ElementsKind kind); | 105 ElementsKind kind); |
106 | 106 |
107 SmartArrayPointer<HParameter*> parameters_; | 107 SmartArrayPointer<HParameter*> parameters_; |
108 HValue* arguments_length_; | 108 HValue* arguments_length_; |
109 CompilationInfoWithZone info_; | 109 CompilationInfoWithZone* info_; |
110 CodeStubDescriptor descriptor_; | 110 CodeStubDescriptor descriptor_; |
111 HContext* context_; | 111 HContext* context_; |
112 }; | 112 }; |
113 | 113 |
114 | 114 |
115 bool CodeStubGraphBuilderBase::BuildGraph() { | 115 bool CodeStubGraphBuilderBase::BuildGraph() { |
116 // Update the static counter each time a new code stub is generated. | 116 // Update the static counter each time a new code stub is generated. |
117 isolate()->counters()->code_stubs()->Increment(); | 117 isolate()->counters()->code_stubs()->Increment(); |
118 | 118 |
119 if (FLAG_trace_hydrogen_stubs) { | 119 if (FLAG_trace_hydrogen_stubs) { |
120 const char* name = CodeStub::MajorName(stub()->MajorKey(), false); | 120 const char* name = CodeStub::MajorName(stub()->MajorKey(), false); |
121 PrintF("-----------------------------------------------------------\n"); | 121 PrintF("-----------------------------------------------------------\n"); |
122 PrintF("Compiling stub %s using hydrogen\n", name); | 122 PrintF("Compiling stub %s using hydrogen\n", name); |
123 isolate()->GetHTracer()->TraceCompilation(&info_); | 123 isolate()->GetHTracer()->TraceCompilation(info()); |
124 } | 124 } |
125 | 125 |
126 int param_count = descriptor_.GetEnvironmentParameterCount(); | 126 int param_count = descriptor_.GetEnvironmentParameterCount(); |
127 HEnvironment* start_environment = graph()->start_environment(); | 127 HEnvironment* start_environment = graph()->start_environment(); |
128 HBasicBlock* next_block = CreateBasicBlock(start_environment); | 128 HBasicBlock* next_block = CreateBasicBlock(start_environment); |
129 Goto(next_block); | 129 Goto(next_block); |
130 next_block->SetJoinId(BailoutId::StubEntry()); | 130 next_block->SetJoinId(BailoutId::StubEntry()); |
131 set_current_block(next_block); | 131 set_current_block(next_block); |
132 | 132 |
133 bool runtime_stack_params = descriptor_.stack_parameter_count().is_valid(); | 133 bool runtime_stack_params = descriptor_.stack_parameter_count().is_valid(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 stack_pop_count); | 182 stack_pop_count); |
183 FinishCurrentBlock(hreturn_instruction); | 183 FinishCurrentBlock(hreturn_instruction); |
184 } | 184 } |
185 return true; | 185 return true; |
186 } | 186 } |
187 | 187 |
188 | 188 |
189 template <class Stub> | 189 template <class Stub> |
190 class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { | 190 class CodeStubGraphBuilder: public CodeStubGraphBuilderBase { |
191 public: | 191 public: |
192 CodeStubGraphBuilder(Isolate* isolate, Stub* stub) | 192 explicit CodeStubGraphBuilder(CompilationInfoWithZone* info) |
193 : CodeStubGraphBuilderBase(isolate, stub) {} | 193 : CodeStubGraphBuilderBase(info) {} |
194 | 194 |
195 protected: | 195 protected: |
196 virtual HValue* BuildCodeStub() { | 196 virtual HValue* BuildCodeStub() { |
197 if (casted_stub()->IsUninitialized()) { | 197 if (casted_stub()->IsUninitialized()) { |
198 return BuildCodeUninitializedStub(); | 198 return BuildCodeUninitializedStub(); |
199 } else { | 199 } else { |
200 return BuildCodeInitializedStub(); | 200 return BuildCodeInitializedStub(); |
201 } | 201 } |
202 } | 202 } |
203 | 203 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 // the runtime that is significantly faster than using the standard | 264 // the runtime that is significantly faster than using the standard |
265 // stub-failure deopt mechanism. | 265 // stub-failure deopt mechanism. |
266 if (stub->IsUninitialized() && descriptor.has_miss_handler()) { | 266 if (stub->IsUninitialized() && descriptor.has_miss_handler()) { |
267 DCHECK(!descriptor.stack_parameter_count().is_valid()); | 267 DCHECK(!descriptor.stack_parameter_count().is_valid()); |
268 return stub->GenerateLightweightMissCode(descriptor.miss_handler()); | 268 return stub->GenerateLightweightMissCode(descriptor.miss_handler()); |
269 } | 269 } |
270 base::ElapsedTimer timer; | 270 base::ElapsedTimer timer; |
271 if (FLAG_profile_hydrogen_code_stub_compilation) { | 271 if (FLAG_profile_hydrogen_code_stub_compilation) { |
272 timer.Start(); | 272 timer.Start(); |
273 } | 273 } |
274 CodeStubGraphBuilder<Stub> builder(isolate, stub); | 274 CompilationInfoWithZone info(stub, isolate); |
| 275 CodeStubGraphBuilder<Stub> builder(&info); |
275 LChunk* chunk = OptimizeGraph(builder.CreateGraph()); | 276 LChunk* chunk = OptimizeGraph(builder.CreateGraph()); |
276 Handle<Code> code = chunk->Codegen(); | 277 Handle<Code> code = chunk->Codegen(); |
277 if (FLAG_profile_hydrogen_code_stub_compilation) { | 278 if (FLAG_profile_hydrogen_code_stub_compilation) { |
278 OFStream os(stdout); | 279 OFStream os(stdout); |
279 os << "[Lazy compilation of " << stub << " took " | 280 os << "[Lazy compilation of " << stub << " took " |
280 << timer.Elapsed().InMillisecondsF() << " ms]" << std::endl; | 281 << timer.Elapsed().InMillisecondsF() << " ms]" << std::endl; |
281 } | 282 } |
282 return code; | 283 return code; |
283 } | 284 } |
284 | 285 |
(...skipping 1408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 | 1694 |
1694 Handle<Code> RegExpConstructResultStub::GenerateCode() { | 1695 Handle<Code> RegExpConstructResultStub::GenerateCode() { |
1695 return DoGenerateCode(this); | 1696 return DoGenerateCode(this); |
1696 } | 1697 } |
1697 | 1698 |
1698 | 1699 |
1699 template <> | 1700 template <> |
1700 class CodeStubGraphBuilder<KeyedLoadGenericStub> | 1701 class CodeStubGraphBuilder<KeyedLoadGenericStub> |
1701 : public CodeStubGraphBuilderBase { | 1702 : public CodeStubGraphBuilderBase { |
1702 public: | 1703 public: |
1703 CodeStubGraphBuilder(Isolate* isolate, KeyedLoadGenericStub* stub) | 1704 explicit CodeStubGraphBuilder(CompilationInfoWithZone* info) |
1704 : CodeStubGraphBuilderBase(isolate, stub) {} | 1705 : CodeStubGraphBuilderBase(info) {} |
1705 | 1706 |
1706 protected: | 1707 protected: |
1707 virtual HValue* BuildCodeStub(); | 1708 virtual HValue* BuildCodeStub(); |
1708 | 1709 |
1709 void BuildElementsKindLimitCheck(HGraphBuilder::IfBuilder* if_builder, | 1710 void BuildElementsKindLimitCheck(HGraphBuilder::IfBuilder* if_builder, |
1710 HValue* bit_field2, | 1711 HValue* bit_field2, |
1711 ElementsKind kind); | 1712 ElementsKind kind); |
1712 | 1713 |
1713 void BuildFastElementLoad(HGraphBuilder::IfBuilder* if_builder, | 1714 void BuildFastElementLoad(HGraphBuilder::IfBuilder* if_builder, |
1714 HValue* receiver, | 1715 HValue* receiver, |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2040 | 2041 |
2041 // Probe the stub cache. | 2042 // Probe the stub cache. |
2042 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 2043 Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( |
2043 Code::ComputeHandlerFlags(Code::LOAD_IC)); | 2044 Code::ComputeHandlerFlags(Code::LOAD_IC)); |
2044 Add<HTailCallThroughMegamorphicCache>(receiver, name, flags); | 2045 Add<HTailCallThroughMegamorphicCache>(receiver, name, flags); |
2045 | 2046 |
2046 // We never continue. | 2047 // We never continue. |
2047 return graph()->GetConstant0(); | 2048 return graph()->GetConstant0(); |
2048 } | 2049 } |
2049 } } // namespace v8::internal | 2050 } } // namespace v8::internal |
OLD | NEW |