| /* | |
| * 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. | |
| // | |
| #include "ir/module-utils.h" | |
| #include "pass.h" | |
| #include "wasm-binary.h" | |
| #include "wasm.h" | |
| namespace wasm { | |
| struct RoundTrip : public Pass { | |
| // Reloading the wasm may alter function names etc., which means our global | |
| // function effect tracking can get confused, and effects may seem to appear. | |
| // To avoid that, mark this pass as adding effects, which will clear all | |
| // cached effects and such. | |
| bool addsEffects() override { return true; } | |
| void run(Module* module) override { | |
| BufferWithRandomAccess buffer; | |
| // Save features, which would not otherwise make it through a round trip if | |
| // the target features section has been stripped. We also need them in order | |
| // to tell the builder which features to build with. | |
| auto features = module->features; | |
| // We need to know whether we should preserve the type order when we read | |
| // the module back in. | |
| bool preserveTypeOrder = !module->typeIndices.empty(); | |
| // Write, clear, and read the module | |
| WasmBinaryWriter(module, buffer, getPassOptions()).write(); | |
| ModuleUtils::clearModule(*module); | |
| auto input = buffer.getAsChars(); | |
| WasmBinaryReader parser(*module, features, input); | |
| parser.setDWARF(getPassOptions().debugInfo); | |
| try { | |
| parser.read(); | |
| } catch (ParseException& p) { | |
| p.dump(std::cerr); | |
| std::cerr << '\n'; | |
| Fatal() << "error in parsing wasm binary"; | |
| } | |
| if (!preserveTypeOrder) { | |
| module->typeIndices.clear(); | |
| } | |
| } | |
| }; | |
| Pass* createRoundTripPass() { return new RoundTrip(); } | |
| } // namespace wasm |