Skip to content

Commit 7cc0753

Browse files
committed
[WebAssembly] Support imports from custom module names
Fixes: https://bugs.llvm.org/show_bug.cgi?id=37168 This is only a first pass at supporting these custom import modules. In the long run we most likely want to treat these kinds of symbols very differently. For example, it should not be possible to resolve such as symbol at static link type. Differential Revision: https://reviews.llvm.org/D45796 llvm-svn: 352828
1 parent 1368022 commit 7cc0753

File tree

9 files changed

+48
-14
lines changed

9 files changed

+48
-14
lines changed

lld/test/wasm/import-module.ll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; RUN: llc -filetype=obj %s -o %t.o
2+
; RUN: wasm-ld --allow-undefined -o %t.wasm %t.o
3+
; RUN: obj2yaml %t.wasm | FileCheck %s
4+
5+
target triple = "wasm32-unknown-unknown-wasm"
6+
7+
define void @_start() {
8+
call void @foo();
9+
ret void
10+
}
11+
12+
declare void @foo() #0
13+
14+
attributes #0 = { "wasm-import-module"="bar" }
15+
16+
; CHECK: - Type: IMPORT
17+
; CHECK-NEXT: Imports:
18+
; CHECK-NEXT: - Module: bar
19+
; CHECK-NEXT: Field: foo
20+
; CHECK-NEXT: Kind: FUNCTION
21+
; CHECK-NEXT: SigIndex: 0

