• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 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_REGISTER_ALLOCATOR_VERIFIER_H_
6 #define V8_REGISTER_ALLOCATOR_VERIFIER_H_
7 
8 #include "src/zone-containers.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13 
14 class InstructionOperand;
15 class InstructionSequence;
16 
17 class RegisterAllocatorVerifier final : public ZoneObject {
18  public:
19   RegisterAllocatorVerifier(Zone* zone, const RegisterConfiguration* config,
20                             const InstructionSequence* sequence);
21 
22   void VerifyAssignment();
23   void VerifyGapMoves();
24 
25  private:
26   enum ConstraintType {
27     kConstant,
28     kImmediate,
29     kRegister,
30     kFixedRegister,
31     kDoubleRegister,
32     kFixedDoubleRegister,
33     kSlot,
34     kDoubleSlot,
35     kFixedSlot,
36     kNone,
37     kNoneDouble,
38     kExplicit,
39     kSameAsFirst,
40     kRegisterAndSlot
41   };
42 
43   struct OperandConstraint {
44     ConstraintType type_;
45     int value_;  // subkind index when relevant
46     int spilled_slot_;
47     int virtual_register_;
48   };
49 
50   struct InstructionConstraint {
51     const Instruction* instruction_;
52     size_t operand_constaints_size_;
53     OperandConstraint* operand_constraints_;
54   };
55 
56   class BlockMaps;
57 
58   typedef ZoneVector<InstructionConstraint> Constraints;
59 
zone()60   Zone* zone() const { return zone_; }
config()61   const RegisterConfiguration* config() { return config_; }
sequence()62   const InstructionSequence* sequence() const { return sequence_; }
constraints()63   Constraints* constraints() { return &constraints_; }
64 
65   static void VerifyInput(const OperandConstraint& constraint);
66   static void VerifyTemp(const OperandConstraint& constraint);
67   static void VerifyOutput(const OperandConstraint& constraint);
68 
69   void BuildConstraint(const InstructionOperand* op,
70                        OperandConstraint* constraint);
71   void CheckConstraint(const InstructionOperand* op,
72                        const OperandConstraint* constraint);
73 
74   void VerifyGapMoves(BlockMaps* outgoing_mappings, bool initial_pass);
75 
76   Zone* const zone_;
77   const RegisterConfiguration* config_;
78   const InstructionSequence* const sequence_;
79   Constraints constraints_;
80 
81   DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorVerifier);
82 };
83 
84 }  // namespace compiler
85 }  // namespace internal
86 }  // namespace v8
87 
88 #endif
89