[WebAssembly][lld] --importTable flag only imports table if needed

Before, --importTable forced the creation of an indirect function table,
whether it was needed or not.  Now it only imports a table if needed.

Differential Revision: https://reviews.llvm.org/D96872
This commit is contained in:
Andy Wingo 2021-02-17 17:20:28 +01:00
parent fb1dc77bfd
commit f48923e884
2 changed files with 10 additions and 20 deletions

View File

@ -1,7 +1,15 @@
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/start.s -o %t.start.o
# RUN: wasm-ld --import-table -o %t.wasm %t.start.o
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o
# RUN: wasm-ld --export-all --import-table -o %t.wasm %t.start.o %t.o
# RUN: obj2yaml %t.wasm | FileCheck %s
.globl require_function_table
require_function_table:
.functype require_function_table () -> ()
i32.const 1
call_indirect () -> ()
end_function
# Verify the --import-table flag creates a table import
# CHECK: - Type: IMPORT

View File

@ -799,21 +799,6 @@ static TableSymbol *createDefinedIndirectFunctionTable(StringRef name) {
return sym;
}
static TableSymbol *createUndefinedIndirectFunctionTable(StringRef name) {
WasmLimits limits{0, 0, 0}; // Set by the writer.
WasmTableType *type = make<WasmTableType>();
type->ElemType = uint8_t(ValType::FUNCREF);
type->Limits = limits;
StringRef module(defaultModule);
uint32_t flags = config->exportTable ? 0 : WASM_SYMBOL_VISIBILITY_HIDDEN;
flags |= WASM_SYMBOL_UNDEFINED;
Symbol *sym =
symtab->addUndefinedTable(name, name, module, flags, nullptr, type);
sym->markLive();
sym->forceExport = config->exportTable;
return cast<TableSymbol>(sym);
}
static TableSymbol *resolveIndirectFunctionTable() {
Symbol *existing = symtab->find(functionTableName);
if (existing) {
@ -830,10 +815,7 @@ static TableSymbol *resolveIndirectFunctionTable() {
}
if (config->importTable) {
if (existing)
return cast<TableSymbol>(existing);
else
return createUndefinedIndirectFunctionTable(functionTableName);
return cast_or_null<TableSymbol>(existing);
} else if ((existing && existing->isLive()) || config->exportTable) {
// A defined table is required. Either because the user request an exported
// table or because the table symbol is already live. The existing table is