Commit e396f538 authored by svenpanne's avatar svenpanne Committed by Commit bot

Some CompilationInfo-related cleanup.

Use a delegating constructor for CompilationInfo, reducing duplicated
code. Simplified handling of InlinedFunctionInfos on the way: When we
start compiling, we have bigger things to worry about than a default
vector.

Reduced the usage of a SharedFunctionInfo for compiling, this is a
slighty strange concept.

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

Cr-Commit-Position: refs/heads/master@{#27299}
parent 5d8e3bfa
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "src/v8.h"
#include "src/compiler.h" #include "src/compiler.h"
#include <algorithm>
#include "src/ast-numbering.h" #include "src/ast-numbering.h"
#include "src/bootstrapper.h" #include "src/bootstrapper.h"
#include "src/codegen.h" #include "src/codegen.h"
...@@ -81,57 +81,8 @@ bool CompilationInfo::has_shared_info() const { ...@@ -81,57 +81,8 @@ bool CompilationInfo::has_shared_info() const {
CompilationInfo::CompilationInfo(ParseInfo* parse_info) CompilationInfo::CompilationInfo(ParseInfo* parse_info)
: parse_info_(parse_info), : CompilationInfo(parse_info, nullptr, BASE, parse_info->isolate(),
flags_(0), parse_info->zone()) {
osr_ast_id_(BailoutId::None()),
parameter_count_(0),
optimization_id_(-1),
aborted_due_to_dependency_change_(false),
osr_expr_stack_height_(0) {
Initialize(parse_info->isolate(), BASE, parse_info->zone());
}
CompilationInfo::CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone)
: parse_info_(nullptr),
flags_(0),
osr_ast_id_(BailoutId::None()),
parameter_count_(0),
optimization_id_(-1),
aborted_due_to_dependency_change_(false),
osr_expr_stack_height_(0) {
Initialize(isolate, STUB, zone);
code_stub_ = stub;
}
void CompilationInfo::Initialize(Isolate* isolate,
Mode mode,
Zone* zone) {
isolate_ = isolate;
zone_ = zone;
deferred_handles_ = NULL;
code_stub_ = NULL;
prologue_offset_ = Code::kPrologueOffsetNotSet;
opt_count_ = has_shared_info() ? shared_info()->opt_count() : 0;
no_frame_ranges_ = isolate->cpu_profiler()->is_profiling()
? new List<OffsetRange>(2) : NULL;
if (FLAG_hydrogen_track_positions) {
inlined_function_infos_ = new std::vector<InlinedFunctionInfo>();
track_positions_ = true;
} else {
inlined_function_infos_ = NULL;
track_positions_ = false;
}
for (int i = 0; i < DependentCode::kGroupCount; i++) {
dependencies_[i] = NULL;
}
if (mode == STUB) {
mode_ = STUB;
return;
}
mode_ = mode;
// Compiling for the snapshot typically results in different code than // Compiling for the snapshot typically results in different code than
// compiling later on. This means that code recompiled with deoptimization // compiling later on. This means that code recompiled with deoptimization
// support won't be "equivalent" (as defined by SharedFunctionInfo:: // support won't be "equivalent" (as defined by SharedFunctionInfo::
...@@ -147,22 +98,48 @@ void CompilationInfo::Initialize(Isolate* isolate, ...@@ -147,22 +98,48 @@ void CompilationInfo::Initialize(Isolate* isolate,
if (FLAG_turbo_splitting) MarkAsSplittingEnabled(); if (FLAG_turbo_splitting) MarkAsSplittingEnabled();
if (FLAG_turbo_types) MarkAsTypingEnabled(); if (FLAG_turbo_types) MarkAsTypingEnabled();
bailout_reason_ = kNoReason;
if (has_shared_info() && shared_info()->is_compiled()) { if (has_shared_info() && shared_info()->is_compiled()) {
// We should initialize the CompilationInfo feedback vector from the // We should initialize the CompilationInfo feedback vector from the
// passed in shared info, rather than creating a new one. // passed in shared info, rather than creating a new one.
feedback_vector_ = feedback_vector_ = Handle<TypeFeedbackVector>(
Handle<TypeFeedbackVector>(shared_info()->feedback_vector(), isolate); shared_info()->feedback_vector(), parse_info->isolate());
} }
} }
CompilationInfo::CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone)
: CompilationInfo(nullptr, stub, STUB, isolate, zone) {}
CompilationInfo::CompilationInfo(ParseInfo* parse_info, CodeStub* code_stub,
Mode mode, Isolate* isolate, Zone* zone)
: parse_info_(parse_info),
isolate_(isolate),
flags_(0),
code_stub_(code_stub),
mode_(mode),
osr_ast_id_(BailoutId::None()),
zone_(zone),
deferred_handles_(nullptr),
bailout_reason_(kNoReason),
prologue_offset_(Code::kPrologueOffsetNotSet),
no_frame_ranges_(isolate->cpu_profiler()->is_profiling()
? new List<OffsetRange>(2)
: nullptr),
track_positions_(FLAG_hydrogen_track_positions),
opt_count_(has_shared_info() ? shared_info()->opt_count() : 0),
parameter_count_(0),
optimization_id_(-1),
aborted_due_to_dependency_change_(false),
osr_expr_stack_height_(0) {
std::fill_n(dependencies_, DependentCode::kGroupCount, nullptr);
}
CompilationInfo::~CompilationInfo() { CompilationInfo::~CompilationInfo() {
DisableFutureOptimization(); DisableFutureOptimization();
delete deferred_handles_; delete deferred_handles_;
delete no_frame_ranges_; delete no_frame_ranges_;
delete inlined_function_infos_;
#ifdef DEBUG #ifdef DEBUG
// Check that no dependent maps have been added or added dependent maps have // Check that no dependent maps have been added or added dependent maps have
// been rolled back or committed. // been rolled back or committed.
...@@ -267,9 +244,8 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, ...@@ -267,9 +244,8 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
SourcePosition position, SourcePosition position,
int parent_id) { int parent_id) {
DCHECK(track_positions_); DCHECK(track_positions_);
DCHECK(inlined_function_infos_);
int inline_id = static_cast<int>(inlined_function_infos_->size()); int inline_id = static_cast<int>(inlined_function_infos_.size());
InlinedFunctionInfo info(parent_id, position, UnboundScript::kNoScriptId, InlinedFunctionInfo info(parent_id, position, UnboundScript::kNoScriptId,
shared->start_position()); shared->start_position());
if (!shared->script()->IsUndefined()) { if (!shared->script()->IsUndefined()) {
...@@ -296,7 +272,7 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, ...@@ -296,7 +272,7 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
} }
} }
inlined_function_infos_->push_back(info); inlined_function_infos_.push_back(info);
if (FLAG_hydrogen_track_positions && inline_id != 0) { if (FLAG_hydrogen_track_positions && inline_id != 0) {
CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
...@@ -312,9 +288,8 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared, ...@@ -312,9 +288,8 @@ int CompilationInfo::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
void CompilationInfo::LogDeoptCallPosition(int pc_offset, int inlining_id) { void CompilationInfo::LogDeoptCallPosition(int pc_offset, int inlining_id) {
if (!track_positions_ || IsStub()) return; if (!track_positions_ || IsStub()) return;
DCHECK_LT(static_cast<size_t>(inlining_id), inlined_function_infos_->size()); DCHECK_LT(static_cast<size_t>(inlining_id), inlined_function_infos_.size());
inlined_function_infos_->at(inlining_id) inlined_function_infos_.at(inlining_id).deopt_pc_offsets.push_back(pc_offset);
.deopt_pc_offsets.push_back(pc_offset);
} }
...@@ -926,7 +901,9 @@ MaybeHandle<Code> Compiler::GetUnoptimizedCode( ...@@ -926,7 +901,9 @@ MaybeHandle<Code> Compiler::GetUnoptimizedCode(
DCHECK(!shared->GetIsolate()->has_pending_exception()); DCHECK(!shared->GetIsolate()->has_pending_exception());
DCHECK(!shared->is_compiled()); DCHECK(!shared->is_compiled());
CompilationInfoWithZone info(shared); Zone zone;
ParseInfo parse_info(&zone, shared);
CompilationInfo info(&parse_info);
return GetUnoptimizedCodeCommon(&info); return GetUnoptimizedCodeCommon(&info);
} }
...@@ -953,10 +930,10 @@ bool Compiler::EnsureCompiled(Handle<JSFunction> function, ...@@ -953,10 +930,10 @@ bool Compiler::EnsureCompiled(Handle<JSFunction> function,
bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) {
DCHECK(info->function() != NULL); DCHECK(info->function() != NULL);
DCHECK(info->scope() != NULL); DCHECK(info->scope() != NULL);
if (!info->shared_info()->has_deoptimization_support()) {
// TODO(titzer): just reuse the ParseInfo for the unoptimized compile.
Handle<SharedFunctionInfo> shared = info->shared_info(); Handle<SharedFunctionInfo> shared = info->shared_info();
CompilationInfoWithZone unoptimized(shared); if (!shared->has_deoptimization_support()) {
// TODO(titzer): just reuse the ParseInfo for the unoptimized compile.
CompilationInfoWithZone unoptimized(info->closure());
// Note that we use the same AST that we will use for generating the // Note that we use the same AST that we will use for generating the
// optimized code. // optimized code.
ParseInfo* parse_info = unoptimized.parse_info(); ParseInfo* parse_info = unoptimized.parse_info();
...@@ -1581,11 +1558,6 @@ CompilationInfoWithZone::CompilationInfoWithZone(Handle<JSFunction> function) ...@@ -1581,11 +1558,6 @@ CompilationInfoWithZone::CompilationInfoWithZone(Handle<JSFunction> function)
: CompilationInfo(new ParseInfo(&zone_, function)) {} : CompilationInfo(new ParseInfo(&zone_, function)) {}
CompilationInfoWithZone::CompilationInfoWithZone(
Handle<SharedFunctionInfo> shared_info)
: CompilationInfo(new ParseInfo(&zone_, shared_info)) {}
CompilationInfoWithZone::~CompilationInfoWithZone() { CompilationInfoWithZone::~CompilationInfoWithZone() {
DisableFutureOptimization(); DisableFutureOptimization();
RollbackDependencies(); RollbackDependencies();
......
...@@ -346,13 +346,8 @@ class CompilationInfo { ...@@ -346,13 +346,8 @@ class CompilationInfo {
return result; return result;
} }
std::vector<InlinedFunctionInfo>* inlined_function_infos() { int start_position_for(uint32_t inlining_id) {
return inlined_function_infos_; return inlined_function_infos_.at(inlining_id).start_position;
}
std::vector<InlinedFunctionInfo>* ReleaseInlinedFunctionInfos() {
std::vector<InlinedFunctionInfo>* tmp = inlined_function_infos_;
inlined_function_infos_ = NULL;
return tmp;
} }
void LogDeoptCallPosition(int pc_offset, int inlining_id); void LogDeoptCallPosition(int pc_offset, int inlining_id);
...@@ -405,8 +400,6 @@ class CompilationInfo { ...@@ -405,8 +400,6 @@ class CompilationInfo {
} }
private: private:
Isolate* isolate_;
// Compilation mode. // Compilation mode.
// BASE is generated by the full codegen, optionally prepared for bailouts. // BASE is generated by the full codegen, optionally prepared for bailouts.
// OPTIMIZE is optimized code generated by the Hydrogen-based backend. // OPTIMIZE is optimized code generated by the Hydrogen-based backend.
...@@ -419,7 +412,10 @@ class CompilationInfo { ...@@ -419,7 +412,10 @@ class CompilationInfo {
STUB STUB
}; };
void Initialize(Isolate* isolate, Mode mode, Zone* zone); CompilationInfo(ParseInfo* parse_info, CodeStub* code_stub, Mode mode,
Isolate* isolate, Zone* zone);
Isolate* isolate_;
void SetMode(Mode mode) { void SetMode(Mode mode) {
mode_ = mode; mode_ = mode;
...@@ -464,7 +460,7 @@ class CompilationInfo { ...@@ -464,7 +460,7 @@ class CompilationInfo {
int prologue_offset_; int prologue_offset_;
List<OffsetRange>* no_frame_ranges_; List<OffsetRange>* no_frame_ranges_;
std::vector<InlinedFunctionInfo>* inlined_function_infos_; std::vector<InlinedFunctionInfo> inlined_function_infos_;
bool track_positions_; bool track_positions_;
// A copy of shared_info()->opt_count() to avoid handle deref // A copy of shared_info()->opt_count() to avoid handle deref
...@@ -493,7 +489,6 @@ class CompilationInfo { ...@@ -493,7 +489,6 @@ class CompilationInfo {
class CompilationInfoWithZone: public CompilationInfo { class CompilationInfoWithZone: public CompilationInfo {
public: public:
explicit CompilationInfoWithZone(Handle<Script> script); explicit CompilationInfoWithZone(Handle<Script> script);
explicit CompilationInfoWithZone(Handle<SharedFunctionInfo> shared_info);
explicit CompilationInfoWithZone(Handle<JSFunction> closure); explicit CompilationInfoWithZone(Handle<JSFunction> closure);
CompilationInfoWithZone(CodeStub* stub, Isolate* isolate) CompilationInfoWithZone(CodeStub* stub, Isolate* isolate)
: CompilationInfo(stub, isolate, &zone_) {} : CompilationInfo(stub, isolate, &zone_) {}
......
...@@ -3482,12 +3482,9 @@ void HGraph::FinalizeUniqueness() { ...@@ -3482,12 +3482,9 @@ void HGraph::FinalizeUniqueness() {
int HGraph::SourcePositionToScriptPosition(SourcePosition pos) { int HGraph::SourcePositionToScriptPosition(SourcePosition pos) {
if (!FLAG_hydrogen_track_positions || pos.IsUnknown()) { return (info()->is_tracking_positions() && !pos.IsUnknown())
return pos.raw(); ? info()->start_position_for(pos.inlining_id()) + pos.position()
} : pos.raw();
return info()->inlined_function_infos()->at(pos.inlining_id())
.start_position + pos.position();
} }
......
...@@ -27,8 +27,9 @@ class ParseInfo { ...@@ -27,8 +27,9 @@ class ParseInfo {
public: public:
explicit ParseInfo(Zone* zone); explicit ParseInfo(Zone* zone);
ParseInfo(Zone* zone, Handle<JSFunction> function); ParseInfo(Zone* zone, Handle<JSFunction> function);
ParseInfo(Zone* zone, Handle<SharedFunctionInfo> shared);
ParseInfo(Zone* zone, Handle<Script> script); ParseInfo(Zone* zone, Handle<Script> script);
// TODO(all) Only used via Debug::FindSharedFunctionInfoInScript, remove?
ParseInfo(Zone* zone, Handle<SharedFunctionInfo> shared);
~ParseInfo() { ~ParseInfo() {
if (ast_value_factory_owned()) { if (ast_value_factory_owned()) {
......
...@@ -1218,7 +1218,7 @@ class ScopeIterator { ...@@ -1218,7 +1218,7 @@ class ScopeIterator {
RetrieveScopeChain(scope, shared_info); RetrieveScopeChain(scope, shared_info);
} else { } else {
// Function code // Function code
ParseInfo info(&zone, shared_info); ParseInfo info(&zone, function_);
if (Parser::ParseStatic(&info) && Scope::Analyze(&info)) { if (Parser::ParseStatic(&info) && Scope::Analyze(&info)) {
scope = info.function()->scope(); scope = info.function()->scope();
} }
......
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