1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-codegen.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <sstream> 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_IA32 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/ia32/lithium-ia32.h" // NOLINT 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/ia32/lithium-codegen-ia32.h" // NOLINT 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_X64 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x64/lithium-x64.h" // NOLINT 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x64/lithium-codegen-x64.h" // NOLINT 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_ARM 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/arm/lithium-arm.h" // NOLINT 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/arm/lithium-codegen-arm.h" // NOLINT 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_ARM64 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/arm64/lithium-arm64.h" // NOLINT 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/arm64/lithium-codegen-arm64.h" // NOLINT 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_MIPS 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips/lithium-mips.h" // NOLINT 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips/lithium-codegen-mips.h" // NOLINT 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_MIPS64 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips64/lithium-mips64.h" // NOLINT 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/mips64/lithium-codegen-mips64.h" // NOLINT 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_X87 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x87/lithium-x87.h" // NOLINT 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/x87/lithium-codegen-x87.h" // NOLINT 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_PPC 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/ppc/lithium-ppc.h" // NOLINT 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/ppc/lithium-codegen-ppc.h" // NOLINT 333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#elif V8_TARGET_ARCH_S390 343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/crankshaft/s390/lithium-s390.h" // NOLINT 353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/crankshaft/s390/lithium-codegen-s390.h" // NOLINT 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#error Unsupported target architecture. 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/globals.h" 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHGraph* LCodeGenBase::graph() const { 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return chunk()->graph(); 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLCodeGenBase::LCodeGenBase(LChunk* chunk, MacroAssembler* assembler, 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CompilationInfo* info) 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : chunk_(static_cast<LPlatformChunk*>(chunk)), 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch masm_(assembler), 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info_(info), 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch zone_(info->zone()), 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch status_(UNUSED), 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch current_block_(-1), 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch current_instruction_(-1), 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instructions_(chunk->instructions()), 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch deoptimizations_(4, info->zone()), 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch deoptimization_literals_(8, info->zone()), 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translations_(info->zone()), 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inlined_function_count_(0), 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch last_lazy_deopt_pc_(0), 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch osr_pc_offset_(-1), 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch source_position_table_builder_(info->zone(), 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch info->SourcePositionRecordingMode()) {} 68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 69f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochIsolate* LCodeGenBase::isolate() const { return info_->isolate(); } 70f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool LCodeGenBase::GenerateBody() { 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(is_generating()); 73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool emit_instructions = true; 74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LCodeGen* codegen = static_cast<LCodeGen*>(this); 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (current_instruction_ = 0; 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch !is_aborted() && current_instruction_ < instructions_->length(); 77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch current_instruction_++) { 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LInstruction* instr = instructions_->at(current_instruction_); 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't emit code for basic blocks with a replacement. 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->IsLabel()) { 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch emit_instructions = !LLabel::cast(instr)->HasReplacement() && 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (!FLAG_unreachable_code_elimination || 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->hydrogen_value()->block()->IsReachable()); 85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_code_comments && !emit_instructions) { 86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Comment( 87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ";;; <@%d,#%d> -------------------- B%d (unreachable/replaced) " 88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "--------------------", 89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch current_instruction_, 90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->hydrogen_value()->id(), 91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->hydrogen_value()->block()->block_id()); 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!emit_instructions) continue; 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_code_comments && instr->HasInterestingComment(codegen)) { 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Comment(";;; <@%d,#%d> %s", 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch current_instruction_, 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->hydrogen_value()->id(), 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->Mnemonic()); 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GenerateBodyInstructionPre(instr); 104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HValue* value = instr->hydrogen_value(); 106c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (value->position().IsKnown()) { 107c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch RecordAndWritePosition(value->position()); 108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch instr->CompileToNative(codegen); 111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GenerateBodyInstructionPost(instr); 113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch EnsureSpaceForLazyDeopt(Deoptimizer::patch_size()); 115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch last_lazy_deopt_pc_ = masm()->pc_offset(); 116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return !is_aborted(); 117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::CheckEnvironmentUsage() { 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool dead_block = false; 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < instructions_->length(); i++) { 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LInstruction* instr = instructions_->at(i); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HValue* hval = instr->hydrogen_value(); 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->IsLabel()) dead_block = LLabel::cast(instr)->HasReplacement(); 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (dead_block || !hval->block()->IsReachable()) continue; 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HInstruction* hinstr = HInstruction::cast(hval); 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!hinstr->CanDeoptimize() && instr->HasEnvironment()) { 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_Fatal(__FILE__, __LINE__, "CanDeoptimize is wrong for %s (%s)", 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch hinstr->Mnemonic(), instr->Mnemonic()); 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (instr->HasEnvironment() && !instr->environment()->has_been_used()) { 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V8_Fatal(__FILE__, __LINE__, "unused environment for %s (%s)", 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch hinstr->Mnemonic(), instr->Mnemonic()); 138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 143c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid LCodeGenBase::RecordAndWritePosition(SourcePosition pos) { 144c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (!pos.IsKnown()) return; 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch source_position_table_builder_.AddPosition(masm_->pc_offset(), pos, false); 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::Comment(const char* format, ...) { 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!FLAG_code_comments) return; 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch char buffer[4 * KB]; 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StringBuilder builder(buffer, arraysize(buffer)); 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_list arguments; 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_start(arguments, format); 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch builder.AddFormattedList(format, arguments); 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_end(arguments); 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Copy the string before recording it in the assembler to avoid 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // issues when the stack allocated buffer goes out of scope. 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t length = builder.position(); 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Vector<char> copy = Vector<char>::New(static_cast<int>(length) + 1); 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MemCopy(copy.start(), builder.Finalize(), copy.length()); 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch masm()->RecordComment(copy.start()); 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::DeoptComment(const Deoptimizer::DeoptInfo& deopt_info) { 167109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch SourcePosition position = deopt_info.position; 168bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int deopt_id = deopt_info.deopt_id; 169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch masm()->RecordDeoptReason(deopt_info.deopt_reason, position, deopt_id); 170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint LCodeGenBase::GetNextEmittedBlock() const { 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = current_block_ + 1; i < graph()->blocks()->length(); ++i) { 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!graph()->blocks()->at(i)->IsReachable()) continue; 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!chunk_->GetLabel(i)->HasReplacement()) return i; 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return -1; 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::Abort(BailoutReason reason) { 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info()->AbortOptimization(reason); 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch status_ = ABORTED; 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::Retry(BailoutReason reason) { 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch info()->RetryOptimization(reason); 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch status_ = ABORTED; 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::AddDeprecationDependency(Handle<Map> map) { 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (map->is_deprecated()) return Retry(kMapBecameDeprecated); 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch chunk_->AddDeprecationDependency(map); 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::AddStabilityDependency(Handle<Map> map) { 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!map->is_stable()) return Retry(kMapBecameUnstable); 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch chunk_->AddStabilityDependency(map); 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint LCodeGenBase::DefineDeoptimizationLiteral(Handle<Object> literal) { 207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int result = deoptimization_literals_.length(); 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < deoptimization_literals_.length(); ++i) { 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (deoptimization_literals_[i].is_identical_to(literal)) return i; 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch deoptimization_literals_.Add(literal, zone()); 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::WriteTranslationFrame(LEnvironment* environment, 217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Translation* translation) { 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int translation_size = environment->translation_size(); 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The output frame height does not include the parameters. 220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int height = translation_size - environment->parameter_count(); 221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (environment->frame_type()) { 223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_FUNCTION: { 224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int shared_id = DefineDeoptimizationLiteral( 225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch environment->entry() ? environment->entry()->shared() 226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : info()->shared_info()); 227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->BeginJSFrame(environment->ast_id(), shared_id, height); 228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info()->closure().is_identical_to(environment->closure())) { 229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreJSFrameFunction(); 230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int closure_id = DefineDeoptimizationLiteral(environment->closure()); 232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreLiteral(closure_id); 233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_CONSTRUCT: { 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int shared_id = DefineDeoptimizationLiteral( 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch environment->entry() ? environment->entry()->shared() 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : info()->shared_info()); 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->BeginConstructStubFrame(shared_id, translation_size); 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info()->closure().is_identical_to(environment->closure())) { 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreJSFrameFunction(); 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int closure_id = DefineDeoptimizationLiteral(environment->closure()); 245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreLiteral(closure_id); 246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_GETTER: { 2503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK_EQ(1, translation_size); 2513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK_EQ(0, height); 252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int shared_id = DefineDeoptimizationLiteral( 253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch environment->entry() ? environment->entry()->shared() 254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : info()->shared_info()); 255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->BeginGetterStubFrame(shared_id); 256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info()->closure().is_identical_to(environment->closure())) { 257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreJSFrameFunction(); 258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int closure_id = DefineDeoptimizationLiteral(environment->closure()); 260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreLiteral(closure_id); 261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case JS_SETTER: { 2653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK_EQ(2, translation_size); 2663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK_EQ(0, height); 267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int shared_id = DefineDeoptimizationLiteral( 268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch environment->entry() ? environment->entry()->shared() 269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : info()->shared_info()); 270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->BeginSetterStubFrame(shared_id); 271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info()->closure().is_identical_to(environment->closure())) { 272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreJSFrameFunction(); 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int closure_id = DefineDeoptimizationLiteral(environment->closure()); 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreLiteral(closure_id); 276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case TAIL_CALLER_FUNCTION: { 2803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DCHECK_EQ(0, translation_size); 2813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int shared_id = DefineDeoptimizationLiteral( 2823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch environment->entry() ? environment->entry()->shared() 2833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch : info()->shared_info()); 2843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch translation->BeginTailCallerFrame(shared_id); 2853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (info()->closure().is_identical_to(environment->closure())) { 2863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch translation->StoreJSFrameFunction(); 2873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } else { 2883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int closure_id = DefineDeoptimizationLiteral(environment->closure()); 2893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch translation->StoreLiteral(closure_id); 2903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch break; 2923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case ARGUMENTS_ADAPTOR: { 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int shared_id = DefineDeoptimizationLiteral( 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch environment->entry() ? environment->entry()->shared() 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : info()->shared_info()); 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->BeginArgumentsAdaptorFrame(shared_id, translation_size); 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info()->closure().is_identical_to(environment->closure())) { 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreJSFrameFunction(); 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int closure_id = DefineDeoptimizationLiteral(environment->closure()); 302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->StoreLiteral(closure_id); 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case STUB: 307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translation->BeginCompiledStubFrame(translation_size); 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 312c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochnamespace { 313c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 314c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<PodArray<InliningPosition>> CreateInliningPositions( 315c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch CompilationInfo* info) { 316c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const CompilationInfo::InlinedFunctionList& inlined_functions = 317c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch info->inlined_functions(); 318c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (inlined_functions.size() == 0) { 319c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return Handle<PodArray<InliningPosition>>::cast( 320c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch info->isolate()->factory()->empty_byte_array()); 321c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<PodArray<InliningPosition>> inl_positions = 323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PodArray<InliningPosition>::New( 324c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch info->isolate(), static_cast<int>(inlined_functions.size()), TENURED); 325c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch for (size_t i = 0; i < inlined_functions.size(); ++i) { 326c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inl_positions->set(static_cast<int>(i), inlined_functions[i].position); 327c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 328c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return inl_positions; 329c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 330c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 331c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} // namespace 332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::PopulateDeoptimizationData(Handle<Code> code) { 334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = deoptimizations_.length(); 335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (length == 0) return; 336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DeoptimizationInputData> data = 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DeoptimizationInputData::New(isolate(), length, TENURED); 338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<ByteArray> translations = 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch translations_.CreateByteArray(isolate()->factory()); 341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetTranslationByteArray(*translations); 342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetInlinedFunctionCount(Smi::FromInt(inlined_function_count_)); 343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetOptimizationId(Smi::FromInt(info_->optimization_id())); 344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (info_->IsOptimizing()) { 345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Reference to shared function info does not change between phases. 346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AllowDeferredHandleDereference allow_handle_dereference; 347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetSharedFunctionInfo(*info_->shared_info()); 348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 349c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch data->SetSharedFunctionInfo(Smi::kZero); 350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 351c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch data->SetWeakCellCache(Smi::kZero); 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> literals = 354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch factory()->NewFixedArray(deoptimization_literals_.length(), TENURED); 355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AllowDeferredHandleDereference copy_handles; 357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < deoptimization_literals_.length(); i++) { 358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch literals->set(i, *deoptimization_literals_[i]); 359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetLiteralArray(*literals); 361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 363c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<PodArray<InliningPosition>> inl_pos = CreateInliningPositions(info_); 364c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch data->SetInliningPositions(*inl_pos); 365c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id().ToInt())); 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_)); 368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Populate the deoptimization entries. 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < length; i++) { 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LEnvironment* env = deoptimizations_[i]; 372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetAstId(i, env->ast_id()); 373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetTranslationIndex(i, Smi::FromInt(env->translation_index())); 374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetArgumentsStackHeight(i, 375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Smi::FromInt(env->arguments_stack_height())); 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch data->SetPc(i, Smi::FromInt(env->pc_offset())); 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch code->set_deoptimization_data(*data); 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid LCodeGenBase::PopulateDeoptimizationLiteralsWithInlinedFunctions() { 383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(0, deoptimization_literals_.length()); 384c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch for (CompilationInfo::InlinedFunctionHolder& inlined : 385c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch info()->inlined_functions()) { 386c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (!inlined.shared_info.is_identical_to(info()->shared_info())) { 387c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int index = DefineDeoptimizationLiteral(inlined.shared_info); 388c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inlined.RegisterInlinedFunctionId(index); 389c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inlined_function_count_ = deoptimization_literals_.length(); 392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Define deoptimization literals for all unoptimized code objects of inlined 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // functions. This ensures unoptimized code is kept alive by optimized code. 395c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch for (const CompilationInfo::InlinedFunctionHolder& inlined : 396c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch info()->inlined_functions()) { 397c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (!inlined.shared_info.is_identical_to(info()->shared_info())) { 398c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DefineDeoptimizationLiteral(inlined.inlined_code_object_root); 399c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDeoptimizer::DeoptInfo LCodeGenBase::MakeDeoptInfo( 404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch LInstruction* instr, DeoptimizeReason deopt_reason, int deopt_id) { 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Deoptimizer::DeoptInfo deopt_info(instr->hydrogen_value()->position(), 406bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch deopt_reason, deopt_id); 407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return deopt_info; 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 412