| Index: src/compiler.h
|
| diff --git a/src/compiler.h b/src/compiler.h
|
| index 9f0ad773d753a2614ea22f407925e22eea30ef51..5831e36f028c7d054c4777c3beab5e8325bd57bb 100644
|
| --- a/src/compiler.h
|
| +++ b/src/compiler.h
|
| @@ -9,12 +9,8 @@
|
|
|
| #include "src/allocation.h"
|
| #include "src/bailout-reason.h"
|
| -#include "src/compilation-dependencies.h"
|
| #include "src/contexts.h"
|
| -#include "src/frames.h"
|
| #include "src/isolate.h"
|
| -#include "src/source-position-table.h"
|
| -#include "src/source-position.h"
|
| #include "src/zone.h"
|
|
|
| namespace v8 {
|
| @@ -141,391 +137,6 @@ class Compiler : public AllStatic {
|
| JavaScriptFrame* osr_frame);
|
| };
|
|
|
| -
|
| -// CompilationInfo encapsulates some information known at compile time. It
|
| -// is constructed based on the resources available at compile-time.
|
| -class CompilationInfo final {
|
| - public:
|
| - // Various configuration flags for a compilation, as well as some properties
|
| - // of the compiled code produced by a compilation.
|
| - enum Flag {
|
| - kDeferredCalling = 1 << 0,
|
| - kNonDeferredCalling = 1 << 1,
|
| - kSavesCallerDoubles = 1 << 2,
|
| - kRequiresFrame = 1 << 3,
|
| - kMustNotHaveEagerFrame = 1 << 4,
|
| - kDeoptimizationSupport = 1 << 5,
|
| - kDebug = 1 << 6,
|
| - kSerializing = 1 << 7,
|
| - kFunctionContextSpecializing = 1 << 8,
|
| - kFrameSpecializing = 1 << 9,
|
| - kNativeContextSpecializing = 1 << 10,
|
| - kInliningEnabled = 1 << 11,
|
| - kDisableFutureOptimization = 1 << 12,
|
| - kSplittingEnabled = 1 << 13,
|
| - kDeoptimizationEnabled = 1 << 14,
|
| - kSourcePositionsEnabled = 1 << 15,
|
| - kBailoutOnUninitialized = 1 << 16,
|
| - kOptimizeFromBytecode = 1 << 17,
|
| - kTypeFeedbackEnabled = 1 << 18,
|
| - kAccessorInliningEnabled = 1 << 19,
|
| - };
|
| -
|
| - CompilationInfo(ParseInfo* parse_info, Handle<JSFunction> closure);
|
| - CompilationInfo(Vector<const char> debug_name, Isolate* isolate, Zone* zone,
|
| - Code::Flags code_flags);
|
| - ~CompilationInfo();
|
| -
|
| - ParseInfo* parse_info() const { return parse_info_; }
|
| -
|
| - // -----------------------------------------------------------
|
| - // TODO(titzer): inline and delete accessors of ParseInfo
|
| - // -----------------------------------------------------------
|
| - Handle<Script> script() const;
|
| - FunctionLiteral* literal() const;
|
| - DeclarationScope* scope() const;
|
| - Handle<Context> context() const;
|
| - Handle<SharedFunctionInfo> shared_info() const;
|
| - bool has_shared_info() const;
|
| - // -----------------------------------------------------------
|
| -
|
| - Isolate* isolate() const {
|
| - return isolate_;
|
| - }
|
| - Zone* zone() { return zone_; }
|
| - bool is_osr() const { return !osr_ast_id_.IsNone(); }
|
| - Handle<JSFunction> closure() const { return closure_; }
|
| - Handle<Code> code() const { return code_; }
|
| - Code::Flags code_flags() const { return code_flags_; }
|
| - BailoutId osr_ast_id() const { return osr_ast_id_; }
|
| - JavaScriptFrame* osr_frame() const { return osr_frame_; }
|
| - int num_parameters() const;
|
| - int num_parameters_including_this() const;
|
| - bool is_this_defined() const;
|
| -
|
| - void set_parameter_count(int parameter_count) {
|
| - DCHECK(IsStub());
|
| - parameter_count_ = parameter_count;
|
| - }
|
| -
|
| - bool has_bytecode_array() const { return !bytecode_array_.is_null(); }
|
| - Handle<BytecodeArray> bytecode_array() const { return bytecode_array_; }
|
| -
|
| - bool is_tracking_positions() const { return track_positions_; }
|
| -
|
| - bool is_calling() const {
|
| - return GetFlag(kDeferredCalling) || GetFlag(kNonDeferredCalling);
|
| - }
|
| -
|
| - void MarkAsDeferredCalling() { SetFlag(kDeferredCalling); }
|
| -
|
| - bool is_deferred_calling() const { return GetFlag(kDeferredCalling); }
|
| -
|
| - void MarkAsNonDeferredCalling() { SetFlag(kNonDeferredCalling); }
|
| -
|
| - bool is_non_deferred_calling() const { return GetFlag(kNonDeferredCalling); }
|
| -
|
| - void MarkAsSavesCallerDoubles() { SetFlag(kSavesCallerDoubles); }
|
| -
|
| - bool saves_caller_doubles() const { return GetFlag(kSavesCallerDoubles); }
|
| -
|
| - void MarkAsRequiresFrame() { SetFlag(kRequiresFrame); }
|
| -
|
| - bool requires_frame() const { return GetFlag(kRequiresFrame); }
|
| -
|
| - void MarkMustNotHaveEagerFrame() { SetFlag(kMustNotHaveEagerFrame); }
|
| -
|
| - bool GetMustNotHaveEagerFrame() const {
|
| - return GetFlag(kMustNotHaveEagerFrame);
|
| - }
|
| -
|
| - // Compiles marked as debug produce unoptimized code with debug break slots.
|
| - // Inner functions that cannot be compiled w/o context are compiled eagerly.
|
| - // Always include deoptimization support to avoid having to recompile again.
|
| - void MarkAsDebug() {
|
| - SetFlag(kDebug);
|
| - SetFlag(kDeoptimizationSupport);
|
| - }
|
| -
|
| - bool is_debug() const { return GetFlag(kDebug); }
|
| -
|
| - void PrepareForSerializing() { SetFlag(kSerializing); }
|
| -
|
| - bool will_serialize() const { return GetFlag(kSerializing); }
|
| -
|
| - void MarkAsFunctionContextSpecializing() {
|
| - SetFlag(kFunctionContextSpecializing);
|
| - }
|
| -
|
| - bool is_function_context_specializing() const {
|
| - return GetFlag(kFunctionContextSpecializing);
|
| - }
|
| -
|
| - void MarkAsFrameSpecializing() { SetFlag(kFrameSpecializing); }
|
| -
|
| - bool is_frame_specializing() const { return GetFlag(kFrameSpecializing); }
|
| -
|
| - void MarkAsNativeContextSpecializing() {
|
| - SetFlag(kNativeContextSpecializing);
|
| - }
|
| -
|
| - bool is_native_context_specializing() const {
|
| - return GetFlag(kNativeContextSpecializing);
|
| - }
|
| -
|
| - void MarkAsDeoptimizationEnabled() { SetFlag(kDeoptimizationEnabled); }
|
| -
|
| - bool is_deoptimization_enabled() const {
|
| - return GetFlag(kDeoptimizationEnabled);
|
| - }
|
| -
|
| - void MarkAsTypeFeedbackEnabled() { SetFlag(kTypeFeedbackEnabled); }
|
| -
|
| - bool is_type_feedback_enabled() const {
|
| - return GetFlag(kTypeFeedbackEnabled);
|
| - }
|
| -
|
| - void MarkAsAccessorInliningEnabled() { SetFlag(kAccessorInliningEnabled); }
|
| -
|
| - bool is_accessor_inlining_enabled() const {
|
| - return GetFlag(kAccessorInliningEnabled);
|
| - }
|
| -
|
| - void MarkAsSourcePositionsEnabled() { SetFlag(kSourcePositionsEnabled); }
|
| -
|
| - bool is_source_positions_enabled() const {
|
| - return GetFlag(kSourcePositionsEnabled);
|
| - }
|
| -
|
| - void MarkAsInliningEnabled() { SetFlag(kInliningEnabled); }
|
| -
|
| - bool is_inlining_enabled() const { return GetFlag(kInliningEnabled); }
|
| -
|
| - void MarkAsSplittingEnabled() { SetFlag(kSplittingEnabled); }
|
| -
|
| - bool is_splitting_enabled() const { return GetFlag(kSplittingEnabled); }
|
| -
|
| - void MarkAsBailoutOnUninitialized() { SetFlag(kBailoutOnUninitialized); }
|
| -
|
| - bool is_bailout_on_uninitialized() const {
|
| - return GetFlag(kBailoutOnUninitialized);
|
| - }
|
| -
|
| - void MarkAsOptimizeFromBytecode() { SetFlag(kOptimizeFromBytecode); }
|
| -
|
| - bool is_optimizing_from_bytecode() const {
|
| - return GetFlag(kOptimizeFromBytecode);
|
| - }
|
| -
|
| - bool GeneratePreagedPrologue() const {
|
| - // Generate a pre-aged prologue if we are optimizing for size, which
|
| - // will make code flushing more aggressive. Only apply to Code::FUNCTION,
|
| - // since StaticMarkingVisitor::IsFlushable only flushes proper functions.
|
| - return FLAG_optimize_for_size && FLAG_age_code && !is_debug() &&
|
| - output_code_kind() == Code::FUNCTION;
|
| - }
|
| -
|
| - void SetCode(Handle<Code> code) { code_ = code; }
|
| -
|
| - void SetBytecodeArray(Handle<BytecodeArray> bytecode_array) {
|
| - bytecode_array_ = bytecode_array;
|
| - }
|
| -
|
| - bool ShouldTrapOnDeopt() const {
|
| - return (FLAG_trap_on_deopt && IsOptimizing()) ||
|
| - (FLAG_trap_on_stub_deopt && IsStub());
|
| - }
|
| -
|
| - bool has_native_context() const;
|
| - Context* native_context() const;
|
| -
|
| - bool has_global_object() const;
|
| - JSGlobalObject* global_object() const;
|
| -
|
| - // Accessors for the different compilation modes.
|
| - bool IsOptimizing() const { return mode_ == OPTIMIZE; }
|
| - bool IsStub() const { return mode_ == STUB; }
|
| - void SetOptimizing() {
|
| - DCHECK(has_shared_info());
|
| - SetMode(OPTIMIZE);
|
| - optimization_id_ = isolate()->NextOptimizationId();
|
| - code_flags_ =
|
| - Code::KindField::update(code_flags_, Code::OPTIMIZED_FUNCTION);
|
| - }
|
| - void SetOptimizingForOsr(BailoutId osr_ast_id, JavaScriptFrame* osr_frame) {
|
| - SetOptimizing();
|
| - osr_ast_id_ = osr_ast_id;
|
| - osr_frame_ = osr_frame;
|
| - }
|
| -
|
| - // Deoptimization support.
|
| - bool HasDeoptimizationSupport() const {
|
| - return GetFlag(kDeoptimizationSupport);
|
| - }
|
| - void EnableDeoptimizationSupport() {
|
| - DCHECK_EQ(BASE, mode_);
|
| - SetFlag(kDeoptimizationSupport);
|
| - }
|
| - bool ShouldEnsureSpaceForLazyDeopt() { return !IsStub(); }
|
| -
|
| - bool ExpectsJSReceiverAsReceiver();
|
| -
|
| - // Determines whether or not to insert a self-optimization header.
|
| - bool ShouldSelfOptimize();
|
| -
|
| - void set_deferred_handles(DeferredHandles* deferred_handles) {
|
| - DCHECK(deferred_handles_ == NULL);
|
| - deferred_handles_ = deferred_handles;
|
| - }
|
| -
|
| - void ReopenHandlesInNewHandleScope();
|
| -
|
| - void AbortOptimization(BailoutReason reason) {
|
| - DCHECK(reason != kNoReason);
|
| - if (bailout_reason_ == kNoReason) bailout_reason_ = reason;
|
| - SetFlag(kDisableFutureOptimization);
|
| - }
|
| -
|
| - void RetryOptimization(BailoutReason reason) {
|
| - DCHECK(reason != kNoReason);
|
| - if (GetFlag(kDisableFutureOptimization)) return;
|
| - bailout_reason_ = reason;
|
| - }
|
| -
|
| - BailoutReason bailout_reason() const { return bailout_reason_; }
|
| -
|
| - int prologue_offset() const {
|
| - DCHECK_NE(Code::kPrologueOffsetNotSet, prologue_offset_);
|
| - return prologue_offset_;
|
| - }
|
| -
|
| - void set_prologue_offset(int prologue_offset) {
|
| - DCHECK_EQ(Code::kPrologueOffsetNotSet, prologue_offset_);
|
| - prologue_offset_ = prologue_offset;
|
| - }
|
| -
|
| - CompilationDependencies* dependencies() { return &dependencies_; }
|
| -
|
| - int optimization_id() const { return optimization_id_; }
|
| -
|
| - int osr_expr_stack_height() { return osr_expr_stack_height_; }
|
| - void set_osr_expr_stack_height(int height) {
|
| - DCHECK(height >= 0);
|
| - osr_expr_stack_height_ = height;
|
| - }
|
| -
|
| - bool has_simple_parameters();
|
| -
|
| - struct InlinedFunctionHolder {
|
| - Handle<SharedFunctionInfo> shared_info;
|
| -
|
| - // Root that holds the unoptimized code of the inlined function alive
|
| - // (and out of reach of code flushing) until we finish compilation.
|
| - // Do not remove.
|
| - Handle<Code> inlined_code_object_root;
|
| -
|
| - InlinedFunctionHolder(Handle<SharedFunctionInfo> inlined_shared_info,
|
| - Handle<Code> inlined_code_object_root)
|
| - : shared_info(inlined_shared_info),
|
| - inlined_code_object_root(inlined_code_object_root) {}
|
| - };
|
| -
|
| - typedef std::vector<InlinedFunctionHolder> InlinedFunctionList;
|
| - InlinedFunctionList const& inlined_functions() const {
|
| - return inlined_functions_;
|
| - }
|
| -
|
| - void AddInlinedFunction(Handle<SharedFunctionInfo> inlined_function);
|
| -
|
| - std::unique_ptr<char[]> GetDebugName() const;
|
| -
|
| - Code::Kind output_code_kind() const;
|
| -
|
| - StackFrame::Type GetOutputStackFrameType() const;
|
| -
|
| - int GetDeclareGlobalsFlags() const;
|
| -
|
| - SourcePositionTableBuilder::RecordingMode SourcePositionRecordingMode() const;
|
| -
|
| - private:
|
| - // Compilation mode.
|
| - // BASE is generated by the full codegen, optionally prepared for bailouts.
|
| - // OPTIMIZE is optimized code generated by the Hydrogen-based backend.
|
| - enum Mode {
|
| - BASE,
|
| - OPTIMIZE,
|
| - STUB
|
| - };
|
| -
|
| - CompilationInfo(ParseInfo* parse_info, Vector<const char> debug_name,
|
| - Code::Flags code_flags, Mode mode, Isolate* isolate,
|
| - Zone* zone);
|
| -
|
| - ParseInfo* parse_info_;
|
| - Isolate* isolate_;
|
| -
|
| - void SetMode(Mode mode) {
|
| - mode_ = mode;
|
| - }
|
| -
|
| - void SetFlag(Flag flag) { flags_ |= flag; }
|
| -
|
| - void SetFlag(Flag flag, bool value) {
|
| - flags_ = value ? flags_ | flag : flags_ & ~flag;
|
| - }
|
| -
|
| - bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; }
|
| -
|
| - unsigned flags_;
|
| -
|
| - Code::Flags code_flags_;
|
| -
|
| - Handle<JSFunction> closure_;
|
| -
|
| - // The compiled code.
|
| - Handle<Code> code_;
|
| -
|
| - // Compilation mode flag and whether deoptimization is allowed.
|
| - Mode mode_;
|
| - BailoutId osr_ast_id_;
|
| -
|
| - // Holds the bytecode array generated by the interpreter.
|
| - // TODO(rmcilroy/mstarzinger): Temporary work-around until compiler.cc is
|
| - // refactored to avoid us needing to carry the BytcodeArray around.
|
| - Handle<BytecodeArray> bytecode_array_;
|
| -
|
| - // The zone from which the compilation pipeline working on this
|
| - // CompilationInfo allocates.
|
| - Zone* zone_;
|
| -
|
| - DeferredHandles* deferred_handles_;
|
| -
|
| - // Dependencies for this compilation, e.g. stable maps.
|
| - CompilationDependencies dependencies_;
|
| -
|
| - BailoutReason bailout_reason_;
|
| -
|
| - int prologue_offset_;
|
| -
|
| - bool track_positions_;
|
| -
|
| - InlinedFunctionList inlined_functions_;
|
| -
|
| - // Number of parameters used for compilation of stubs that require arguments.
|
| - int parameter_count_;
|
| -
|
| - int optimization_id_;
|
| -
|
| - int osr_expr_stack_height_;
|
| -
|
| - // The current OSR frame for specialization or {nullptr}.
|
| - JavaScriptFrame* osr_frame_ = nullptr;
|
| -
|
| - Vector<const char> debug_name_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CompilationInfo);
|
| -};
|
| -
|
| // A base class for compilation jobs intended to run concurrent to the main
|
| // thread. The job is split into three phases which are called in sequence on
|
| // different threads and with different limitations:
|
| @@ -567,21 +178,11 @@ class CompilationJob {
|
|
|
| // Report a transient failure, try again next time. Should only be called on
|
| // optimization compilation jobs.
|
| - Status RetryOptimization(BailoutReason reason) {
|
| - DCHECK(info_->IsOptimizing());
|
| - info_->RetryOptimization(reason);
|
| - state_ = State::kFailed;
|
| - return FAILED;
|
| - }
|
| + Status RetryOptimization(BailoutReason reason);
|
|
|
| // Report a persistent failure, disable future optimization on the function.
|
| // Should only be called on optimization compilation jobs.
|
| - Status AbortOptimization(BailoutReason reason) {
|
| - DCHECK(info_->IsOptimizing());
|
| - info_->AbortOptimization(reason);
|
| - state_ = State::kFailed;
|
| - return FAILED;
|
| - }
|
| + Status AbortOptimization(BailoutReason reason);
|
|
|
| void RecordOptimizedCompilationStats() const;
|
| void RecordUnoptimizedCompilationStats() const;
|
| @@ -593,7 +194,7 @@ class CompilationJob {
|
|
|
| State state() const { return state_; }
|
| CompilationInfo* info() const { return info_; }
|
| - Isolate* isolate() const { return info()->isolate(); }
|
| + Isolate* isolate() const;
|
|
|
| protected:
|
| // Overridden by the actual implementation.
|
|
|