Skip to content
22 changes: 22 additions & 0 deletions lld/wasm/SyntheticSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -563,8 +563,24 @@ void ElemSection::addEntry(FunctionSymbol *sym) {
// They only exist so that the calls to missing functions can validate.
if (sym->hasTableIndex() || sym->isStub)
return;

uint32_t padding = 0;
uint64_t alignment = 1;

if (indirectFunctions.size() == 0 && padding > 0) {
for (uint32_t i=0; i<padding; i++) {
indirectFunctions.push_back(nullptr);
}
}

sym->setTableIndex(config->tableBase + indirectFunctions.size());
indirectFunctions.emplace_back(sym);

if (alignment > 1) {
for (uint32_t i=0; i<alignment-1; i++) {
indirectFunctions.push_back(nullptr);
}
}
}

void ElemSection::writeBody() {
Expand Down Expand Up @@ -602,6 +618,12 @@ void ElemSection::writeBody() {
writeUleb128(os, indirectFunctions.size(), "elem count");
uint32_t tableIndex = config->tableBase;
for (const FunctionSymbol *sym : indirectFunctions) {
if (sym == nullptr) {
(void) tableIndex;
writeUleb128(os, 0, "function index");
++tableIndex;
continue;
}
assert(sym->getTableIndex() == tableIndex);
(void) tableIndex;
writeUleb128(os, sym->getFunctionIndex(), "function index");
Expand Down