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