1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved. 2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// found in the LICENSE file. 4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifndef SRC_ASMJS_ASM_TYPER_H_ 6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SRC_ASMJS_ASM_TYPER_H_ 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <cstdint> 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <string> 10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <unordered_set> 11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/allocation.h" 13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/asmjs/asm-types.h" 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast-type-bounds.h" 15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/ast/ast-types.h" 16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast.h" 17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/effects.h" 18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/type-info.h" 19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone-containers.h" 20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h" 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace v8 { 23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace internal { 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace wasm { 25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmType; 27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmTyperHarnessBuilder; 28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmTyper final { 30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum StandardMember { 32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kHeap = -4, 33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kFFI = -3, 34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kStdlib = -2, 35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kModule = -1, 36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kNone = 0, 37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kInfinity, 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kNaN, 39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAcos, 40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAsin, 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAtan, 42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathCos, 43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSin, 44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathTan, 45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathExp, 46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLog, 47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathCeil, 48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathFloor, 49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSqrt, 50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAbs, 51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathClz32, 52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathMin, 53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathMax, 54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathAtan2, 55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathPow, 56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathImul, 57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathFround, 58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathE, 59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLN10, 60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLN2, 61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLOG2E, 62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathLOG10E, 63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathPI, 64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSQRT1_2, 65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMathSQRT2, 66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~AsmTyper() = default; 69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmTyper(Isolate* isolate, Zone* zone, Script* script, FunctionLiteral* root); 70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool Validate(); 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const char* error_message() const { return error_message_; } 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* TypeOf(AstNode* node) const; 76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AsmType* TypeOf(Variable* v) const; 77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember VariableAsStandardMember(Variable* var); 78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typedef std::unordered_set<StandardMember, std::hash<int> > StdlibSet; 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StdlibSet StdlibUses() const { return stdlib_uses_; } 82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Each FFI import has a usage-site signature associated with it. 84f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch struct FFIUseSignature { 85f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Variable* var; 86f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ZoneVector<AsmType*> arg_types_; 87f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AsmType* return_type_; 88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch FFIUseSignature(Variable* v, Zone* zone) 89f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : var(v), arg_types_(zone), return_type_(nullptr) {} 90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch }; 91f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 92f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const ZoneVector<FFIUseSignature>& FFIUseSignatures() { 93f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return ffi_use_signatures_; 94f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 95f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch friend class v8::internal::wasm::AsmTyperHarnessBuilder; 98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class VariableInfo : public ZoneObject { 100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum Mutability { 102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kInvalidMutability, 103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kLocal, 104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMutableGlobal, 105c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // *VIOLATION* We support const variables in asm.js, as per the 106c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 107c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // https://discourse.wicg.io/t/allow-const-global-variables/684 108c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 109c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Global const variables are treated as if they were numeric literals, 110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // and can be used anywhere a literal can be used. 111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kConstGlobal, 112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kImmutableGlobal, 113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit VariableInfo(AsmType* t) : type_(t) {} 116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableInfo* Clone(Zone* zone) const; 118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsMutable() const { 120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return mutability_ == kLocal || mutability_ == kMutableGlobal; 121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsGlobal() const { 124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return mutability_ == kImmutableGlobal || mutability_ == kConstGlobal || 125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch mutability_ == kMutableGlobal; 126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsStdlib() const { return standard_member_ == kStdlib; } 129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsFFI() const { return standard_member_ == kFFI; } 130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsHeap() const { return standard_member_ == kHeap; } 131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void MarkDefined() { missing_definition_ = false; } 133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void FirstForwardUseIs(VariableProxy* var); 134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember standard_member() const { return standard_member_; } 136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void set_standard_member(StandardMember standard_member) { 137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch standard_member_ = standard_member; 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* type() const { return type_; } 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void set_type(AsmType* type) { type_ = type; } 142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Mutability mutability() const { return mutability_; } 144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void set_mutability(Mutability mutability) { mutability_ = mutability; } 145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool missing_definition() const { return missing_definition_; } 147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableProxy* first_forward_use() const { return first_forward_use_; } 149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static VariableInfo* ForSpecialSymbol(Zone* zone, 151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember standard_member); 152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* type_; 155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StandardMember standard_member_ = kNone; 156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Mutability mutability_ = kInvalidMutability; 157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // missing_definition_ is set to true for forward definition - i.e., use 158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // before definition. 159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool missing_definition_ = false; 160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // first_forward_use_ holds the AST node that first referenced this 161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // VariableInfo. Used for error messages. 162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableProxy* first_forward_use_ = nullptr; 163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // RAII-style manager for the in_function_ member variable. 166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch struct FunctionScope { 167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit FunctionScope(AsmTyper* typer) : typer_(typer) { 168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(!typer_->in_function_); 169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->in_function_ = true; 170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->local_scope_.Clear(); 171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->return_type_ = AsmType::None(); 172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ~FunctionScope() { 175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(typer_->in_function_); 176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch typer_->in_function_ = false; 177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmTyper* typer_; 180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // FlattenedStatements is an iterator class for ZoneList<Statement*> that 183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // flattens the Block construct in the AST. This is here because we need it in 184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // the tests. 185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class FlattenedStatements { 186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit FlattenedStatements(Zone* zone, ZoneList<Statement*>* s); 188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Statement* Next(); 189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch struct Context { 192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch explicit Context(ZoneList<Statement*>* s) : statements_(s) {} 193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneList<Statement*>* statements_; 194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int next_index_ = 0; 195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneVector<Context> context_stack_; 198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FlattenedStatements); 200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch using ObjectTypeMap = ZoneMap<std::string, VariableInfo*>; 203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void InitializeStdlib(); 204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetTypeOf(AstNode* node, AsmType* type); 205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void AddForwardReference(VariableProxy* proxy, VariableInfo* info); 207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool AddGlobal(Variable* global, VariableInfo* info); 208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool AddLocal(Variable* global, VariableInfo* info); 209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Used for 5.5 GlobalVariableTypeAnnotations 210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableInfo* ImportLookup(Property* expr); 211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 3.3 Environment Lookup 212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOTE: In the spec, the lookup function's prototype is 213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Lookup(Delta, Gamma, x) 215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Delta is the global_scope_ member, and Gamma, local_scope_. 217f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch VariableInfo* Lookup(Variable* variable) const; 218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // All of the ValidateXXX methods below return AsmType::None() in case of 220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // validation failure. 221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.1 ValidateModule 223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateModule(FunctionLiteral* fun); 224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateGlobalDeclaration(Assignment* assign); 225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.2 ValidateExport 226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ExportType(VariableProxy* fun_export); 227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateExport(ReturnStatement* exports); 228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.3 ValidateFunctionTable 229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateFunctionTable(Assignment* assign); 230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.4 ValidateFunction 231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateFunction(FunctionDeclaration* fun_decl); 232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5 ValidateStatement 233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateStatement(Statement* statement); 234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.1 BlockStatement 235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBlockStatement(Block* block); 236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.2 ExpressionStatement 237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateExpressionStatement(ExpressionStatement* expr); 238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.3 EmptyStatement 239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateEmptyStatement(EmptyStatement* empty); 240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.4 IfStatement 241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateIfStatement(IfStatement* if_stmt); 242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.5 ReturnStatement 243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateReturnStatement(ReturnStatement* ret_stmt); 244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6 IterationStatement 245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6.a WhileStatement 246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateWhileStatement(WhileStatement* while_stmt); 247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6.b DoWhileStatement 248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateDoWhileStatement(DoWhileStatement* do_while); 249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.6.c ForStatement 250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateForStatement(ForStatement* for_stmt); 251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.7 BreakStatement 252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBreakStatement(BreakStatement* brk_stmt); 253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.8 ContinueStatement 254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateContinueStatement(ContinueStatement* cont_stmt); 255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.9 LabelledStatement 256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // NOTE: we don't need to handle these: Labelled statements are 257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // BreakableStatements in our AST, but BreakableStatement is not a concrete 258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // class -- and we're handling all of BreakableStatement's subclasses. 259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.5.10 SwitchStatement 260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateSwitchStatement(SwitchStatement* stmt); 261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.6 ValidateCase 262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCase(CaseClause* label, int32_t* case_lbl); 263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.7 ValidateDefault 264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateDefault(CaseClause* label); 265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8 ValidateExpression 266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateExpression(Expression* expr); 267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCompareOperation(CompareOperation* cmp); 268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBinaryOperation(BinaryOperation* binop); 269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.1 Expression 270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCommaExpression(BinaryOperation* comma); 271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.2 NumericLiteral 272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateNumericLiteral(Literal* literal); 273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.3 Identifier 274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateIdentifier(VariableProxy* proxy); 275f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.4 CallExpression 276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCallExpression(Call* call); 277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.5 MemberExpression 278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateMemberExpression(Property* prop); 279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.6 AssignmentExpression 280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateAssignmentExpression(Assignment* assignment); 281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.7 UnaryExpression 282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateUnaryExpression(UnaryOperation* unop); 283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.8 MultiplicativeExpression 284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateMultiplicativeExpression(BinaryOperation* binop); 285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.9 AdditiveExpression 286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateAdditiveExpression(BinaryOperation* binop, 287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch uint32_t intish_count); 288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.10 ShiftExpression 289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateShiftExpression(BinaryOperation* binop); 290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.11 RelationalExpression 291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateRelationalExpression(CompareOperation* cmpop); 292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.12 EqualityExpression 293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateEqualityExpression(CompareOperation* cmpop); 294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.13 BitwiseANDExpression 295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBitwiseANDExpression(BinaryOperation* binop); 296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.14 BitwiseXORExpression 297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBitwiseXORExpression(BinaryOperation* binop); 298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.15 BitwiseORExpression 299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateBitwiseORExpression(BinaryOperation* binop); 300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.8.16 ConditionalExpression 301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateConditionalExpression(Conditional* cond); 302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.9 ValidateCall 303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateCall(AsmType* return_type, Call* call); 304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.10 ValidateHeapAccess 305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum HeapAccessType { LoadFromHeap, StoreToHeap }; 306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateHeapAccess(Property* heap, HeapAccessType access_type); 307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 6.11 ValidateFloatCoercion 308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsCallToFround(Call* call); 309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ValidateFloatCoercion(Call* call); 310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.1 ParameterTypeAnnotations 312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ParameterTypeAnnotations(Variable* parameter, 313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Expression* annotation); 314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.2 ReturnTypeAnnotations 315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ReturnTypeAnnotations(ReturnStatement* statement); 316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.4 VariableTypeAnnotations 317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 5.5 GlobalVariableTypeAnnotations 318c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch AsmType* VariableTypeAnnotations( 319c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Expression* initializer, 320c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch VariableInfo::Mutability global = VariableInfo::kLocal); 321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ImportExpression(Property* import); 322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* NewHeapView(CallNew* new_heap_view); 323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate_; 325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Zone* zone_; 326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Script* script_; 327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FunctionLiteral* root_; 328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool in_function_ = false; 329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* return_type_ = nullptr; 331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneVector<VariableInfo*> forward_definitions_; 333f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ZoneVector<FFIUseSignature> ffi_use_signatures_; 334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ObjectTypeMap stdlib_types_; 335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ObjectTypeMap stdlib_math_types_; 336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // The ASM module name. This member is used to prevent globals from redefining 338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // the module name. 339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch VariableInfo* module_info_; 340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<String> module_name_; 341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // 3 Environments 343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneHashMap global_scope_; // 3.1 Global environment 344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneHashMap local_scope_; // 3.2 Variable environment 345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::uintptr_t stack_limit_; 347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool stack_overflow_ = false; 348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ZoneMap<AstNode*, AsmType*> node_types_; 349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kErrorMessageLimit = 100; 350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* fround_type_; 351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch AsmType* ffi_type_; 352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch char error_message_[kErrorMessageLimit]; 353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StdlibSet stdlib_uses_; 354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AsmTyper); 356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace wasm 359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace internal 360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // namespace v8 361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif // SRC_ASMJS_ASM_TYPER_H_ 363