2020#include < fstream>
2121
2222#include " ir/module-splitting.h"
23- #include " ir/names.h"
2423#include " support/file.h"
2524#include " support/name.h"
2625#include " support/path.h"
2726#include " support/utilities.h"
2827#include " wasm-binary.h"
29- #include " wasm-builder.h"
3028#include " wasm-io.h"
3129#include " wasm-validator.h"
3230
@@ -203,12 +201,24 @@ void writeSymbolMap(Module& wasm, std::string filename) {
203201 runner.run ();
204202}
205203
206- void writePlaceholderMap (const std::map<size_t , Name> placeholderMap,
207- std::string filename) {
204+ void writePlaceholderMap (
205+ Module& wasm,
206+ const std::unordered_map<Name, std::map<size_t , Name>>& placeholderMap,
207+ std::string filename) {
208208 Output output (filename, Flags::Text);
209209 auto & o = output.getStream ();
210- for (auto & [index, func] : placeholderMap) {
211- o << index << ' :' << func << ' \n ' ;
210+ for (Index i = 0 ; i < wasm.tables .size (); i++) {
211+ const auto & table = wasm.tables [i];
212+ auto it = placeholderMap.find (table->name );
213+ if (it != placeholderMap.end ()) {
214+ o << " table " << i << " \n " ;
215+ for (auto & [index, func] : it->second ) {
216+ o << index << ' :' << func << ' \n ' ;
217+ }
218+ if (i < wasm.tables .size () - 1 ) {
219+ o << " \n " ;
220+ }
221+ }
212222 }
213223}
214224
@@ -344,7 +354,8 @@ void splitModule(const WasmSplitOptions& options) {
344354 }
345355
346356 if (options.placeholderMap ) {
347- writePlaceholderMap (splitResults.placeholderMap ,
357+ writePlaceholderMap (wasm,
358+ splitResults.placeholderMap ,
348359 options.primaryOutput + " .placeholders" );
349360 }
350361
@@ -422,6 +433,7 @@ void multiSplitModule(const WasmSplitOptions& options) {
422433 wasm.name = Path::getBaseName (options.output );
423434 }
424435
436+ std::unordered_map<Name, std::map<size_t , Name>> placeholderMap;
425437 for (auto & [mod, funcs] : moduleFuncs) {
426438 if (options.verbose ) {
427439 std::cerr << " Splitting module " << mod << ' \n ' ;
@@ -431,12 +443,14 @@ void multiSplitModule(const WasmSplitOptions& options) {
431443 }
432444 config.secondaryFuncs = std::set<Name>(funcs.begin (), funcs.end ());
433445 auto splitResults = ModuleSplitting::splitFunctions (wasm, config);
434- // TODO: placeholderMap
435446 auto moduleName =
436447 options.outPrefix + mod + (options.emitBinary ? " .wasm" : " .wast" );
437448 if (options.symbolMap ) {
438449 writeSymbolMap (*splitResults.secondary , moduleName + " .symbols" );
439450 }
451+ if (options.placeholderMap ) {
452+ placeholderMap.merge (splitResults.placeholderMap );
453+ }
440454 if (options.emitModuleNames ) {
441455 splitResults.secondary ->name = Path::getBaseName (moduleName);
442456 }
@@ -445,7 +459,9 @@ void multiSplitModule(const WasmSplitOptions& options) {
445459 if (options.symbolMap ) {
446460 writeSymbolMap (wasm, options.output + " .symbols" );
447461 }
448-
462+ if (options.placeholderMap ) {
463+ writePlaceholderMap (wasm, placeholderMap, options.output + " .placeholders" );
464+ }
449465 writeModule (wasm, options.output , options);
450466}
451467
0 commit comments