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