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
14namespace v8 {
15namespace internal {
16
17class LInstruction;
18class LPlatformChunk;
19
20class 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