17bf78cac0cd3cc662cad53ed642670f4f88c27d
[platform/upstream/nodejs.git] / deps / v8 / src / lithium-codegen.h
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::DeoptInfo& deopt_info);
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_