Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
d35493e
start
kripken Jan 29, 2024
77d5646
werk
kripken Jan 29, 2024
5ebd0a1
work
kripken Jan 29, 2024
3049a99
work
kripken Jan 30, 2024
56f940e
buid
kripken Jan 30, 2024
83dd068
test
kripken Jan 30, 2024
48089e0
work
kripken Jan 30, 2024
7859d8c
work
kripken Jan 30, 2024
955bbe6
progress
kripken Jan 30, 2024
01c7868
work?
kripken Jan 30, 2024
f00ca07
cleanup
kripken Jan 30, 2024
9dae0b3
father
kripken Jan 30, 2024
ba75182
work
kripken Jan 30, 2024
5adfed4
ment
kripken Jan 30, 2024
2c7779a
work
kripken Jan 30, 2024
9b70621
test
kripken Jan 30, 2024
d20f8d5
format
kripken Jan 30, 2024
c252831
rename
kripken Jan 30, 2024
3397899
rename
kripken Jan 30, 2024
883eba4
rename
kripken Jan 30, 2024
d93ca57
work
kripken Jan 30, 2024
07ce36a
work
kripken Jan 30, 2024
4670f8e
update
kripken Jan 30, 2024
b8fb866
work
kripken Jan 30, 2024
3bb6e3d
work
kripken Jan 31, 2024
3a5ad66
work
kripken Jan 31, 2024
e4d0b77
work
kripken Jan 31, 2024
90fbb25
work
kripken Jan 31, 2024
1a3dc63
work
kripken Jan 31, 2024
8fc15f1
work
kripken Jan 31, 2024
694ef94
test
kripken Jan 31, 2024
4ea57ee
test
kripken Jan 31, 2024
86517b0
format
kripken Jan 31, 2024
b2895ca
yolo
kripken Jan 31, 2024
ae3871e
Update src/passes/StringLowering.cpp
kripken Jan 31, 2024
a8cf56a
feedback: simplify to avoid reverse index map
kripken Jan 31, 2024
a2155ed
feedback: fix name
kripken Jan 31, 2024
2c88536
Merge branch 'string.gathering' into string.lowering
kripken Jan 31, 2024
aad2278
Update src/passes/StringLowering.cpp
kripken Jan 31, 2024
9f6bff7
comment
kripken Jan 31, 2024
0e601ea
Merge remote-tracking branch 'myself/string.gathering' into string.ga…
kripken Jan 31, 2024
7d1969f
Merge branch 'string.gathering' into string.lowering
kripken Jan 31, 2024
d5cc29e
fix
kripken Feb 1, 2024
e31cb73
Merge remote-tracking branch 'origin/main' into string.lowering
kripken Feb 1, 2024
0c9c942
Merge remote-tracking branch 'origin/main' into string.lowering
kripken Feb 2, 2024
65fc8d8
clean
kripken Feb 2, 2024
66746ee
update help test
kripken Feb 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
buid
  • Loading branch information
kripken committed Jan 30, 2024
commit 56f940ec32eba8edda16a91c01f6bb68af840363
25 changes: 14 additions & 11 deletions src/passes/StringLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
//

#include "ir/module-utils.h"
#include "ir/names.h"
#include "ir/find_all.h"
#include "pass.h"
#include "wasm-builder.h"
Expand All @@ -59,7 +60,7 @@ struct StringLowering : public Pass {
std::unordered_map<Name, Index> stringIndexes;

// Pointers to all StringConsts, so that we can replace them.
using StringPtrs = std::vector<StringConst**>;
using StringPtrs = std::vector<Expression**>;
StringPtrs stringPtrs;

// Main entry point.
Expand All @@ -71,19 +72,19 @@ struct StringLowering : public Pass {

// Scan the entire wasm to find the relevant strings and populate our global
// data structures.
void scanStrings() {
void scanStrings(Module* module) {
struct StringWalker : public PostWalker<StringWalker> {
StringPtr& stringPtrs;
StringPtrs& stringPtrs;

StringWalker(StringPtr& stringPtrs) : stringPtrs(stringPtrs) {}
StringWalker(StringPtrs& stringPtrs) : stringPtrs(stringPtrs) {}

void visitStringConst(StringConst* curr) {
stringPtrs.push_back(getCurrentPointer());
}
};

ModuleUtils::ParallelFunctionAnalysis<StringPtrs> analysis(
*wasm, [&](Function* func, StringPtrs& stringPtrs) {
*module, [&](Function* func, StringPtrs& stringPtrs) {
if (!func->imported()) {
StringWalker(stringPtrs).walk(func->body);
}
Expand All @@ -92,13 +93,13 @@ struct StringLowering : public Pass {
// Also walk the global module code (for simplicity, also add it to the
// function map, using a "function" key of nullptr).
auto& globalStrings = analysis.map[nullptr];
StringWalker(globalStrings).walkModuleCode(wasm);
StringWalker(globalStrings).walkModuleCode(module);

// Combine all the strings.
std::unordered_set<Name> stringSet;
for (auto& [_, stringPtrs] : analysis.map) {
for (auto** stringPtr : stringPtrs) {
stringSet.insert((*stringPtr)->name);
stringSet.insert((*stringPtr)->cast<StringConst>()->string);
stringPtrs.push_back(stringPtr);
}
}
Expand All @@ -116,23 +117,25 @@ struct StringLowering : public Pass {
// For each string index, the name of the import that replaces it.
std::vector<Name> importNames;

Type nnexternref = Type(HeapType::ext, NonNullable);

void addImports(Module* module) {
// TOOD: imports should be in front, so they can be used from globals, or
// run sort-globals internally..
Builder builder(*module);
for (auto& string : strings) {
auto name = Names::getValidGlobalName(*module, std::string("string.const_") + string.str);
auto name = Names::getValidGlobalName(*module, std::string("string.const_") + std::string(string.str));
importNames.push_back(name);
module->addGlobal(builder.makeGlobal(name, Type::externref, nullptr, Builder::Immutable));
module->addGlobal(builder.makeGlobal(name, nnexternref, nullptr, Builder::Immutable));
}
}

void replaceStrings(Module* module) {
Builder builder(*module);
for (auto** stringPtr : stringPtrs) {
auto stringConst = *stringPtr;
auto* stringConst = (*stringPtr)->cast<StringConst>();
auto importName = importNames[stringIndexes[stringConst->string]];
*stringPtr = builder.makeGlobalGet(importName, Type::externref);
*stringPtr = builder.makeGlobalGet(importName, nnexternref);
}
}
};
Expand Down