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