Home | History | Annotate | Download | only in src
      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_LITHIUM_CODEGEN_H_
      6 #define V8_LITHIUM_CODEGEN_H_
      7 
      8 #include "src/v8.h"
      9 
     10 #include "src/bailout-reason.h"
     11 #include "src/compiler.h"
     12 #include "src/deoptimizer.h"
     13 
     14 namespace v8 {
     15 namespace internal {
     16 
     17 class LInstruction;
     18 class LPlatformChunk;
     19 
     20 class LCodeGenBase BASE_EMBEDDED {
     21  public:
     22   LCodeGenBase(LChunk* chunk,
     23                MacroAssembler* assembler,
     24                CompilationInfo* info);
     25   virtual ~LCodeGenBase() {}
     26 
     27   // Simple accessors.
     28   MacroAssembler* masm() const { return masm_; }
     29   CompilationInfo* info() const { return info_; }
     30   Isolate* isolate() const { return info_->isolate(); }
     31   Factory* factory() const { return isolate()->factory(); }
     32   Heap* heap() const { return isolate()->heap(); }
     33   Zone* zone() const { return zone_; }
     34   LPlatformChunk* chunk() const { return chunk_; }
     35   HGraph* graph() const;
     36 
     37   void FPRINTF_CHECKING Comment(const char* format, ...);
     38   void DeoptComment(const Deoptimizer::Reason& reason);
     39 
     40   bool GenerateBody();
     41   virtual void GenerateBodyInstructionPre(LInstruction* instr) {}
     42   virtual void GenerateBodyInstructionPost(LInstruction* instr) {}
     43 
     44   virtual void EnsureSpaceForLazyDeopt(int space_needed) = 0;
     45   virtual void RecordAndWritePosition(int position) = 0;
     46 
     47   int GetNextEmittedBlock() const;
     48 
     49   void RegisterWeakObjectsInOptimizedCode(Handle<Code> code);
     50 
     51   // Check that an environment assigned via AssignEnvironment is actually being
     52   // used. Redundant assignments keep things alive longer than necessary, and
     53   // consequently lead to worse code, so it's important to minimize this.
     54   void CheckEnvironmentUsage();
     55 
     56  protected:
     57   enum Status {
     58     UNUSED,
     59     GENERATING,
     60     DONE,
     61     ABORTED
     62   };
     63 
     64   LPlatformChunk* const chunk_;
     65   MacroAssembler* const masm_;
     66   CompilationInfo* const info_;
     67   Zone* zone_;
     68   Status status_;
     69   int current_block_;
     70   int current_instruction_;
     71   const ZoneList<LInstruction*>* instructions_;
     72   int last_lazy_deopt_pc_;
     73 
     74   bool is_unused() const { return status_ == UNUSED; }
     75   bool is_generating() const { return status_ == GENERATING; }
     76   bool is_done() const { return status_ == DONE; }
     77   bool is_aborted() const { return status_ == ABORTED; }
     78 
     79   void Abort(BailoutReason reason);
     80   void Retry(BailoutReason reason);
     81 
     82   // Methods for code dependencies.
     83   void AddDeprecationDependency(Handle<Map> map);
     84   void AddStabilityDependency(Handle<Map> map);
     85 };
     86 
     87 
     88 } }  // namespace v8::internal
     89 
     90 #endif  // V8_LITHIUM_CODEGEN_H_
     91