summaryrefslogtreecommitdiff
path: root/src/tools/wasm-emscripten-finalize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/wasm-emscripten-finalize.cpp')
-rw-r--r--src/tools/wasm-emscripten-finalize.cpp34
1 files changed, 31 insertions, 3 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;
}