summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/wasm-emscripten-finalize.cpp34
-rw-r--r--src/tools/wasm-link-metadata.cpp128
-rw-r--r--src/wasm-io.h4
-rw-r--r--src/wasm/wasm-io.cpp25
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 &section : 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);