Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Side by Side Diff: src/compiler/bytecode-graph-builder.cc

Issue 1441643002: [Interpreter] Add support for global loads / stores / calls to BytecodeGraphBuilder. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_tf_call
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/compiler/bytecode-graph-builder.h" 5 #include "src/compiler/bytecode-graph-builder.h"
6 6
7 #include "src/compiler/linkage.h" 7 #include "src/compiler/linkage.h"
8 #include "src/compiler/operator-properties.h" 8 #include "src/compiler/operator-properties.h"
9 #include "src/interpreter/bytecode-array-iterator.h" 9 #include "src/interpreter/bytecode-array-iterator.h"
10 10
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 input_buffer_size_(0), 107 input_buffer_size_(0),
108 input_buffer_(nullptr), 108 input_buffer_(nullptr),
109 exit_controls_(local_zone) { 109 exit_controls_(local_zone) {
110 bytecode_array_ = handle(info()->shared_info()->bytecode_array()); 110 bytecode_array_ = handle(info()->shared_info()->bytecode_array());
111 } 111 }
112 112
113 113
114 Node* BytecodeGraphBuilder::GetFunctionContext() { 114 Node* BytecodeGraphBuilder::GetFunctionContext() {
115 if (!function_context_.is_set()) { 115 if (!function_context_.is_set()) {
116 // Parameter (arity + 1) is special for the outer context of the function 116 // Parameter (arity + 1) is special for the outer context of the function
117 const Operator* op = 117 const Operator* op = common()->Parameter(
118 common()->Parameter(bytecode_array()->parameter_count(), "%context"); 118 bytecode_array()->parameter_count() + 1, "%context");
119 Node* node = NewNode(op, graph()->start()); 119 Node* node = NewNode(op, graph()->start());
120 function_context_.set(node); 120 function_context_.set(node);
121 } 121 }
122 return function_context_.get(); 122 return function_context_.get();
123 } 123 }
124 124
125 125
126 Node* BytecodeGraphBuilder::GetFunctionClosure() { 126 Node* BytecodeGraphBuilder::GetFunctionClosure() {
127 if (!function_closure_.is_set()) { 127 if (!function_closure_.is_set()) {
128 const Operator* op = common()->Parameter( 128 const Operator* op = common()->Parameter(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 jsgraph()->EmptyFrameState()); 170 jsgraph()->EmptyFrameState());
171 } 171 }
172 } 172 }
173 173
174 174
175 bool BytecodeGraphBuilder::CreateGraph(bool stack_check) { 175 bool BytecodeGraphBuilder::CreateGraph(bool stack_check) {
176 // Set up the basic structure of the graph. Outputs for {Start} are 176 // Set up the basic structure of the graph. Outputs for {Start} are
177 // the formal parameters (including the receiver) plus context and 177 // the formal parameters (including the receiver) plus context and
178 // closure. 178 // closure.
179 179
180 // The additional count items are for the context and closure. 180 // Set up the basic structure of the graph. Outputs for {Start} are the formal
181 int actual_parameter_count = bytecode_array()->parameter_count() + 2; 181 // parameters (including the receiver) plus number of arguments, context and
182 // closure.
183 int actual_parameter_count = bytecode_array()->parameter_count() + 3;
182 graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count))); 184 graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count)));
183 185
184 Environment env(this, bytecode_array()->register_count(), 186 Environment env(this, bytecode_array()->register_count(),
185 bytecode_array()->parameter_count(), graph()->start(), 187 bytecode_array()->parameter_count(), graph()->start(),
186 GetFunctionContext()); 188 GetFunctionContext());
187 set_environment(&env); 189 set_environment(&env);
188 190
189 // Build function context only if there are context allocated variables. 191 // Build function context only if there are context allocated variables.
190 if (info()->num_heap_slots() > 0) { 192 if (info()->num_heap_slots() > 0) {
191 UNIMPLEMENTED(); // TODO(oth): Write ast-graph-builder equivalent. 193 UNIMPLEMENTED(); // TODO(oth): Write ast-graph-builder equivalent.
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 } 300 }
299 301
300 302
301 void BytecodeGraphBuilder::VisitStar( 303 void BytecodeGraphBuilder::VisitStar(
302 const interpreter::BytecodeArrayIterator& iterator) { 304 const interpreter::BytecodeArrayIterator& iterator) {
303 Node* value = environment()->LookupAccumulator(); 305 Node* value = environment()->LookupAccumulator();
304 environment()->BindRegister(iterator.GetRegisterOperand(0), value); 306 environment()->BindRegister(iterator.GetRegisterOperand(0), value);
305 } 307 }
306 308
307 309
310 void BytecodeGraphBuilder::BuildLoadGlobal(
311 const interpreter::BytecodeArrayIterator& iterator,
312 TypeofMode typeof_mode) {
313 Handle<Name> name =
314 Handle<Name>::cast(iterator.GetConstantForIndexOperand(0));
315 VectorSlotPair feedback = CreateVectorSlotPair(iterator.GetIndexOperand(1));
316
317 const Operator* op = javascript()->LoadGlobal(name, feedback, typeof_mode);
318 Node* node = NewNode(op, BuildLoadFeedbackVector());
319 AddEmptyFrameStateInputs(node);
320 environment()->BindAccumulator(node);
321 }
322
323
308 void BytecodeGraphBuilder::VisitLdaGlobalSloppy( 324 void BytecodeGraphBuilder::VisitLdaGlobalSloppy(
309 const interpreter::BytecodeArrayIterator& iterator) { 325 const interpreter::BytecodeArrayIterator& iterator) {
310 UNIMPLEMENTED(); 326 DCHECK(is_sloppy(language_mode()));
327 BuildLoadGlobal(iterator, TypeofMode::NOT_INSIDE_TYPEOF);
311 } 328 }
312 329
313 330
314 void BytecodeGraphBuilder::VisitLdaGlobalStrict( 331 void BytecodeGraphBuilder::VisitLdaGlobalStrict(
315 const interpreter::BytecodeArrayIterator& iterator) { 332 const interpreter::BytecodeArrayIterator& iterator) {
316 UNIMPLEMENTED(); 333 DCHECK(is_strict(language_mode()));
334 BuildLoadGlobal(iterator, TypeofMode::NOT_INSIDE_TYPEOF);
317 } 335 }
318 336
319 337
320 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppy( 338 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppy(
321 const interpreter::BytecodeArrayIterator& iterator) { 339 const interpreter::BytecodeArrayIterator& iterator) {
322 UNIMPLEMENTED(); 340 DCHECK(is_sloppy(language_mode()));
341 BuildLoadGlobal(iterator, TypeofMode::INSIDE_TYPEOF);
323 } 342 }
324 343
325 344
326 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrict( 345 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrict(
327 const interpreter::BytecodeArrayIterator& iterator) { 346 const interpreter::BytecodeArrayIterator& iterator) {
328 UNIMPLEMENTED(); 347 DCHECK(is_strict(language_mode()));
348 BuildLoadGlobal(iterator, TypeofMode::INSIDE_TYPEOF);
329 } 349 }
330 350
331 351
332 void BytecodeGraphBuilder::VisitLdaGlobalSloppyWide( 352 void BytecodeGraphBuilder::VisitLdaGlobalSloppyWide(
333 const interpreter::BytecodeArrayIterator& iterator) { 353 const interpreter::BytecodeArrayIterator& iterator) {
334 UNIMPLEMENTED(); 354 DCHECK(is_sloppy(language_mode()));
355 BuildLoadGlobal(iterator, TypeofMode::NOT_INSIDE_TYPEOF);
335 } 356 }
336 357
337 358
338 void BytecodeGraphBuilder::VisitLdaGlobalStrictWide( 359 void BytecodeGraphBuilder::VisitLdaGlobalStrictWide(
339 const interpreter::BytecodeArrayIterator& iterator) { 360 const interpreter::BytecodeArrayIterator& iterator) {
340 UNIMPLEMENTED(); 361 DCHECK(is_strict(language_mode()));
362 BuildLoadGlobal(iterator, TypeofMode::NOT_INSIDE_TYPEOF);
341 } 363 }
342 364
343 365
344 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppyWide( 366 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofSloppyWide(
345 const interpreter::BytecodeArrayIterator& iterator) { 367 const interpreter::BytecodeArrayIterator& iterator) {
346 UNIMPLEMENTED(); 368 DCHECK(is_sloppy(language_mode()));
369 BuildLoadGlobal(iterator, TypeofMode::INSIDE_TYPEOF);
347 } 370 }
348 371
349 372
350 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrictWide( 373 void BytecodeGraphBuilder::VisitLdaGlobalInsideTypeofStrictWide(
351 const interpreter::BytecodeArrayIterator& iterator) { 374 const interpreter::BytecodeArrayIterator& iterator) {
352 UNIMPLEMENTED(); 375 DCHECK(is_strict(language_mode()));
376 BuildLoadGlobal(iterator, TypeofMode::INSIDE_TYPEOF);
377 }
378
379
380 void BytecodeGraphBuilder::BuildStoreGlobal(
381 const interpreter::BytecodeArrayIterator& iterator) {
382 Handle<Name> name =
383 Handle<Name>::cast(iterator.GetConstantForIndexOperand(0));
384 VectorSlotPair feedback = CreateVectorSlotPair(iterator.GetIndexOperand(1));
385 Node* value = environment()->LookupAccumulator();
386
387 const Operator* op =
388 javascript()->StoreGlobal(language_mode(), name, feedback);
389 Node* node = NewNode(op, value, BuildLoadFeedbackVector());
390 AddEmptyFrameStateInputs(node);
353 } 391 }
354 392
355 393
356 void BytecodeGraphBuilder::VisitStaGlobalSloppy( 394 void BytecodeGraphBuilder::VisitStaGlobalSloppy(
357 const interpreter::BytecodeArrayIterator& iterator) { 395 const interpreter::BytecodeArrayIterator& iterator) {
358 UNIMPLEMENTED(); 396 DCHECK(is_sloppy(language_mode()));
397 BuildStoreGlobal(iterator);
359 } 398 }
360 399
361 400
362 void BytecodeGraphBuilder::VisitStaGlobalStrict( 401 void BytecodeGraphBuilder::VisitStaGlobalStrict(
363 const interpreter::BytecodeArrayIterator& iterator) { 402 const interpreter::BytecodeArrayIterator& iterator) {
364 UNIMPLEMENTED(); 403 DCHECK(is_strict(language_mode()));
404 BuildStoreGlobal(iterator);
365 } 405 }
366 406
367 void BytecodeGraphBuilder::VisitStaGlobalSloppyWide( 407 void BytecodeGraphBuilder::VisitStaGlobalSloppyWide(
368 const interpreter::BytecodeArrayIterator& iterator) { 408 const interpreter::BytecodeArrayIterator& iterator) {
369 UNIMPLEMENTED(); 409 DCHECK(is_sloppy(language_mode()));
410 BuildStoreGlobal(iterator);
370 } 411 }
371 412
372 413
373 void BytecodeGraphBuilder::VisitStaGlobalStrictWide( 414 void BytecodeGraphBuilder::VisitStaGlobalStrictWide(
374 const interpreter::BytecodeArrayIterator& iterator) { 415 const interpreter::BytecodeArrayIterator& iterator) {
375 UNIMPLEMENTED(); 416 DCHECK(is_strict(language_mode()));
417 BuildStoreGlobal(iterator);
376 } 418 }
377 419
378 420
379 void BytecodeGraphBuilder::VisitLdaContextSlot( 421 void BytecodeGraphBuilder::VisitLdaContextSlot(
380 const interpreter::BytecodeArrayIterator& iterator) { 422 const interpreter::BytecodeArrayIterator& iterator) {
381 UNIMPLEMENTED(); 423 UNIMPLEMENTED();
382 } 424 }
383 425
384 426
385 void BytecodeGraphBuilder::VisitStaContextSlot( 427 void BytecodeGraphBuilder::VisitStaContextSlot(
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 1070
1029 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) { 1071 void BytecodeGraphBuilder::UpdateControlDependencyToLeaveFunction(Node* exit) {
1030 if (environment()->IsMarkedAsUnreachable()) return; 1072 if (environment()->IsMarkedAsUnreachable()) return;
1031 environment()->MarkAsUnreachable(); 1073 environment()->MarkAsUnreachable();
1032 exit_controls_.push_back(exit); 1074 exit_controls_.push_back(exit);
1033 } 1075 }
1034 1076
1035 } // namespace compiler 1077 } // namespace compiler
1036 } // namespace internal 1078 } // namespace internal
1037 } // namespace v8 1079 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698