forked from OSchip/llvm-project
[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:
parent
fb1dc77bfd
commit
f48923e884
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue