• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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);
~LCodeGenBase()25    virtual ~LCodeGenBase() {}
26  
27    // Simple accessors.
masm()28    MacroAssembler* masm() const { return masm_; }
info()29    CompilationInfo* info() const { return info_; }
isolate()30    Isolate* isolate() const { return info_->isolate(); }
factory()31    Factory* factory() const { return isolate()->factory(); }
heap()32    Heap* heap() const { return isolate()->heap(); }
zone()33    Zone* zone() const { return zone_; }
chunk()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();
GenerateBodyInstructionPre(LInstruction * instr)41    virtual void GenerateBodyInstructionPre(LInstruction* instr) {}
GenerateBodyInstructionPost(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  
is_unused()74    bool is_unused() const { return status_ == UNUSED; }
is_generating()75    bool is_generating() const { return status_ == GENERATING; }
is_done()76    bool is_done() const { return status_ == DONE; }
is_aborted()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