1 // Copyright 2015 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_TYPING_ASM_H_ 6 #define V8_TYPING_ASM_H_ 7 8 #include "src/allocation.h" 9 #include "src/ast/ast-type-bounds.h" 10 #include "src/ast/ast.h" 11 #include "src/effects.h" 12 #include "src/type-info.h" 13 #include "src/types.h" 14 #include "src/zone.h" 15 16 namespace v8 { 17 namespace internal { 18 19 class TypeCache; 20 21 class AsmTyper : public AstVisitor { 22 public: 23 explicit AsmTyper(Isolate* isolate, Zone* zone, Script* script, 24 FunctionLiteral* root); 25 bool Validate(); set_allow_simd(bool simd)26 void set_allow_simd(bool simd) { allow_simd_ = simd; } error_message()27 const char* error_message() { return error_message_; } bounds()28 const AstTypeBounds* bounds() { return &bounds_; } 29 30 enum StandardMember { 31 kNone = 0, 32 kStdlib, 33 kInfinity, 34 kNaN, 35 kMathAcos, 36 kMathAsin, 37 kMathAtan, 38 kMathCos, 39 kMathSin, 40 kMathTan, 41 kMathExp, 42 kMathLog, 43 kMathCeil, 44 kMathFloor, 45 kMathSqrt, 46 kMathAbs, 47 kMathMin, 48 kMathMax, 49 kMathAtan2, 50 kMathPow, 51 kMathImul, 52 kMathFround, 53 kMathE, 54 kMathLN10, 55 kMathLN2, 56 kMathLOG2E, 57 kMathLOG10E, 58 kMathPI, 59 kMathSQRT1_2, 60 kMathSQRT2, 61 }; 62 63 StandardMember VariableAsStandardMember(Variable* variable); 64 65 DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); 66 67 private: 68 Zone* zone_; 69 Isolate* isolate_; 70 Script* script_; 71 FunctionLiteral* root_; 72 bool valid_; 73 bool allow_simd_; 74 75 struct VariableInfo : public ZoneObject { 76 Type* type; 77 bool is_check_function; 78 bool is_constructor_function; 79 StandardMember standard_member; 80 VariableInfoVariableInfo81 VariableInfo() 82 : type(NULL), 83 is_check_function(false), 84 is_constructor_function(false), 85 standard_member(kNone) {} VariableInfoVariableInfo86 explicit VariableInfo(Type* t) 87 : type(t), 88 is_check_function(false), 89 is_constructor_function(false), 90 standard_member(kNone) {} 91 }; 92 93 // Information for bi-directional typing with a cap on nesting depth. 94 Type* expected_type_; 95 Type* computed_type_; 96 VariableInfo* property_info_; 97 int32_t intish_; // How many ops we've gone without a x|0. 98 99 Type* return_type_; // Return type of last function. 100 size_t array_size_; // Array size of last ArrayLiteral. 101 102 typedef ZoneMap<std::string, VariableInfo*> ObjectTypeMap; 103 ObjectTypeMap stdlib_types_; 104 ObjectTypeMap stdlib_heap_types_; 105 ObjectTypeMap stdlib_math_types_; 106 #define V(NAME, Name, name, lane_count, lane_type) \ 107 ObjectTypeMap stdlib_simd_##name##_types_; \ 108 VariableInfo* stdlib_simd_##name##_constructor_type_; 109 SIMD128_TYPES(V) 110 #undef V 111 112 // Map from Variable* to global/local variable Type*. 113 ZoneHashMap global_variable_type_; 114 ZoneHashMap local_variable_type_; 115 116 bool in_function_; // In module function? 117 bool building_function_tables_; 118 bool visiting_exports_; 119 120 TypeCache const& cache_; 121 122 AstTypeBounds bounds_; 123 124 static const int kErrorMessageLimit = 100; 125 char error_message_[kErrorMessageLimit]; 126 127 static const int kMaxUncombinedAdditiveSteps = 1 << 20; 128 static const int kMaxUncombinedMultiplicativeSteps = 1; 129 130 void InitializeStdlib(); 131 void InitializeStdlibSIMD(); 132 133 void VisitDeclarations(ZoneList<Declaration*>* d) override; 134 void VisitStatements(ZoneList<Statement*>* s) override; 135 136 void VisitExpressionAnnotation(Expression* e, Variable* var, bool is_return); 137 void VisitFunctionAnnotation(FunctionLiteral* f); 138 void VisitAsmModule(FunctionLiteral* f); 139 140 void VisitHeapAccess(Property* expr, bool assigning, Type* assignment_type); 141 142 void CheckPolymorphicStdlibArguments(enum StandardMember standard_member, 143 ZoneList<Expression*>* args); 144 145 Expression* GetReceiverOfPropertyAccess(Expression* expr, const char* name); 146 bool IsMathObject(Expression* expr); 147 bool IsSIMDObject(Expression* expr); 148 bool IsSIMDTypeObject(Expression* expr, const char* name); 149 bool IsStdlibObject(Expression* expr); 150 151 void VisitSIMDProperty(Property* expr); 152 153 int ElementShiftSize(Type* type); 154 Type* StorageType(Type* type); 155 156 void SetType(Variable* variable, Type* type); 157 Type* GetType(Variable* variable); 158 VariableInfo* GetVariableInfo(Variable* variable); 159 VariableInfo* MakeVariableInfo(Variable* variable); 160 void SetVariableInfo(Variable* variable, const VariableInfo* info); 161 162 VariableInfo* LibType(ObjectTypeMap* map, Handle<String> name); 163 void VisitLibraryAccess(ObjectTypeMap* map, Property* expr); 164 165 void SetResult(Expression* expr, Type* type); 166 void IntersectResult(Expression* expr, Type* type); 167 168 void VisitWithExpectation(Expression* expr, Type* expected_type, 169 const char* msg); 170 171 void VisitLiteral(Literal* expr, bool is_return); 172 173 void VisitIntegerBitwiseOperator(BinaryOperation* expr, Type* left_expected, 174 Type* right_expected, Type* result_type, 175 bool conversion); 176 zone()177 Zone* zone() const { return zone_; } 178 179 #define DECLARE_VISIT(type) void Visit##type(type* node) override; 180 AST_NODE_LIST(DECLARE_VISIT) 181 #undef DECLARE_VISIT 182 183 DISALLOW_COPY_AND_ASSIGN(AsmTyper); 184 }; 185 } // namespace internal 186 } // namespace v8 187 188 #endif // V8_TYPING_ASM_H_ 189