diff options
Diffstat (limited to 'llvm/lib/Target/WebAssembly')
3 files changed, 29 insertions, 2 deletions
diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp index b1222283598..739044f6c40 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.cpp @@ -107,6 +107,11 @@ void WebAssemblyTargetAsmStreamer::emitGlobalImport(StringRef name) { OS << "\t.import_global\t" << name << '\n'; } +void WebAssemblyTargetAsmStreamer::emitImportModule(MCSymbolWasm *Sym, + StringRef ModuleName) { + OS << "\t.import_module\t" << Sym->getName() << ", " << ModuleName << '\n'; +} + void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) { OS << "\t.indidx \t" << *Value << '\n'; } @@ -144,6 +149,11 @@ void WebAssemblyTargetELFStreamer::emitIndirectFunctionType( void WebAssemblyTargetELFStreamer::emitGlobalImport(StringRef name) { } +void WebAssemblyTargetELFStreamer::emitImportModule(MCSymbolWasm *Sym, + StringRef ModuleName) { + llvm_unreachable(".import_module encoding not yet implemented"); +} + void WebAssemblyTargetWasmStreamer::emitParam(MCSymbol *Symbol, ArrayRef<MVT> Types) { SmallVector<wasm::ValType, 4> Params; @@ -211,3 +221,8 @@ void WebAssemblyTargetWasmStreamer::emitIndirectFunctionType( void WebAssemblyTargetWasmStreamer::emitGlobalImport(StringRef name) { llvm_unreachable(".global_import is not needed for direct wasm output"); } + +void WebAssemblyTargetWasmStreamer::emitImportModule(MCSymbolWasm *Sym, + StringRef ModuleName) { + Sym->setModuleName(ModuleName); +} diff --git a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h index 539ca9ee8ce..a4ebf27cfa7 100644 --- a/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h +++ b/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyTargetStreamer.h @@ -24,6 +24,7 @@ namespace llvm { class MCELFStreamer; class MCWasmStreamer; +class MCSymbolWasm; /// WebAssembly-specific streamer interface, to implement support /// WebAssembly-specific assembly directives. @@ -47,6 +48,8 @@ public: virtual void emitIndIdx(const MCExpr *Value) = 0; /// .import_global virtual void emitGlobalImport(StringRef name) = 0; + /// .import_module + virtual void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) = 0; protected: void emitValueType(wasm::ValType Type); @@ -68,6 +71,7 @@ public: SmallVectorImpl<MVT> &Results) override; void emitIndIdx(const MCExpr *Value) override; void emitGlobalImport(StringRef name) override; + void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; }; /// This part is for ELF object output @@ -84,6 +88,7 @@ public: SmallVectorImpl<MVT> &Results) override; void emitIndIdx(const MCExpr *Value) override; void emitGlobalImport(StringRef name) override; + void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; }; /// This part is for Wasm object output @@ -100,6 +105,7 @@ public: SmallVectorImpl<MVT> &Results) override; void emitIndIdx(const MCExpr *Value) override; void emitGlobalImport(StringRef name) override; + void emitImportModule(MCSymbolWasm *Sym, StringRef ModuleName) override; }; } // end namespace llvm diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 204d97cbdd4..40eed593f07 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -84,8 +84,14 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { SmallVector<MVT, 4> Results; SmallVector<MVT, 4> Params; ComputeSignatureVTs(F, TM, Params, Results); - getTargetStreamer()->emitIndirectFunctionType(getSymbol(&F), Params, - Results); + MCSymbolWasm *Sym = cast<MCSymbolWasm>(getSymbol(&F)); + getTargetStreamer()->emitIndirectFunctionType(Sym, Params, Results); + + if (F.hasFnAttribute("wasm-import-module")) { + StringRef Name = F.getFnAttribute("wasm-import-module") + .getValueAsString(); + getTargetStreamer()->emitImportModule(Sym, Name); + } } } for (const auto &G : M.globals()) { |