diff --git a/lld/test/wasm/import-table-explicit.s b/lld/test/wasm/import-table-explicit.s new file mode 100644 index 00000000000000..1dc21beba06294 --- /dev/null +++ b/lld/test/wasm/import-table-explicit.s @@ -0,0 +1,26 @@ +# RUN: llvm-mc -mattr=+reference-types -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o +# RUN: wasm-ld --import-table -o %t.wasm %t.o +# RUN: obj2yaml %t.wasm | FileCheck %s + +.globl __indirect_function_table +.tabletype __indirect_function_table, funcref + +.globl _start +_start: + .functype _start () -> () + i32.const 1 + call_indirect __indirect_function_table, () -> () + end_function + +# Verify the --import-table flag creates a table import + +# CHECK: - Type: IMPORT +# CHECK-NEXT: Imports: +# CHECK-NEXT: - Module: env +# CHECK-NEXT: Field: __indirect_function_table +# CHECK-NEXT: Kind: TABLE +# CHECK-NEXT: Table: +# CHECK-NEXT: Index: 0 +# CHECK-NEXT: ElemType: FUNCREF +# CHECK-NEXT: Limits: +# CHECK-NEXT: Minimum: 0x1 diff --git a/lld/test/wasm/import-table.test b/lld/test/wasm/import-table.s similarity index 63% rename from lld/test/wasm/import-table.test rename to lld/test/wasm/import-table.s index 73dc7189bbf28b..7a0c94d1302769 100644 --- a/lld/test/wasm/import-table.test +++ b/lld/test/wasm/import-table.s @@ -1,14 +1,14 @@ -# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/start.s -o %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: wasm-ld --export-all --import-table -o %t.wasm %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 +.globl _start +_start: + .functype _start () -> () + i32.const 1 + # call_indirect instruction implicitly references the function table + call_indirect () -> () + end_function # Verify the --import-table flag creates a table import diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp index 00c347ea3ef243..081f811cd139dd 100644 --- a/lld/wasm/SymbolTable.cpp +++ b/lld/wasm/SymbolTable.cpp @@ -681,10 +681,10 @@ TableSymbol *SymbolTable::createUndefinedIndirectFunctionTable(StringRef name) { WasmTableType *type = make(); type->ElemType = ValType::FUNCREF; type->Limits = limits; - StringRef module(defaultModule); uint32_t flags = config->exportTable ? 0 : WASM_SYMBOL_VISIBILITY_HIDDEN; flags |= WASM_SYMBOL_UNDEFINED; - Symbol *sym = addUndefinedTable(name, name, module, flags, nullptr, type); + Symbol *sym = + addUndefinedTable(name, name, defaultModule, flags, nullptr, type); sym->markLive(); sym->forceExport = config->exportTable; return cast(sym); @@ -724,8 +724,11 @@ TableSymbol *SymbolTable::resolveIndirectFunctionTable(bool required) { } if (config->importTable) { - if (existing) + if (existing) { + existing->importModule = defaultModule; + existing->importName = functionTableName; return cast(existing); + } if (required) return createUndefinedIndirectFunctionTable(functionTableName); } else if ((existing && existing->isLive()) || config->exportTable ||