diff options
Diffstat (limited to 'src/passes/RoundTrip.cpp')
-rw-r--r-- | src/passes/RoundTrip.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/passes/RoundTrip.cpp b/src/passes/RoundTrip.cpp new file mode 100644 index 000000000..626c469d5 --- /dev/null +++ b/src/passes/RoundTrip.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2019 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. + */ + +// +// Write the module to binary, and load it from there. This is useful in +// testing to check for the effects of roundtripping in a single wasm-opt +// parameter. +// + +#ifdef _WIN32 +#include <io.h> +#endif + +#include <cstdlib> +#include <vector> + +#include "ir/module-utils.h" +#include "pass.h" +#include "support/file.h" +#include "wasm-io.h" +#include "wasm.h" + +using namespace std; + +namespace wasm { + +struct RoundTrip : public Pass { + void run(PassRunner* runner, Module* module) override { + std::string templateName = "byn_round_trip_XXXXXX"; + std::vector<char> buffer(templateName.begin(), templateName.end()); + buffer.push_back(0); +#ifndef _WIN32 + auto fd = mkstemp(buffer.data()); + WASM_UNUSED(fd); + std::string tempName(buffer.begin(), buffer.end()); +#else + std::string tempName = _mktemp(buffer.data()); +#endif + // Write + ModuleWriter writer; + writer.setBinary(true); + writer.setDebugInfo(runner->options.debugInfo); + writer.write(*module, tempName); + // Read + Module newModule; + ModuleReader reader; + reader.read(tempName, newModule); + // Clean up + std::remove(tempName.c_str()); + // Swap in + ModuleUtils::clearModule(*module); + ModuleUtils::copyModule(newModule, *module); + } +}; + +Pass* createRoundTripPass() { return new RoundTrip(); } + +} // namespace wasm |