/* * Copyright 2017 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. */ // // Emit a wasm spec interpreter wrapper to run a wasm module with some test // values, useful for fuzzing. // namespace wasm { static std::string generateSpecWrapper(Module& wasm) { std::string ret; for (auto& exp : wasm.exports) { auto* func = wasm.getFunctionOrNull(exp->value); if (!func) { continue; // something exported other than a function } ret += std::string("(invoke \"hangLimitInitializer\") (invoke \"") + exp->name.str + "\" "; for (const auto& param : func->sig.params) { // zeros in arguments TODO more? TODO_SINGLE_COMPOUND(param); switch (param.getBasic()) { case Type::i32: ret += "(i32.const 0)"; break; case Type::i64: ret += "(i64.const 0)"; break; case Type::f32: ret += "(f32.const 0)"; break; case Type::f64: ret += "(f64.const 0)"; break; case Type::v128: ret += "(v128.const i32x4 0 0 0 0)"; break; case Type::funcref: ret += "(ref.null func)"; break; case Type::externref: ret += "(ref.null extern)"; break; case Type::exnref: ret += "(ref.null exn)"; break; case Type::anyref: ret += "(ref.null any)"; break; case Type::eqref: ret += "(ref.null eq)"; break; case Type::i31ref: WASM_UNREACHABLE("TODO: i31ref"); case Type::none: case Type::unreachable: WASM_UNREACHABLE("unexpected type"); } ret += " "; } ret += ") "; } return ret; } } // namespace wasm