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

Side by Side Diff: src/deoptimizer.cc

Issue 2729163002: [turbofan] compute arguments length in deoptimizer (Closed)
Patch Set: fix comment Created 3 years, 9 months 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
« no previous file with comments | « src/deoptimizer.h ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/deoptimizer.h" 5 #include "src/deoptimizer.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/ast/prettyprinter.h" 10 #include "src/ast/prettyprinter.h"
(...skipping 2389 matching lines...) Expand 10 before | Expand all | Expand 10 after
2400 void Translation::BeginArgumentsObject(int args_length) { 2400 void Translation::BeginArgumentsObject(int args_length) {
2401 buffer_->Add(ARGUMENTS_OBJECT); 2401 buffer_->Add(ARGUMENTS_OBJECT);
2402 buffer_->Add(args_length); 2402 buffer_->Add(args_length);
2403 } 2403 }
2404 2404
2405 void Translation::ArgumentsElements(bool is_rest) { 2405 void Translation::ArgumentsElements(bool is_rest) {
2406 buffer_->Add(ARGUMENTS_ELEMENTS); 2406 buffer_->Add(ARGUMENTS_ELEMENTS);
2407 buffer_->Add(is_rest); 2407 buffer_->Add(is_rest);
2408 } 2408 }
2409 2409
2410 void Translation::ArgumentsLength(bool is_rest) {
2411 buffer_->Add(ARGUMENTS_LENGTH);
2412 buffer_->Add(is_rest);
2413 }
2414
2410 void Translation::BeginCapturedObject(int length) { 2415 void Translation::BeginCapturedObject(int length) {
2411 buffer_->Add(CAPTURED_OBJECT); 2416 buffer_->Add(CAPTURED_OBJECT);
2412 buffer_->Add(length); 2417 buffer_->Add(length);
2413 } 2418 }
2414 2419
2415 2420
2416 void Translation::DuplicateObject(int object_index) { 2421 void Translation::DuplicateObject(int object_index) {
2417 buffer_->Add(DUPLICATED_OBJECT); 2422 buffer_->Add(DUPLICATED_OBJECT);
2418 buffer_->Add(object_index); 2423 buffer_->Add(object_index);
2419 } 2424 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2533 case TAIL_CALLER_FRAME: 2538 case TAIL_CALLER_FRAME:
2534 return 1; 2539 return 1;
2535 case BEGIN: 2540 case BEGIN:
2536 case ARGUMENTS_ADAPTOR_FRAME: 2541 case ARGUMENTS_ADAPTOR_FRAME:
2537 return 2; 2542 return 2;
2538 case JS_FRAME: 2543 case JS_FRAME:
2539 case INTERPRETED_FRAME: 2544 case INTERPRETED_FRAME:
2540 case CONSTRUCT_STUB_FRAME: 2545 case CONSTRUCT_STUB_FRAME:
2541 return 3; 2546 return 3;
2542 case ARGUMENTS_ELEMENTS: 2547 case ARGUMENTS_ELEMENTS:
2548 case ARGUMENTS_LENGTH:
2543 return 1; 2549 return 1;
2544 } 2550 }
2545 FATAL("Unexpected translation type"); 2551 FATAL("Unexpected translation type");
2546 return -1; 2552 return -1;
2547 } 2553 }
2548 2554
2549 2555
2550 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 2556 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER)
2551 2557
2552 const char* Translation::StringFor(Opcode opcode) { 2558 const char* Translation::StringFor(Opcode opcode) {
(...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after
3302 " reading compiler stub frame => height=%d; inputs:\n", height); 3308 " reading compiler stub frame => height=%d; inputs:\n", height);
3303 } 3309 }
3304 return TranslatedFrame::CompiledStubFrame(height, 3310 return TranslatedFrame::CompiledStubFrame(height,
3305 literal_array->GetIsolate()); 3311 literal_array->GetIsolate());
3306 } 3312 }
3307 3313
3308 case Translation::BEGIN: 3314 case Translation::BEGIN:
3309 case Translation::DUPLICATED_OBJECT: 3315 case Translation::DUPLICATED_OBJECT:
3310 case Translation::ARGUMENTS_OBJECT: 3316 case Translation::ARGUMENTS_OBJECT:
3311 case Translation::ARGUMENTS_ELEMENTS: 3317 case Translation::ARGUMENTS_ELEMENTS:
3318 case Translation::ARGUMENTS_LENGTH:
3312 case Translation::CAPTURED_OBJECT: 3319 case Translation::CAPTURED_OBJECT:
3313 case Translation::REGISTER: 3320 case Translation::REGISTER:
3314 case Translation::INT32_REGISTER: 3321 case Translation::INT32_REGISTER:
3315 case Translation::UINT32_REGISTER: 3322 case Translation::UINT32_REGISTER:
3316 case Translation::BOOL_REGISTER: 3323 case Translation::BOOL_REGISTER:
3317 case Translation::FLOAT_REGISTER: 3324 case Translation::FLOAT_REGISTER:
3318 case Translation::DOUBLE_REGISTER: 3325 case Translation::DOUBLE_REGISTER:
3319 case Translation::STACK_SLOT: 3326 case Translation::STACK_SLOT:
3320 case Translation::INT32_STACK_SLOT: 3327 case Translation::INT32_STACK_SLOT:
3321 case Translation::UINT32_STACK_SLOT: 3328 case Translation::UINT32_STACK_SLOT:
(...skipping 15 matching lines...) Expand all
3337 while (values_to_skip > 0) { 3344 while (values_to_skip > 0) {
3338 // Consume the current element. 3345 // Consume the current element.
3339 values_to_skip--; 3346 values_to_skip--;
3340 // Add all the children. 3347 // Add all the children.
3341 values_to_skip += (*iter)->GetChildrenCount(); 3348 values_to_skip += (*iter)->GetChildrenCount();
3342 3349
3343 (*iter)++; 3350 (*iter)++;
3344 } 3351 }
3345 } 3352 }
3346 3353
3354 Address TranslatedState::ComputeArgumentsPosition(Address input_frame_pointer,
3355 bool is_rest, int* length) {
3356 Address parent_frame_pointer = *reinterpret_cast<Address*>(
3357 input_frame_pointer + StandardFrameConstants::kCallerFPOffset);
3358 intptr_t parent_frame_type = Memory::intptr_at(
3359 parent_frame_pointer + CommonFrameConstants::kContextOrFrameTypeOffset);
3360
3361 Address arguments_frame;
3362 if (parent_frame_type ==
3363 StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR)) {
3364 if (length)
3365 *length = Smi::cast(*reinterpret_cast<Object**>(
3366 parent_frame_pointer +
3367 ArgumentsAdaptorFrameConstants::kLengthOffset))
3368 ->value();
3369 arguments_frame = parent_frame_pointer;
3370 } else {
3371 if (length) *length = formal_parameter_count_;
3372 arguments_frame = input_frame_pointer;
3373 }
3374
3375 if (is_rest) {
3376 // If the actual number of arguments is less than the number of formal
3377 // parameters, we have zero rest parameters.
3378 if (length) *length = std::max(0, *length - formal_parameter_count_);
3379 }
3380
3381 return arguments_frame;
3382 }
3383
3347 // Creates translated values for an arguments backing store, or the backing 3384 // Creates translated values for an arguments backing store, or the backing
3348 // store for the rest parameters if {is_rest} is true. The TranslatedValue 3385 // store for the rest parameters if {is_rest} is true. The TranslatedValue
3349 // objects for the fields are not read from the TranslationIterator, but instead 3386 // objects for the fields are not read from the TranslationIterator, but instead
3350 // created on-the-fly based on dynamic information in the optimized frame. 3387 // created on-the-fly based on dynamic information in the optimized frame.
3351 void TranslatedState::CreateArgumentsElementsTranslatedValues( 3388 void TranslatedState::CreateArgumentsElementsTranslatedValues(
3352 int frame_index, Address input_frame_pointer, bool is_rest) { 3389 int frame_index, Address input_frame_pointer, bool is_rest) {
3353 TranslatedFrame& frame = frames_[frame_index]; 3390 TranslatedFrame& frame = frames_[frame_index];
3354 3391
3355 Address parent_frame_pointer = *reinterpret_cast<Address*>(
3356 input_frame_pointer + StandardFrameConstants::kCallerFPOffset);
3357 intptr_t parent_frame_type = Memory::intptr_at(
3358 parent_frame_pointer + CommonFrameConstants::kContextOrFrameTypeOffset);
3359 int length; 3392 int length;
3360 Address arguments_frame; 3393 Address arguments_frame =
3361 if (parent_frame_type == 3394 ComputeArgumentsPosition(input_frame_pointer, is_rest, &length);
3362 StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR)) {
3363 length = Smi::cast(*reinterpret_cast<Object**>(
3364 parent_frame_pointer +
3365 ArgumentsAdaptorFrameConstants::kLengthOffset))
3366 ->value();
3367 arguments_frame = parent_frame_pointer;
3368 } else {
3369 length = formal_parameter_count_;
3370 arguments_frame = input_frame_pointer;
3371 }
3372
3373 if (is_rest) {
3374 // If the actual number of arguments is less than the number of formal
3375 // parameters, we have zero rest parameters.
3376 length = std::max(0, length - formal_parameter_count_);
3377 }
3378 3395
3379 int object_index = static_cast<int>(object_positions_.size()); 3396 int object_index = static_cast<int>(object_positions_.size());
3380 int value_index = static_cast<int>(frame.values_.size()); 3397 int value_index = static_cast<int>(frame.values_.size());
3381 object_positions_.push_back({frame_index, value_index}); 3398 object_positions_.push_back({frame_index, value_index});
3382 frame.Add(TranslatedValue::NewDeferredObject( 3399 frame.Add(TranslatedValue::NewDeferredObject(
3383 this, length + FixedArray::kHeaderSize / kPointerSize, object_index)); 3400 this, length + FixedArray::kHeaderSize / kPointerSize, object_index));
3384 3401
3385 frame.Add( 3402 frame.Add(
3386 TranslatedValue::NewTagged(this, isolate_->heap()->fixed_array_map())); 3403 TranslatedValue::NewTagged(this, isolate_->heap()->fixed_array_map()));
3387 frame.Add(TranslatedValue::NewInt32(this, length)); 3404 frame.Add(TranslatedValue::NewInt32(this, length));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
3452 frame.Add(translated_value); 3469 frame.Add(translated_value);
3453 return translated_value.GetChildrenCount(); 3470 return translated_value.GetChildrenCount();
3454 } 3471 }
3455 3472
3456 case Translation::ARGUMENTS_ELEMENTS: { 3473 case Translation::ARGUMENTS_ELEMENTS: {
3457 bool is_rest = iterator->Next(); 3474 bool is_rest = iterator->Next();
3458 CreateArgumentsElementsTranslatedValues(frame_index, fp, is_rest); 3475 CreateArgumentsElementsTranslatedValues(frame_index, fp, is_rest);
3459 return 0; 3476 return 0;
3460 } 3477 }
3461 3478
3479 case Translation::ARGUMENTS_LENGTH: {
3480 bool is_rest = iterator->Next();
3481 int length;
3482 ComputeArgumentsPosition(fp, is_rest, &length);
3483 frame.Add(TranslatedValue::NewInt32(this, length));
3484 return 0;
3485 }
3486
3462 case Translation::CAPTURED_OBJECT: { 3487 case Translation::CAPTURED_OBJECT: {
3463 int field_count = iterator->Next(); 3488 int field_count = iterator->Next();
3464 int object_index = static_cast<int>(object_positions_.size()); 3489 int object_index = static_cast<int>(object_positions_.size());
3465 if (trace_file != nullptr) { 3490 if (trace_file != nullptr) {
3466 PrintF(trace_file, "captured object #%d (length = %d)", object_index, 3491 PrintF(trace_file, "captured object #%d (length = %d)", object_index,
3467 field_count); 3492 field_count);
3468 } 3493 }
3469 object_positions_.push_back({frame_index, value_index}); 3494 object_positions_.push_back({frame_index, value_index});
3470 TranslatedValue translated_value = 3495 TranslatedValue translated_value =
3471 TranslatedValue::NewDeferredObject(this, field_count, object_index); 3496 TranslatedValue::NewDeferredObject(this, field_count, object_index);
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after
4381 CHECK(value_info->IsMaterializedObject()); 4406 CHECK(value_info->IsMaterializedObject());
4382 4407
4383 value_info->value_ = 4408 value_info->value_ =
4384 Handle<Object>(previously_materialized_objects->get(i), isolate_); 4409 Handle<Object>(previously_materialized_objects->get(i), isolate_);
4385 } 4410 }
4386 } 4411 }
4387 } 4412 }
4388 4413
4389 } // namespace internal 4414 } // namespace internal
4390 } // namespace v8 4415 } // namespace v8
OLDNEW
« no previous file with comments | « src/deoptimizer.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698