lld/wasm/InputFiles.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ Symbol *ObjFile::createUndefined(const WasmSymbol &Sym) {
378378

379379
switch (Sym.Info.Kind) {
380380
case WASM_SYMBOL_TYPE_FUNCTION:
381-
return Symtab->addUndefinedFunction(Name, Flags, this, Sym.Signature);
381+
return Symtab->addUndefinedFunction(Name, Sym.Info.Module, Flags, this,
382+
Sym.Signature);
382383
case WASM_SYMBOL_TYPE_DATA:
383384
return Symtab->addUndefinedData(Name, Flags, this);
384385
case WASM_SYMBOL_TYPE_GLOBAL:
@@ -446,7 +447,7 @@ static Symbol *createBitcodeSymbol(const lto::InputFile::Symbol &ObjSym,
446447

447448
if (ObjSym.isUndefined()) {
448449
if (ObjSym.isExecutable())
449-
return Symtab->addUndefinedFunction(Name, Flags, &F, nullptr);
450+
return Symtab->addUndefinedFunction(Name, kDefaultModule, Flags, &F, nullptr);
450451
return Symtab->addUndefinedData(Name, Flags, &F);
451452
}
452453

lld/wasm/LTO.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ BitcodeCompiler::~BitcodeCompiler() = default;
8080

8181
static void undefine(Symbol *S) {
8282
if (auto F = dyn_cast<DefinedFunction>(S))
83-
replaceSymbol<UndefinedFunction>(F, F->getName(), 0, F->getFile(),
84-
F->Signature);
83+
replaceSymbol<UndefinedFunction>(F, F->getName(), kDefaultModule, 0,
84+
F->getFile(), F->Signature);
8585
else if (isa<DefinedData>(S))
8686
replaceSymbol<UndefinedData>(S, S->getName(), 0, S->getFile());
8787
else

lld/wasm/LTO.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include "lld/Common/LLVM.h"
2424
#include "llvm/ADT/SmallString.h"
25+
#include "Writer.h"
2526
#include <memory>
2627
#include <vector>
2728

lld/wasm/SymbolTable.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,8 @@ Symbol *SymbolTable::addDefinedEvent(StringRef Name, uint32_t Flags,
315315
return S;
316316
}
317317

318-
Symbol *SymbolTable::addUndefinedFunction(StringRef Name, uint32_t Flags,
319-
InputFile *File,
318+
Symbol *SymbolTable::addUndefinedFunction(StringRef Name, StringRef Module,
319+
uint32_t Flags, InputFile *File,
320320
const WasmSignature *Sig) {
321321
LLVM_DEBUG(dbgs() << "addUndefinedFunction: " << Name <<
322322
" [" << (Sig ? toString(*Sig) : "none") << "]\n");
@@ -326,7 +326,7 @@ Symbol *SymbolTable::addUndefinedFunction(StringRef Name, uint32_t Flags,
326326
std::tie(S, WasInserted) = insert(Name, File);
327327

328328
if (WasInserted)
329-
replaceSymbol<UndefinedFunction>(S, Name, Flags, File, Sig);
329+
replaceSymbol<UndefinedFunction>(S, Name, Module, Flags, File, Sig);
330330
else if (auto *Lazy = dyn_cast<LazySymbol>(S))
331331
Lazy->fetch();
332332
else

lld/wasm/SymbolTable.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ class SymbolTable {
5858
Symbol *addDefinedEvent(StringRef Name, uint32_t Flags, InputFile *File,
5959
InputEvent *E);
6060

61-
Symbol *addUndefinedFunction(StringRef Name, uint32_t Flags, InputFile *File,
62-
const WasmSignature *Signature);
61+
Symbol *addUndefinedFunction(StringRef Name, StringRef Module, uint32_t Flags,
62+
InputFile *File, const WasmSignature *Signature);
6363
Symbol *addUndefinedData(StringRef Name, uint32_t Flags, InputFile *File);
6464
Symbol *addUndefinedGlobal(StringRef Name, uint32_t Flags, InputFile *File,
6565
const WasmGlobalType *Type);

lld/wasm/Symbols.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,17 @@ class DefinedFunction : public FunctionSymbol {
155155

156156
class UndefinedFunction : public FunctionSymbol {
157157
public:
158-
UndefinedFunction(StringRef Name, uint32_t Flags, InputFile *File = nullptr,
158+
UndefinedFunction(StringRef Name, StringRef Module, uint32_t Flags,
159+
InputFile *File = nullptr,
159160
const WasmSignature *Type = nullptr)
160-
: FunctionSymbol(Name, UndefinedFunctionKind, Flags, File, Type) {}
161+
: FunctionSymbol(Name, UndefinedFunctionKind, Flags, File, Type),
162+
Module(Module) {}
161163

162164
static bool classof(const Symbol *S) {
163165
return S->kind() == UndefinedFunctionKind;
164166
}
167+
168+
StringRef Module;
165169
};
166170

167171
class SectionSymbol : public Symbol {

lld/wasm/Writer.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ using namespace lld::wasm;
4141

4242
static constexpr int kStackAlignment = 16;
4343
static constexpr const char *kFunctionTableName = "__indirect_function_table";
44+
const char *lld::wasm::kDefaultModule = "env";
4445

4546
namespace {
4647

@@ -156,7 +157,7 @@ void Writer::createImportSection() {
156157

157158
if (Config->ImportMemory) {
158159
WasmImport Import;
159-
Import.Module = "env";
160+
Import.Module = kDefaultModule;
160161
Import.Field = "memory";
161162
Import.Kind = WASM_EXTERNAL_MEMORY;
162163
Import.Memory.Flags = 0;
@@ -173,7 +174,7 @@ void Writer::createImportSection() {
173174
if (Config->ImportTable) {
174175
uint32_t TableSize = TableBase + IndirectFunctions.size();
175176
WasmImport Import;
176-
Import.Module = "env";
177+
Import.Module = kDefaultModule;
177178
Import.Field = kFunctionTableName;
178179
Import.Kind = WASM_EXTERNAL_TABLE;
179180
Import.Table.ElemType = WASM_TYPE_FUNCREF;
@@ -183,7 +184,11 @@ void Writer::createImportSection() {
183184

184185
for (const Symbol *Sym : ImportedSymbols) {
185186
WasmImport Import;
186-
Import.Module = "env";
187+
if (auto *F = dyn_cast<UndefinedFunction>(Sym))
188+
Import.Module = F->Module;
189+
else
190+
Import.Module = kDefaultModule;
191+
187192
Import.Field = Sym->getName();
188193
if (auto *FunctionSym = dyn_cast<FunctionSymbol>(Sym)) {
189194
Import.Kind = WASM_EXTERNAL_FUNCTION;

lld/wasm/Writer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ namespace wasm {
1414

1515
void writeResult();
1616

17+
extern const char *kDefaultModule;
18+
1719
} // namespace wasm
1820
} // namespace lld
1921

0 commit comments

Comments
 (0)