1 // Copyright 2013 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_CRANKSHAFT_LITHIUM_CODEGEN_H_ 6 #define V8_CRANKSHAFT_LITHIUM_CODEGEN_H_ 7 8 #include "src/bailout-reason.h" 9 #include "src/compiler.h" 10 #include "src/deoptimizer.h" 11 12 namespace v8 { 13 namespace internal { 14 15 class HGraph; 16 class LChunk; 17 class LEnvironment; 18 class LInstruction; 19 class LPlatformChunk; 20 21 class LCodeGenBase BASE_EMBEDDED { 22 public: 23 LCodeGenBase(LChunk* chunk, 24 MacroAssembler* assembler, 25 CompilationInfo* info); ~LCodeGenBase()26 virtual ~LCodeGenBase() {} 27 28 // Simple accessors. masm()29 MacroAssembler* masm() const { return masm_; } info()30 CompilationInfo* info() const { return info_; } isolate()31 Isolate* isolate() const { return info_->isolate(); } factory()32 Factory* factory() const { return isolate()->factory(); } heap()33 Heap* heap() const { return isolate()->heap(); } zone()34 Zone* zone() const { return zone_; } chunk()35 LPlatformChunk* chunk() const { return chunk_; } 36 HGraph* graph() const; 37 38 void PRINTF_FORMAT(2, 3) Comment(const char* format, ...); 39 void DeoptComment(const Deoptimizer::DeoptInfo& deopt_info); 40 static Deoptimizer::DeoptInfo MakeDeoptInfo( 41 LInstruction* instr, Deoptimizer::DeoptReason deopt_reason, int deopt_id); 42 43 bool GenerateBody(); GenerateBodyInstructionPre(LInstruction * instr)44 virtual void GenerateBodyInstructionPre(LInstruction* instr) {} GenerateBodyInstructionPost(LInstruction * instr)45 virtual void GenerateBodyInstructionPost(LInstruction* instr) {} 46 47 virtual void EnsureSpaceForLazyDeopt(int space_needed) = 0; 48 virtual void RecordAndWritePosition(int position) = 0; 49 50 int GetNextEmittedBlock() const; 51 52 void RegisterWeakObjectsInOptimizedCode(Handle<Code> code); 53 54 void WriteTranslationFrame(LEnvironment* environment, 55 Translation* translation); 56 int DefineDeoptimizationLiteral(Handle<Object> literal); 57 58 void PopulateDeoptimizationData(Handle<Code> code); 59 void PopulateDeoptimizationLiteralsWithInlinedFunctions(); 60 61 // Check that an environment assigned via AssignEnvironment is actually being 62 // used. Redundant assignments keep things alive longer than necessary, and 63 // consequently lead to worse code, so it's important to minimize this. 64 void CheckEnvironmentUsage(); 65 66 protected: 67 enum Status { 68 UNUSED, 69 GENERATING, 70 DONE, 71 ABORTED 72 }; 73 74 LPlatformChunk* const chunk_; 75 MacroAssembler* const masm_; 76 CompilationInfo* const info_; 77 Zone* zone_; 78 Status status_; 79 int current_block_; 80 int current_instruction_; 81 const ZoneList<LInstruction*>* instructions_; 82 ZoneList<LEnvironment*> deoptimizations_; 83 ZoneList<Handle<Object> > deoptimization_literals_; 84 TranslationBuffer translations_; 85 int inlined_function_count_; 86 int last_lazy_deopt_pc_; 87 int osr_pc_offset_; 88 is_unused()89 bool is_unused() const { return status_ == UNUSED; } is_generating()90 bool is_generating() const { return status_ == GENERATING; } is_done()91 bool is_done() const { return status_ == DONE; } is_aborted()92 bool is_aborted() const { return status_ == ABORTED; } 93 94 void Abort(BailoutReason reason); 95 void Retry(BailoutReason reason); 96 97 // Methods for code dependencies. 98 void AddDeprecationDependency(Handle<Map> map); 99 void AddStabilityDependency(Handle<Map> map); 100 }; 101 102 103 } // namespace internal 104 } // namespace v8 105 106 #endif // V8_CRANKSHAFT_LITHIUM_CODEGEN_H_ 107