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>
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include <unordered_map>
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <unordered_set>
12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/allocation.h"
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/asmjs/asm-types.h"
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast-type-bounds.h"
16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/ast/ast-types.h"
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/ast.h"
18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/effects.h"
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/messages.h"
20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/type-info.h"
21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone-containers.h"
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h"
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace v8 {
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace internal {
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace wasm {
27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmType;
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmTyperHarnessBuilder;
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass SourceLayoutTracker;
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass AsmTyper final {
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  enum StandardMember {
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kHeap = -4,
36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kFFI = -3,
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kStdlib = -2,
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kModule = -1,
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kNone = 0,
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kInfinity,
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kNaN,
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathAcos,
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathAsin,
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathAtan,
45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathCos,
46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathSin,
47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathTan,
48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathExp,
49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathLog,
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathCeil,
51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathFloor,
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathSqrt,
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathAbs,
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathClz32,
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathMin,
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathMax,
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathAtan2,
58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathPow,
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathImul,
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathFround,
61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathE,
62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathLN10,
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathLN2,
64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathLOG2E,
65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathLOG10E,
66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathPI,
67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathSQRT1_2,
68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    kMathSQRT2,
69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ~AsmTyper() = default;
7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmTyper(Isolate* isolate, Zone* zone, Handle<Script> script,
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch           FunctionLiteral* root);
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool Validate();
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Do asm.js validation in phases (to interleave with conversion to wasm).
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool ValidateBeforeFunctionsPhase();
7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool ValidateInnerFunction(FunctionDeclaration* decl);
7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool ValidateAfterFunctionsPhase();
8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void ClearFunctionNodeTypes();
81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSMessageObject> error_message() const { return error_message_; }
8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const MessageLocation* message_location() const { return &message_location_; }
8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* TriggerParsingError();
86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* TypeOf(AstNode* node) const;
88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  AsmType* TypeOf(Variable* v) const;
89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StandardMember VariableAsStandardMember(Variable* var);
90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
9162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Allow the asm-wasm-builder to trigger failures (for interleaved
9262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // validating).
9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* FailWithMessage(const char* text);
9462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  typedef std::unordered_set<StandardMember, std::hash<int> > StdlibSet;
96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StdlibSet StdlibUses() const { return stdlib_uses_; }
98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Each FFI import has a usage-site signature associated with it.
100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  struct FFIUseSignature {
101f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Variable* var;
102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    ZoneVector<AsmType*> arg_types_;
103f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    AsmType* return_type_;
104f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    FFIUseSignature(Variable* v, Zone* zone)
105f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        : var(v), arg_types_(zone), return_type_(nullptr) {}
106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  };
107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  const ZoneVector<FFIUseSignature>& FFIUseSignatures() {
109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return ffi_use_signatures_;
110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private:
113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  friend class v8::internal::wasm::AsmTyperHarnessBuilder;
114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  class VariableInfo : public ZoneObject {
116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch   public:
117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    enum Mutability {
118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kInvalidMutability,
119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kLocal,
120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kMutableGlobal,
121c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // *VIOLATION* We support const variables in asm.js, as per the
122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      //
123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // https://discourse.wicg.io/t/allow-const-global-variables/684
124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      //
125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // Global const variables are treated as if they were numeric literals,
126c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      // and can be used anywhere a literal can be used.
127c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      kConstGlobal,
128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      kImmutableGlobal,
129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    };
130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    explicit VariableInfo(AsmType* t) : type_(t) {}
132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    VariableInfo* Clone(Zone* zone) const;
134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool IsMutable() const {
136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return mutability_ == kLocal || mutability_ == kMutableGlobal;
137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool IsGlobal() const {
140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      return mutability_ == kImmutableGlobal || mutability_ == kConstGlobal ||
141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch             mutability_ == kMutableGlobal;
142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool IsStdlib() const { return standard_member_ == kStdlib; }
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool IsFFI() const { return standard_member_ == kFFI; }
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool IsHeap() const { return standard_member_ == kHeap; }
147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    void MarkDefined() { missing_definition_ = false; }
14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void SetFirstForwardUse(const MessageLocation& source_location);
150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    StandardMember standard_member() const { return standard_member_; }
152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    void set_standard_member(StandardMember standard_member) {
153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      standard_member_ = standard_member;
154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AsmType* type() const { return type_; }
157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    void set_type(AsmType* type) { type_ = type; }
158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Mutability mutability() const { return mutability_; }
160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    void set_mutability(Mutability mutability) { mutability_ = mutability; }
161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool missing_definition() const { return missing_definition_; }
163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
16462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    const MessageLocation* source_location() { return &source_location_; }
165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    static VariableInfo* ForSpecialSymbol(Zone* zone,
167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                          StandardMember standard_member);
168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch   private:
170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AsmType* type_;
171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    StandardMember standard_member_ = kNone;
172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Mutability mutability_ = kInvalidMutability;
173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // missing_definition_ is set to true for forward definition - i.e., use
174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    // before definition.
175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    bool missing_definition_ = false;
17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Used for error messages.
17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    MessageLocation source_location_;
178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // RAII-style manager for the in_function_ member variable.
181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  struct FunctionScope {
182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    explicit FunctionScope(AsmTyper* typer) : typer_(typer) {
183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      DCHECK(!typer_->in_function_);
184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      typer_->in_function_ = true;
185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      typer_->local_scope_.Clear();
186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      typer_->return_type_ = AsmType::None();
187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ~FunctionScope() {
190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      DCHECK(typer_->in_function_);
191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      typer_->in_function_ = false;
192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    AsmTyper* typer_;
195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // FlattenedStatements is an iterator class for ZoneList<Statement*> that
198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // flattens the Block construct in the AST. This is here because we need it in
199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // the tests.
200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  class FlattenedStatements {
201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch   public:
202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    explicit FlattenedStatements(Zone* zone, ZoneList<Statement*>* s);
203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Statement* Next();
204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch   private:
206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    struct Context {
207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      explicit Context(ZoneList<Statement*>* s) : statements_(s) {}
208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      ZoneList<Statement*>* statements_;
209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      int next_index_ = 0;
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    };
211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    ZoneVector<Context> context_stack_;
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DISALLOW_IMPLICIT_CONSTRUCTORS(FlattenedStatements);
215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
21762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  class SourceLayoutTracker {
21862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch   public:
21962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    SourceLayoutTracker() = default;
22062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    bool IsValid() const;
22162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void AddUseAsm(const AstNode& node) { use_asm_.AddNewElement(node); }
22262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void AddGlobal(const AstNode& node) { globals_.AddNewElement(node); }
22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void AddFunction(const AstNode& node) { functions_.AddNewElement(node); }
22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void AddTable(const AstNode& node) { tables_.AddNewElement(node); }
22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void AddExport(const AstNode& node) { exports_.AddNewElement(node); }
22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch   private:
22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    class Section {
22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch     public:
23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Section() = default;
23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Section(const Section&) = default;
23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Section& operator=(const Section&) = default;
23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      void AddNewElement(const AstNode& node);
23562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      bool IsPrecededBy(const Section& other) const;
23662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
23762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch     private:
23862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      int start_ = kNoSourcePosition;
23962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      int end_ = kNoSourcePosition;
24062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    };
24162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
24262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Section use_asm_;
24362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Section globals_;
24462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Section functions_;
24562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Section tables_;
24662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Section exports_;
24762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
24862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DISALLOW_COPY_AND_ASSIGN(SourceLayoutTracker);
24962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  };
25062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  using ObjectTypeMap = ZoneMap<std::string, VariableInfo*>;
252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void InitializeStdlib();
253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void SetTypeOf(AstNode* node, AsmType* type);
254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void AddForwardReference(VariableProxy* proxy, VariableInfo* info);
256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool AddGlobal(Variable* global, VariableInfo* info);
257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool AddLocal(Variable* global, VariableInfo* info);
258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Used for 5.5 GlobalVariableTypeAnnotations
259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VariableInfo* ImportLookup(Property* expr);
260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 3.3 Environment Lookup
261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // NOTE: In the spec, the lookup function's prototype is
262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  //
263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  //   Lookup(Delta, Gamma, x)
264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  //
265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // Delta is the global_scope_ member, and Gamma, local_scope_.
266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  VariableInfo* Lookup(Variable* variable) const;
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // All of the ValidateXXX methods below return AsmType::None() in case of
269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // validation failure.
270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.1 ValidateModule
27262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* ValidateModuleBeforeFunctionsPhase(FunctionLiteral* fun);
27362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* ValidateModuleFunction(FunctionDeclaration* fun_decl);
27462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* ValidateModuleFunctions(FunctionLiteral* fun);
27562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* ValidateModuleAfterFunctionsPhase(FunctionLiteral* fun);
276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateGlobalDeclaration(Assignment* assign);
277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.2 ValidateExport
278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ExportType(VariableProxy* fun_export);
279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateExport(ReturnStatement* exports);
280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.3 ValidateFunctionTable
281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateFunctionTable(Assignment* assign);
282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.4 ValidateFunction
283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateFunction(FunctionDeclaration* fun_decl);
284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5 ValidateStatement
285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateStatement(Statement* statement);
286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.1 BlockStatement
287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateBlockStatement(Block* block);
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.2 ExpressionStatement
289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateExpressionStatement(ExpressionStatement* expr);
290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.3 EmptyStatement
291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateEmptyStatement(EmptyStatement* empty);
292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.4 IfStatement
293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateIfStatement(IfStatement* if_stmt);
294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.5 ReturnStatement
295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateReturnStatement(ReturnStatement* ret_stmt);
296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.6 IterationStatement
297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.6.a WhileStatement
298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateWhileStatement(WhileStatement* while_stmt);
299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.6.b DoWhileStatement
300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateDoWhileStatement(DoWhileStatement* do_while);
301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.6.c ForStatement
302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateForStatement(ForStatement* for_stmt);
303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.7 BreakStatement
304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateBreakStatement(BreakStatement* brk_stmt);
305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.8 ContinueStatement
306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateContinueStatement(ContinueStatement* cont_stmt);
307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.9 LabelledStatement
308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // NOTE: we don't need to handle these: Labelled statements are
309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // BreakableStatements in our AST, but BreakableStatement is not a concrete
310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // class -- and we're handling all of BreakableStatement's subclasses.
311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.5.10 SwitchStatement
312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateSwitchStatement(SwitchStatement* stmt);
313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.6 ValidateCase
314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateCase(CaseClause* label, int32_t* case_lbl);
315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.7 ValidateDefault
316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateDefault(CaseClause* label);
317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8 ValidateExpression
318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateExpression(Expression* expr);
319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateCompareOperation(CompareOperation* cmp);
320f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateBinaryOperation(BinaryOperation* binop);
321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.1 Expression
322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateCommaExpression(BinaryOperation* comma);
323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.2 NumericLiteral
324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateNumericLiteral(Literal* literal);
325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.3 Identifier
326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateIdentifier(VariableProxy* proxy);
327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.4 CallExpression
328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateCallExpression(Call* call);
329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.5 MemberExpression
330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateMemberExpression(Property* prop);
331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.6 AssignmentExpression
332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateAssignmentExpression(Assignment* assignment);
333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.7 UnaryExpression
334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateUnaryExpression(UnaryOperation* unop);
335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.8 MultiplicativeExpression
336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateMultiplicativeExpression(BinaryOperation* binop);
337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.9 AdditiveExpression
338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateAdditiveExpression(BinaryOperation* binop,
339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                      uint32_t intish_count);
340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.10 ShiftExpression
341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateShiftExpression(BinaryOperation* binop);
342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.11 RelationalExpression
343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateRelationalExpression(CompareOperation* cmpop);
344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.12 EqualityExpression
345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateEqualityExpression(CompareOperation* cmpop);
346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.13 BitwiseANDExpression
347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateBitwiseANDExpression(BinaryOperation* binop);
348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.14 BitwiseXORExpression
349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateBitwiseXORExpression(BinaryOperation* binop);
350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.15 BitwiseORExpression
351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateBitwiseORExpression(BinaryOperation* binop);
352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.8.16 ConditionalExpression
353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateConditionalExpression(Conditional* cond);
354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.9 ValidateCall
355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateCall(AsmType* return_type, Call* call);
356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.10 ValidateHeapAccess
357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  enum HeapAccessType { LoadFromHeap, StoreToHeap };
358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateHeapAccess(Property* heap, HeapAccessType access_type);
359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 6.11 ValidateFloatCoercion
360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool IsCallToFround(Call* call);
361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ValidateFloatCoercion(Call* call);
362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 5.1 ParameterTypeAnnotations
364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ParameterTypeAnnotations(Variable* parameter,
365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                    Expression* annotation);
366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 5.2 ReturnTypeAnnotations
36762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  AsmType* ReturnTypeAnnotations(Expression* ret_expr);
368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 5.4 VariableTypeAnnotations
369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 5.5 GlobalVariableTypeAnnotations
370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  AsmType* VariableTypeAnnotations(
371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Expression* initializer,
372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      VariableInfo::Mutability global = VariableInfo::kLocal);
373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ImportExpression(Property* import);
374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* NewHeapView(CallNew* new_heap_view);
375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Isolate* isolate_;
377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Zone* zone_;
37862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Script> script_;
379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  FunctionLiteral* root_;
380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool in_function_ = false;
381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* return_type_ = nullptr;
383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ZoneVector<VariableInfo*> forward_definitions_;
385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ZoneVector<FFIUseSignature> ffi_use_signatures_;
386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ObjectTypeMap stdlib_types_;
387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ObjectTypeMap stdlib_math_types_;
388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // The ASM module name. This member is used to prevent globals from redefining
390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // the module name.
391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  VariableInfo* module_info_;
392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<String> module_name_;
393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // 3 Environments
395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ZoneHashMap global_scope_;  // 3.1 Global environment
396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ZoneHashMap local_scope_;   // 3.2 Variable environment
397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  std::uintptr_t stack_limit_;
399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool stack_overflow_ = false;
40062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unordered_map<AstNode*, AsmType*> module_node_types_;
40162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  std::unordered_map<AstNode*, AsmType*> function_node_types_;
40262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static const int kErrorMessageLimit = 128;
403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* fround_type_;
404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  AsmType* ffi_type_;
40562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSMessageObject> error_message_;
40662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  MessageLocation message_location_;
407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StdlibSet stdlib_uses_;
408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
40962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  SourceLayoutTracker source_layout_;
41062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ReturnStatement* module_return_;
41162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ZoneVector<Assignment*> function_pointer_tables_;
41262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DISALLOW_IMPLICIT_CONSTRUCTORS(AsmTyper);
414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace wasm
417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace internal
418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace v8
419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // SRC_ASMJS_ASM_TYPER_H_
421