/*
 * Copyright 2015 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//
// Simple WebAssembly module validator.
//
// There are some options regarding how to validate:
//
//  * validateWeb: The Web platform doesn't have i64 values, so it is illegal
//                 to import or export such a value. When this option is set,
//                 such imports/exports are validation errors.
//
//  * validateGlobally: Binaryen supports building modules in parallel, which
//                      means you can add and optimize a function before the
//                      module is complete, for example, you can add function A
//                      with a call to function B before function B exists.
//                      When validateGlobally is disabled, we don't look at
//                      global correctness, and instead only check inside
//                      each function (so in the example above we wouldn't care
//                      about function B not existing yet, but we would care
//                      if e.g. inside function A an i32.add receives an i64).
//
//  * quiet: Whether to log errors verbosely.
//

#ifndef wasm_wasm_validator_h
#define wasm_wasm_validator_h

#include <set>
#include <sstream>
#include <unordered_set>

#include "pass.h"
#include "wasm.h"

namespace wasm {

struct WasmValidator {
  enum FlagValues {
    Minimal = 0,
    Web = 1 << 0,
    Globally = 1 << 1,
    Quiet = 1 << 2,
    ClosedWorld = 1 << 3,
  };
  using Flags = uint32_t;

  // Validate an entire module.
  bool validate(Module& module, Flags flags = Globally);
  bool validate(Module& module, const PassOptions& options);

  // Validate a specific function.
  bool validate(Function* func, Module& module, Flags flags = Globally);
};

} // namespace wasm

#endif // wasm_wasm_validator_h
