Commit 9dd5fe29 authored by jarin's avatar jarin Committed by Commit bot

Use SharedFunctionInfo rather than the JSFunction in the deoptimizer (first step).

This removes uses of JSFunction by the (proper) deoptimizer. This will be useful
when we escape analyze JSFunction away. Unfortunately, the debugger still needs
JSFunction, so escape analysis would not work yet.

Review URL: https://codereview.chromium.org/1686183003

Cr-Commit-Position: refs/heads/master@{#33891}
parent d69ce04d
......@@ -124,8 +124,7 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
// There is no dynamic alignment padding on ARM in the input frame.
return false;
}
......
......@@ -87,8 +87,7 @@ void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
// There is no dynamic alignment padding on ARM64 in the input frame.
return false;
}
......
......@@ -813,6 +813,8 @@ void Deoptimizer::DoComputeOutputFrames() {
void Deoptimizer::DoComputeJSFrame(int frame_index) {
TranslatedFrame* translated_frame =
&(translated_state_.frames()[frame_index]);
SharedFunctionInfo* shared = translated_frame->raw_shared_info();
TranslatedFrame::iterator value_iterator = translated_frame->begin();
int input_index = 0;
......@@ -825,14 +827,15 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) {
input_index++;
if (trace_scope_ != NULL) {
PrintF(trace_scope_->file(), " translating frame ");
function->PrintName(trace_scope_->file());
base::SmartArrayPointer<char> name = shared->DebugName()->ToCString();
PrintF(trace_scope_->file(), "%s", name.get());
PrintF(trace_scope_->file(),
" => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes);
}
// The 'fixed' part of the frame consists of the incoming parameters and
// the part described by JavaScriptFrameConstants.
unsigned fixed_frame_size = ComputeJavascriptFixedSize(function);
unsigned fixed_frame_size = ComputeJavascriptFixedSize(shared);
unsigned input_frame_size = input_->GetFrameSize();
unsigned output_frame_size = height_in_bytes + fixed_frame_size;
......@@ -856,9 +859,8 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) {
if (is_bottommost) {
// Determine whether the input frame contains alignment padding.
has_alignment_padding_ =
(!compiled_code_->is_turbofanned() && HasAlignmentPadding(function))
? 1
: 0;
(!compiled_code_->is_turbofanned() && HasAlignmentPadding(shared)) ? 1
: 0;
// 2 = context and function in the frame.
// If the optimized frame had alignment padding, adjust the frame pointer
// to point to the new position of the old frame pointer after padding
......@@ -872,8 +874,7 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) {
output_frame->SetTop(top_address);
// Compute the incoming parameter translation.
int parameter_count =
function->shared()->internal_formal_parameter_count() + 1;
int parameter_count = shared->internal_formal_parameter_count() + 1;
unsigned output_offset = output_frame_size;
unsigned input_offset = input_frame_size;
for (int i = 0; i < parameter_count; ++i) {
......@@ -988,11 +989,11 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) {
CHECK_EQ(0u, output_offset);
// Compute this frame's PC, state, and continuation.
Code* non_optimized_code = function->shared()->code();
Code* non_optimized_code = shared->code();
FixedArray* raw_data = non_optimized_code->deoptimization_data();
DeoptimizationOutputData* data = DeoptimizationOutputData::cast(raw_data);
Address start = non_optimized_code->instruction_start();
unsigned pc_and_state = GetOutputInfo(data, node_id, function->shared());
unsigned pc_and_state = GetOutputInfo(data, node_id, shared);
unsigned pc_offset = FullCodeGenerator::PcField::decode(pc_and_state);
intptr_t pc_value = reinterpret_cast<intptr_t>(start + pc_offset);
output_frame->SetPc(pc_value);
......@@ -1033,6 +1034,8 @@ void Deoptimizer::DoComputeJSFrame(int frame_index) {
void Deoptimizer::DoComputeInterpretedFrame(int frame_index) {
TranslatedFrame* translated_frame =
&(translated_state_.frames()[frame_index]);
SharedFunctionInfo* shared = translated_frame->raw_shared_info();
TranslatedFrame::iterator value_iterator = translated_frame->begin();
int input_index = 0;
......@@ -1044,14 +1047,15 @@ void Deoptimizer::DoComputeInterpretedFrame(int frame_index) {
input_index++;
if (trace_scope_ != NULL) {
PrintF(trace_scope_->file(), " translating interpreted frame ");
function->PrintName(trace_scope_->file());
base::SmartArrayPointer<char> name = shared->DebugName()->ToCString();
PrintF(trace_scope_->file(), "%s", name.get());
PrintF(trace_scope_->file(), " => bytecode_offset=%d, height=%d\n",
bytecode_offset.ToInt(), height_in_bytes);
}
// The 'fixed' part of the frame consists of the incoming parameters and
// the part described by InterpreterFrameConstants.
unsigned fixed_frame_size = ComputeInterpretedFixedSize(function);
unsigned fixed_frame_size = ComputeInterpretedFixedSize(shared);
unsigned input_frame_size = input_->GetFrameSize();
unsigned output_frame_size = height_in_bytes + fixed_frame_size;
......@@ -1084,8 +1088,7 @@ void Deoptimizer::DoComputeInterpretedFrame(int frame_index) {
output_frame->SetTop(top_address);
// Compute the incoming parameter translation.
int parameter_count =
function->shared()->internal_formal_parameter_count() + 1;
int parameter_count = shared->internal_formal_parameter_count() + 1;
unsigned output_offset = output_frame_size;
unsigned input_offset = input_frame_size;
for (int i = 0; i < parameter_count; ++i) {
......@@ -1981,7 +1984,12 @@ void Deoptimizer::DebugPrintOutputSlot(intptr_t value, int frame_index,
unsigned Deoptimizer::ComputeInputFrameSize() const {
unsigned fixed_size = ComputeJavascriptFixedSize(function_);
unsigned fixed_size = StandardFrameConstants::kFixedFrameSize;
if (!function_->IsSmi()) {
fixed_size += ComputeIncomingArgumentSize(function_->shared());
} else {
CHECK_EQ(Smi::cast(function_), Smi::FromInt(StackFrame::STUB));
}
// The fp-to-sp delta already takes the context, constant pool pointer and the
// function into account so we have to avoid double counting them.
unsigned result = fixed_size + fp_to_sp_delta_ -
......@@ -1995,34 +2003,26 @@ unsigned Deoptimizer::ComputeInputFrameSize() const {
return result;
}
unsigned Deoptimizer::ComputeJavascriptFixedSize(JSFunction* function) const {
// static
unsigned Deoptimizer::ComputeJavascriptFixedSize(SharedFunctionInfo* shared) {
// The fixed part of the frame consists of the return address, frame
// pointer, function, context, and all the incoming arguments.
return ComputeIncomingArgumentSize(function) +
return ComputeIncomingArgumentSize(shared) +
StandardFrameConstants::kFixedFrameSize;
}
unsigned Deoptimizer::ComputeInterpretedFixedSize(JSFunction* function) const {
// static
unsigned Deoptimizer::ComputeInterpretedFixedSize(SharedFunctionInfo* shared) {
// The fixed part of the frame consists of the return address, frame
// pointer, function, context, new.target, bytecode offset and all the
// incoming arguments.
return ComputeIncomingArgumentSize(function) +
return ComputeIncomingArgumentSize(shared) +
InterpreterFrameConstants::kFixedFrameSize;
}
unsigned Deoptimizer::ComputeIncomingArgumentSize(JSFunction* function) const {
// The incoming arguments is the values for formal parameters and
// the receiver. Every slot contains a pointer.
if (function->IsSmi()) {
CHECK_EQ(Smi::cast(function), Smi::FromInt(StackFrame::STUB));
return 0;
}
unsigned arguments =
function->shared()->internal_formal_parameter_count() + 1;
return arguments * kPointerSize;
// static
unsigned Deoptimizer::ComputeIncomingArgumentSize(SharedFunctionInfo* shared) {
return (shared->internal_formal_parameter_count() + 1) * kPointerSize;
}
......
......@@ -128,6 +128,11 @@ class TranslatedFrame {
Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
int height() const { return height_; }
SharedFunctionInfo* raw_shared_info() const {
CHECK_NOT_NULL(raw_shared_info_);
return raw_shared_info_;
}
class iterator {
public:
iterator& operator++() {
......@@ -611,10 +616,10 @@ class Deoptimizer : public Malloced {
const char* debug_hint_string);
unsigned ComputeInputFrameSize() const;
unsigned ComputeJavascriptFixedSize(JSFunction* function) const;
unsigned ComputeInterpretedFixedSize(JSFunction* function) const;
static unsigned ComputeJavascriptFixedSize(SharedFunctionInfo* shared);
static unsigned ComputeInterpretedFixedSize(SharedFunctionInfo* shared);
unsigned ComputeIncomingArgumentSize(JSFunction* function) const;
static unsigned ComputeIncomingArgumentSize(SharedFunctionInfo* shared);
static unsigned ComputeOutgoingArgumentSize(Code* code, unsigned bailout_id);
Object* ComputeLiteral(int index) const;
......@@ -656,7 +661,7 @@ class Deoptimizer : public Malloced {
// Determines whether the input frame contains alignment padding by looking
// at the dynamic alignment state slot inside the frame.
bool HasAlignmentPadding(JSFunction* function);
bool HasAlignmentPadding(SharedFunctionInfo* shared);
Isolate* isolate_;
JSFunction* function_;
......
......@@ -207,10 +207,8 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
int parameter_count =
function->shared()->internal_formal_parameter_count() + 1;
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
int parameter_count = shared->internal_formal_parameter_count() + 1;
unsigned input_frame_size = input_->GetFrameSize();
unsigned alignment_state_offset =
input_frame_size - parameter_count * kPointerSize -
......
......@@ -119,8 +119,7 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
// There is no dynamic alignment padding on MIPS in the input frame.
return false;
}
......
......@@ -119,8 +119,7 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
// There is no dynamic alignment padding on MIPS in the input frame.
return false;
}
......
......@@ -131,8 +131,7 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
// There is no dynamic alignment padding on PPC in the input frame.
return false;
}
......
......@@ -125,8 +125,7 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
// There is no dynamic alignment padding on x64 in the input frame.
return false;
}
......
......@@ -207,10 +207,8 @@ void Deoptimizer::CopyDoubleRegisters(FrameDescription* output_frame) {
}
}
bool Deoptimizer::HasAlignmentPadding(JSFunction* function) {
int parameter_count =
function->shared()->internal_formal_parameter_count() + 1;
bool Deoptimizer::HasAlignmentPadding(SharedFunctionInfo* shared) {
int parameter_count = shared->internal_formal_parameter_count() + 1;
unsigned input_frame_size = input_->GetFrameSize();
unsigned alignment_state_offset =
input_frame_size - parameter_count * kPointerSize -
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment