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

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 140773002: Fix handling of last position for lazy deopt on X64, ARM and MIPS. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « src/mips/lithium-codegen-mips.cc ('k') | no next file » | 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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 class SafepointGenerator V8_FINAL : public CallWrapper { 43 class SafepointGenerator V8_FINAL : public CallWrapper {
44 public: 44 public:
45 SafepointGenerator(LCodeGen* codegen, 45 SafepointGenerator(LCodeGen* codegen,
46 LPointerMap* pointers, 46 LPointerMap* pointers,
47 Safepoint::DeoptMode mode) 47 Safepoint::DeoptMode mode)
48 : codegen_(codegen), 48 : codegen_(codegen),
49 pointers_(pointers), 49 pointers_(pointers),
50 deopt_mode_(mode) { } 50 deopt_mode_(mode) { }
51 virtual ~SafepointGenerator() {} 51 virtual ~SafepointGenerator() {}
52 52
53 virtual void BeforeCall(int call_size) const V8_OVERRIDE { 53 virtual void BeforeCall(int call_size) const V8_OVERRIDE {}
54 codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size);
55 }
56 54
57 virtual void AfterCall() const V8_OVERRIDE { 55 virtual void AfterCall() const V8_OVERRIDE {
58 codegen_->RecordSafepoint(pointers_, deopt_mode_); 56 codegen_->RecordSafepoint(pointers_, deopt_mode_);
59 } 57 }
60 58
61 private: 59 private:
62 LCodeGen* codegen_; 60 LCodeGen* codegen_;
63 LPointerMap* pointers_; 61 LPointerMap* pointers_;
64 Safepoint::DeoptMode deopt_mode_; 62 Safepoint::DeoptMode deopt_mode_;
65 }; 63 };
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 UNREACHABLE(); 593 UNREACHABLE();
596 } 594 }
597 } 595 }
598 596
599 597
600 void LCodeGen::CallCodeGeneric(Handle<Code> code, 598 void LCodeGen::CallCodeGeneric(Handle<Code> code,
601 RelocInfo::Mode mode, 599 RelocInfo::Mode mode,
602 LInstruction* instr, 600 LInstruction* instr,
603 SafepointMode safepoint_mode, 601 SafepointMode safepoint_mode,
604 int argc) { 602 int argc) {
605 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - masm()->CallSize(code));
606 ASSERT(instr != NULL); 603 ASSERT(instr != NULL);
607 __ call(code, mode); 604 __ call(code, mode);
608 RecordSafepointWithLazyDeopt(instr, safepoint_mode, argc); 605 RecordSafepointWithLazyDeopt(instr, safepoint_mode, argc);
609 606
610 // Signal that we don't inline smi code before these stubs in the 607 // Signal that we don't inline smi code before these stubs in the
611 // optimizing code generator. 608 // optimizing code generator.
612 if (code->kind() == Code::BINARY_OP_IC || 609 if (code->kind() == Code::BINARY_OP_IC ||
613 code->kind() == Code::COMPARE_IC) { 610 code->kind() == Code::COMPARE_IC) {
614 __ nop(); 611 __ nop();
615 } 612 }
(...skipping 4791 matching lines...) Expand 10 before | Expand all | Expand 10 after
5407 __ movq(temp, Operand(temp, StandardFrameConstants::kCallerFPOffset)); 5404 __ movq(temp, Operand(temp, StandardFrameConstants::kCallerFPOffset));
5408 5405
5409 // Check the marker in the calling frame. 5406 // Check the marker in the calling frame.
5410 __ bind(&check_frame_marker); 5407 __ bind(&check_frame_marker);
5411 __ Cmp(Operand(temp, StandardFrameConstants::kMarkerOffset), 5408 __ Cmp(Operand(temp, StandardFrameConstants::kMarkerOffset),
5412 Smi::FromInt(StackFrame::CONSTRUCT)); 5409 Smi::FromInt(StackFrame::CONSTRUCT));
5413 } 5410 }
5414 5411
5415 5412
5416 void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) { 5413 void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
5417 if (info()->IsStub()) return; 5414 if (!info()->IsStub()) {
5418 // Ensure that we have enough space after the previous lazy-bailout 5415 // Ensure that we have enough space after the previous lazy-bailout
5419 // instruction for patching the code here. 5416 // instruction for patching the code here.
5420 int current_pc = masm()->pc_offset(); 5417 int current_pc = masm()->pc_offset();
5421 if (current_pc < last_lazy_deopt_pc_ + space_needed) { 5418 if (current_pc < last_lazy_deopt_pc_ + space_needed) {
5422 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 5419 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
5423 __ Nop(padding_size); 5420 __ Nop(padding_size);
5421 }
5424 } 5422 }
5423 last_lazy_deopt_pc_ = masm()->pc_offset();
5425 } 5424 }
5426 5425
5427 5426
5428 void LCodeGen::DoLazyBailout(LLazyBailout* instr) { 5427 void LCodeGen::DoLazyBailout(LLazyBailout* instr) {
5429 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); 5428 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
5430 last_lazy_deopt_pc_ = masm()->pc_offset();
5431 ASSERT(instr->HasEnvironment()); 5429 ASSERT(instr->HasEnvironment());
5432 LEnvironment* env = instr->environment(); 5430 LEnvironment* env = instr->environment();
5433 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); 5431 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
5434 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5432 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5435 } 5433 }
5436 5434
5437 5435
5438 void LCodeGen::DoDeoptimize(LDeoptimize* instr) { 5436 void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
5439 Deoptimizer::BailoutType type = instr->hydrogen()->type(); 5437 Deoptimizer::BailoutType type = instr->hydrogen()->type();
5440 // TODO(danno): Stubs expect all deopts to be lazy for historical reasons (the 5438 // TODO(danno): Stubs expect all deopts to be lazy for historical reasons (the
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
5493 Label done; 5491 Label done;
5494 __ CompareRoot(rsp, Heap::kStackLimitRootIndex); 5492 __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
5495 __ j(above_equal, &done, Label::kNear); 5493 __ j(above_equal, &done, Label::kNear);
5496 5494
5497 ASSERT(instr->context()->IsRegister()); 5495 ASSERT(instr->context()->IsRegister());
5498 ASSERT(ToRegister(instr->context()).is(rsi)); 5496 ASSERT(ToRegister(instr->context()).is(rsi));
5499 CallCode(isolate()->builtins()->StackCheck(), 5497 CallCode(isolate()->builtins()->StackCheck(),
5500 RelocInfo::CODE_TARGET, 5498 RelocInfo::CODE_TARGET,
5501 instr); 5499 instr);
5502 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); 5500 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
5503 last_lazy_deopt_pc_ = masm()->pc_offset();
5504 __ bind(&done); 5501 __ bind(&done);
5505 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); 5502 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
5506 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5503 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5507 } else { 5504 } else {
5508 ASSERT(instr->hydrogen()->is_backwards_branch()); 5505 ASSERT(instr->hydrogen()->is_backwards_branch());
5509 // Perform stack overflow check if this goto needs it before jumping. 5506 // Perform stack overflow check if this goto needs it before jumping.
5510 DeferredStackCheck* deferred_stack_check = 5507 DeferredStackCheck* deferred_stack_check =
5511 new(zone()) DeferredStackCheck(this, instr); 5508 new(zone()) DeferredStackCheck(this, instr);
5512 __ CompareRoot(rsp, Heap::kStackLimitRootIndex); 5509 __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
5513 __ j(below, deferred_stack_check->entry()); 5510 __ j(below, deferred_stack_check->entry());
5514 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); 5511 EnsureSpaceForLazyDeopt(Deoptimizer::patch_size());
5515 last_lazy_deopt_pc_ = masm()->pc_offset();
5516 __ bind(instr->done_label()); 5512 __ bind(instr->done_label());
5517 deferred_stack_check->SetExit(instr->done_label()); 5513 deferred_stack_check->SetExit(instr->done_label());
5518 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt); 5514 RegisterEnvironmentForDeoptimization(env, Safepoint::kLazyDeopt);
5519 // Don't record a deoptimization index for the safepoint here. 5515 // Don't record a deoptimization index for the safepoint here.
5520 // This will be done explicitly when emitting call and the safepoint in 5516 // This will be done explicitly when emitting call and the safepoint in
5521 // the deferred code. 5517 // the deferred code.
5522 } 5518 }
5523 } 5519 }
5524 5520
5525 5521
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
5626 FixedArray::kHeaderSize - kPointerSize)); 5622 FixedArray::kHeaderSize - kPointerSize));
5627 __ bind(&done); 5623 __ bind(&done);
5628 } 5624 }
5629 5625
5630 5626
5631 #undef __ 5627 #undef __
5632 5628
5633 } } // namespace v8::internal 5629 } } // namespace v8::internal
5634 5630
5635 #endif // V8_TARGET_ARCH_X64 5631 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/mips/lithium-codegen-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698