OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/verifier.h" | 5 #include "src/compiler/verifier.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <deque> | 8 #include <deque> |
9 #include <queue> | 9 #include <queue> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 | 48 |
49 Zone* zone; | 49 Zone* zone; |
50 Typing typing; | 50 Typing typing; |
51 | 51 |
52 private: | 52 private: |
53 // TODO(rossberg): Get rid of these once we got rid of NodeProperties. | 53 // TODO(rossberg): Get rid of these once we got rid of NodeProperties. |
54 Bounds bounds(Node* node) { return NodeProperties::GetBounds(node); } | 54 Bounds bounds(Node* node) { return NodeProperties::GetBounds(node); } |
55 Node* ValueInput(Node* node, int i = 0) { | 55 Node* ValueInput(Node* node, int i = 0) { |
56 return NodeProperties::GetValueInput(node, i); | 56 return NodeProperties::GetValueInput(node, i); |
57 } | 57 } |
58 FieldAccess Field(Node* node) { | |
59 DCHECK(node->opcode() == IrOpcode::kLoadField || | |
60 node->opcode() == IrOpcode::kStoreField); | |
61 return OpParameter<FieldAccess>(node); | |
62 } | |
63 ElementAccess Element(Node* node) { | |
64 DCHECK(node->opcode() == IrOpcode::kLoadElement || | |
65 node->opcode() == IrOpcode::kStoreElement); | |
66 return OpParameter<ElementAccess>(node); | |
67 } | |
68 void CheckNotTyped(Node* node) { | 58 void CheckNotTyped(Node* node) { |
69 if (NodeProperties::IsTyped(node)) { | 59 if (NodeProperties::IsTyped(node)) { |
70 std::ostringstream str; | 60 std::ostringstream str; |
71 str << "TypeError: node #" << node->id() << ":" << *node->op() | 61 str << "TypeError: node #" << node->id() << ":" << *node->op() |
72 << " should never have a type"; | 62 << " should never have a type"; |
73 FATAL(str.str().c_str()); | 63 FATAL(str.str().c_str()); |
74 } | 64 } |
75 } | 65 } |
76 void CheckUpperIs(Node* node, Type* type) { | 66 void CheckUpperIs(Node* node, Type* type) { |
77 if (typing == TYPED && !bounds(node).upper->Is(type)) { | 67 if (typing == TYPED && !bounds(node).upper->Is(type)) { |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 // Type* to = Type::Intersect(Type::Boolean(), Type::TaggedPtr()); | 697 // Type* to = Type::Intersect(Type::Boolean(), Type::TaggedPtr()); |
708 // CheckValueInputIs(node, 0, from)); | 698 // CheckValueInputIs(node, 0, from)); |
709 // CheckUpperIs(node, to)); | 699 // CheckUpperIs(node, to)); |
710 break; | 700 break; |
711 } | 701 } |
712 | 702 |
713 case IrOpcode::kLoadField: | 703 case IrOpcode::kLoadField: |
714 // Object -> fieldtype | 704 // Object -> fieldtype |
715 // TODO(rossberg): activate once machine ops are typed. | 705 // TODO(rossberg): activate once machine ops are typed. |
716 // CheckValueInputIs(node, 0, Type::Object()); | 706 // CheckValueInputIs(node, 0, Type::Object()); |
717 // CheckUpperIs(node, Field(node).type)); | 707 // CheckUpperIs(node, FieldAccessOf(node->op()).type)); |
718 break; | 708 break; |
719 case IrOpcode::kLoadBuffer: | 709 case IrOpcode::kLoadBuffer: |
720 break; | 710 break; |
721 case IrOpcode::kLoadElement: | 711 case IrOpcode::kLoadElement: |
722 // Object -> elementtype | 712 // Object -> elementtype |
723 // TODO(rossberg): activate once machine ops are typed. | 713 // TODO(rossberg): activate once machine ops are typed. |
724 // CheckValueInputIs(node, 0, Type::Object()); | 714 // CheckValueInputIs(node, 0, Type::Object()); |
725 // CheckUpperIs(node, Element(node).type)); | 715 // CheckUpperIs(node, ElementAccessOf(node->op()).type)); |
726 break; | 716 break; |
727 case IrOpcode::kStoreField: | 717 case IrOpcode::kStoreField: |
728 // (Object, fieldtype) -> _|_ | 718 // (Object, fieldtype) -> _|_ |
729 // TODO(rossberg): activate once machine ops are typed. | 719 // TODO(rossberg): activate once machine ops are typed. |
730 // CheckValueInputIs(node, 0, Type::Object()); | 720 // CheckValueInputIs(node, 0, Type::Object()); |
731 // CheckValueInputIs(node, 1, Field(node).type)); | 721 // CheckValueInputIs(node, 1, FieldAccessOf(node->op()).type)); |
732 CheckNotTyped(node); | 722 CheckNotTyped(node); |
733 break; | 723 break; |
734 case IrOpcode::kStoreBuffer: | 724 case IrOpcode::kStoreBuffer: |
735 break; | 725 break; |
736 case IrOpcode::kStoreElement: | 726 case IrOpcode::kStoreElement: |
737 // (Object, elementtype) -> _|_ | 727 // (Object, elementtype) -> _|_ |
738 // TODO(rossberg): activate once machine ops are typed. | 728 // TODO(rossberg): activate once machine ops are typed. |
739 // CheckValueInputIs(node, 0, Type::Object()); | 729 // CheckValueInputIs(node, 0, Type::Object()); |
740 // CheckValueInputIs(node, 1, Element(node).type)); | 730 // CheckValueInputIs(node, 1, ElementAccessOf(node->op()).type)); |
741 CheckNotTyped(node); | 731 CheckNotTyped(node); |
742 break; | 732 break; |
743 | 733 |
744 // Machine operators | 734 // Machine operators |
745 // ----------------------- | 735 // ----------------------- |
746 case IrOpcode::kLoad: | 736 case IrOpcode::kLoad: |
747 case IrOpcode::kStore: | 737 case IrOpcode::kStore: |
748 case IrOpcode::kWord32And: | 738 case IrOpcode::kWord32And: |
749 case IrOpcode::kWord32Or: | 739 case IrOpcode::kWord32Or: |
750 case IrOpcode::kWord32Xor: | 740 case IrOpcode::kWord32Xor: |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 // Check inputs for all nodes in the block. | 1081 // Check inputs for all nodes in the block. |
1092 for (size_t i = 0; i < block->NodeCount(); i++) { | 1082 for (size_t i = 0; i < block->NodeCount(); i++) { |
1093 Node* node = block->NodeAt(i); | 1083 Node* node = block->NodeAt(i); |
1094 CheckInputsDominate(schedule, block, node, static_cast<int>(i) - 1); | 1084 CheckInputsDominate(schedule, block, node, static_cast<int>(i) - 1); |
1095 } | 1085 } |
1096 } | 1086 } |
1097 } | 1087 } |
1098 } | 1088 } |
1099 } | 1089 } |
1100 } // namespace v8::internal::compiler | 1090 } // namespace v8::internal::compiler |
OLD | NEW |