diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 34 | ||||
-rw-r--r-- | src/tools/wasm-link-metadata.cpp | 128 | ||||
-rw-r--r-- | src/wasm-io.h | 4 | ||||
-rw-r--r-- | src/wasm/wasm-io.cpp | 25 |
4 files changed, 55 insertions, 136 deletions
diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 28f5a7c06..1cb1b5758 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -40,7 +40,7 @@ int main(int argc, const char *argv[]) { std::string outfile; bool emitBinary = true; unsigned numReservedFunctionPointers = 0; - std::vector<Name> forcedExports; + uint64_t globalBase; Options options("wasm-emscripten-finalize", "Performs Emscripten-specific transforms on .wasm files"); options @@ -63,6 +63,11 @@ int main(int argc, const char *argv[]) { const std::string &argument) { numReservedFunctionPointers = std::stoi(argument); }) + .add("--global-base", "", "Where lld started to place globals", + Options::Arguments::One, + [&globalBase](Options*, const std::string&argument ) { + globalBase = std::stoull(argument); + }) .add_positional("INFILE", Options::Arguments::One, [&infile](Options *o, const std::string& argument) { infile = argument; @@ -85,18 +90,37 @@ int main(int argc, const char *argv[]) { WasmPrinter::printModule(&wasm, std::cerr); } + Export* dataEndExport = wasm.getExport("__data_end"); + if (dataEndExport == nullptr) { + Fatal() << "__data_end export not found"; + } + Global* dataEnd = wasm.getGlobal(dataEndExport->value); + if (dataEnd == nullptr) { + Fatal() << "__data_end global not found"; + } + if (dataEnd->type != Type::i32) { + Fatal() << "__data_end global has wrong type"; + } + Const* dataEndConst = dataEnd->init->cast<Const>(); + uint32_t dataSize = dataEndConst->value.geti32() - globalBase; + + std::vector<Name> initializerFunctions; + initializerFunctions.push_back("__wasm_call_ctors"); + EmscriptenGlueGenerator generator(wasm); generator.generateRuntimeFunctions(); generator.generateMemoryGrowthFunction(); generator.generateDynCallThunks(); generator.generateJSCallThunks(numReservedFunctionPointers); - generator.fixEmAsmConsts(); + std::string metadata = generator.generateEmscriptenMetadata(dataSize, initializerFunctions, numReservedFunctionPointers); if (options.debug) { std::cerr << "Module after:\n"; WasmPrinter::printModule(&wasm, std::cerr); } + auto outputBinaryFlag = emitBinary ? Flags::Binary : Flags::Text; + Output output(outfile, outputBinaryFlag, Flags::Release); ModuleWriter writer; // writer.setDebug(options.debug); writer.setDebugInfo(true); @@ -107,7 +131,11 @@ int main(int argc, const char *argv[]) { // writer.setSourceMapFilename(sourceMapFilename); // writer.setSourceMapUrl(sourceMapUrl); // } - writer.write(wasm, outfile); + writer.write(wasm, output); + if (!emitBinary) { + output << ";; METADATA: "; + } + output << metadata; return 0; } diff --git a/src/tools/wasm-link-metadata.cpp b/src/tools/wasm-link-metadata.cpp deleted file mode 100644 index 3af00fbbf..000000000 --- a/src/tools/wasm-link-metadata.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * 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. - */ - -// -// wasm-link-metadata console tool -// Reads wasm .o file and emits .json metadata -// - -#include <exception> - -#include "abi/wasm-object.h" -#include "ir/trapping.h" -#include "support/colors.h" -#include "support/command-line.h" -#include "support/file.h" -#include "wasm-binary.h" -#include "wasm-emscripten.h" -#include "wasm-io.h" -#include "wasm-linker.h" -#include "wasm-printing.h" -#include "wasm-validator.h" - -using namespace cashew; -using namespace wasm; - -void parseLinkingSection(std::vector<char> const& data, uint32_t &dataSize) { - unsigned idx = 0; - auto get = [&idx, &data](){ return data[idx++]; }; - auto readNext = [get](){ - U32LEB leb; - leb.read(get); - return leb.value; - }; - - while (idx < data.size()) { - ABI::LinkType type = static_cast<ABI::LinkType>(readNext()); - uint32_t size = readNext(); - uint32_t startIdx = idx; - - switch(type) { - case ABI::WASM_DATA_SIZE: { - dataSize = readNext(); - break; - } - default: { - break; - } - } - // Always go to the end of the subsection based on size, not contents. - idx = startIdx + size; - } -} - -int main(int argc, const char *argv[]) { - std::string infile; - std::string outfile; - unsigned numReservedFunctionPointers = 0; - Options options("wasm-link-metadata", - "Reads wasm .o file and emits .json metadata"); - options - .add("--output", "-o", "Output file", - Options::Arguments::One, - [&outfile](Options *o, const std::string& argument) { - outfile = argument; - Colors::disable(); - }) - .add("--emscripten-reserved-function-pointers", "", - "Number of reserved function pointers for emscripten addFunction " - "support", - Options::Arguments::One, - [&numReservedFunctionPointers](Options *o, - const std::string &argument) { - numReservedFunctionPointers = std::stoi(argument); - }) - .add_positional("INFILE", Options::Arguments::One, - [&infile](Options *o, const std::string& argument) { - infile = argument; - }); - options.parse(argc, argv); - - if (infile == "") { - Fatal() << "Need to specify an infile\n"; - } - - Module wasm; - try { - ModuleReader reader; - reader.readBinary(infile, wasm); - } catch (ParseException& p) { - p.dump(std::cerr); - Fatal() << "error in parsing wasm binary"; - } - - if (options.debug) { - WasmPrinter::printModule(&wasm, std::cerr); - } - - uint32_t dataSize = 0; - for (auto §ion : wasm.userSections) { - if (section.name == "linking") { - parseLinkingSection(section.data, dataSize); - } - } - - std::vector<Name> initializerFunctions; - initializerFunctions.push_back("__wasm_call_ctors"); - - EmscriptenGlueGenerator generator(wasm); - std::string metadata = generator.generateEmscriptenMetadata( - dataSize, initializerFunctions, numReservedFunctionPointers); - Output output(outfile, Flags::Text, Flags::Release); - output << metadata; - - return 0; -} diff --git a/src/wasm-io.h b/src/wasm-io.h index 17a722472..cbb8f36c8 100644 --- a/src/wasm-io.h +++ b/src/wasm-io.h @@ -23,6 +23,7 @@ #include "wasm.h" #include "parsing.h" +#include "support/file.h" namespace wasm { @@ -62,12 +63,15 @@ public: void setSourceMapUrl(std::string sourceMapUrl_) { sourceMapUrl = sourceMapUrl_; } // write text + void writeText(Module& wasm, Output& output); void writeText(Module& wasm, std::string filename); // write binary + void writeBinary(Module& wasm, Output& output); void writeBinary(Module& wasm, std::string filename); // write text or binary, defaulting to binary unless setBinary(false), // and unless there is no output file (in which case we write text // to stdout). + void write(Module& wasm, Output& output); void write(Module& wasm, std::string filename); }; diff --git a/src/wasm/wasm-io.cpp b/src/wasm/wasm-io.cpp index 1f50d7140..d7ba4cf25 100644 --- a/src/wasm/wasm-io.cpp +++ b/src/wasm/wasm-io.cpp @@ -27,7 +27,6 @@ #include "wasm-io.h" #include "wasm-s-parser.h" #include "wasm-binary.h" -#include "support/file.h" namespace wasm { @@ -65,14 +64,17 @@ void ModuleReader::read(std::string filename, Module& wasm) { } } +void ModuleWriter::writeText(Module& wasm, Output& output) { + WasmPrinter::printModule(&wasm, output.getStream()); +} + void ModuleWriter::writeText(Module& wasm, std::string filename) { if (debug) std::cerr << "writing text to " << filename << "\n"; Output output(filename, Flags::Text, debug ? Flags::Debug : Flags::Release); - WasmPrinter::printModule(&wasm, output.getStream()); + writeText(wasm, output); } -void ModuleWriter::writeBinary(Module& wasm, std::string filename) { - if (debug) std::cerr << "writing binary to " << filename << "\n"; +void ModuleWriter::writeBinary(Module& wasm, Output& output) { BufferWithRandomAccess buffer(debug); WasmBinaryWriter writer(&wasm, buffer, debug); // if debug info is used, then we want to emit the names section @@ -85,13 +87,26 @@ void ModuleWriter::writeBinary(Module& wasm, std::string filename) { } if (symbolMap.size() > 0) writer.setSymbolMap(symbolMap); writer.write(); - Output output(filename, Flags::Binary, debug ? Flags::Debug : Flags::Release); buffer.writeTo(output); if (sourceMapStream) { sourceMapStream->close(); } } +void ModuleWriter::writeBinary(Module& wasm, std::string filename) { + if (debug) std::cerr << "writing binary to " << filename << "\n"; + Output output(filename, Flags::Binary, debug ? Flags::Debug : Flags::Release); + writeBinary(wasm, output); +} + +void ModuleWriter::write(Module& wasm, Output& output) { + if (binary) { + writeBinary(wasm, output); + } else { + writeText(wasm, output); + } +} + void ModuleWriter::write(Module& wasm, std::string filename) { if (binary && filename.size() > 0) { writeBinary(wasm, filename); |