mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 02:26:05 +00:00
[WebAssembly] Add codegen support for the import_field attribute
This adds the LLVM side of https://reviews.llvm.org/D57602 -- the import_field attribute. See that patch for details. Differential Revision: https://reviews.llvm.org/D57603 llvm-svn: 352931
This commit is contained in:
parent
cae8459ad2
commit
f726e4454c
@ -18,7 +18,8 @@ class MCSymbolWasm : public MCSymbol {
|
||||
bool IsWeak = false;
|
||||
bool IsHidden = false;
|
||||
bool IsComdat = false;
|
||||
std::string ModuleName;
|
||||
Optional<std::string> ImportModule;
|
||||
Optional<std::string> ImportName;
|
||||
wasm::WasmSignature *Signature = nullptr;
|
||||
Optional<wasm::WasmGlobalType> GlobalType;
|
||||
Optional<wasm::WasmEventType> EventType;
|
||||
@ -31,7 +32,7 @@ public:
|
||||
// Use a module name of "env" for now, for compatibility with existing tools.
|
||||
// This is temporary, and may change, as the ABI is not yet stable.
|
||||
MCSymbolWasm(const StringMapEntry<bool> *Name, bool isTemporary)
|
||||
: MCSymbol(SymbolKindWasm, Name, isTemporary), ModuleName("env") {}
|
||||
: MCSymbol(SymbolKindWasm, Name, isTemporary) {}
|
||||
static bool classof(const MCSymbol *S) { return S->isWasm(); }
|
||||
|
||||
const MCExpr *getSize() const { return SymbolSize; }
|
||||
@ -54,8 +55,21 @@ public:
|
||||
bool isComdat() const { return IsComdat; }
|
||||
void setComdat(bool isComdat) { IsComdat = isComdat; }
|
||||
|
||||
const StringRef getModuleName() const { return ModuleName; }
|
||||
void setModuleName(StringRef Name) { ModuleName = Name; }
|
||||
const StringRef getImportModule() const {
|
||||
if (ImportModule.hasValue()) {
|
||||
return ImportModule.getValue();
|
||||
}
|
||||
return "env";
|
||||
}
|
||||
void setImportModule(StringRef Name) { ImportModule = Name; }
|
||||
|
||||
const StringRef getImportName() const {
|
||||
if (ImportName.hasValue()) {
|
||||
return ImportName.getValue();
|
||||
}
|
||||
return getName();
|
||||
}
|
||||
void setImportName(StringRef Name) { ImportName = Name; }
|
||||
|
||||
const wasm::WasmSignature *getSignature() const { return Signature; }
|
||||
void setSignature(wasm::WasmSignature *Sig) { Signature = Sig; }
|
||||
|
@ -118,6 +118,7 @@ bool MCWasmStreamer::EmitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
|
||||
break;
|
||||
|
||||
case MCSA_ELF_TypeObject:
|
||||
case MCSA_Cold:
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1167,8 +1167,8 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
MCSymbolWasm *MemorySym =
|
||||
cast<MCSymbolWasm>(Ctx.getOrCreateSymbol("__linear_memory"));
|
||||
wasm::WasmImport MemImport;
|
||||
MemImport.Module = MemorySym->getModuleName();
|
||||
MemImport.Field = MemorySym->getName();
|
||||
MemImport.Module = MemorySym->getImportModule();
|
||||
MemImport.Field = MemorySym->getImportName();
|
||||
MemImport.Kind = wasm::WASM_EXTERNAL_MEMORY;
|
||||
Imports.push_back(MemImport);
|
||||
|
||||
@ -1178,8 +1178,8 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
MCSymbolWasm *TableSym =
|
||||
cast<MCSymbolWasm>(Ctx.getOrCreateSymbol("__indirect_function_table"));
|
||||
wasm::WasmImport TableImport;
|
||||
TableImport.Module = TableSym->getModuleName();
|
||||
TableImport.Field = TableSym->getName();
|
||||
TableImport.Module = TableSym->getImportModule();
|
||||
TableImport.Field = TableSym->getImportName();
|
||||
TableImport.Kind = wasm::WASM_EXTERNAL_TABLE;
|
||||
TableImport.Table.ElemType = wasm::WASM_TYPE_FUNCREF;
|
||||
Imports.push_back(TableImport);
|
||||
@ -1205,8 +1205,8 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
if (!WS.isDefined() && !WS.isComdat()) {
|
||||
if (WS.isFunction()) {
|
||||
wasm::WasmImport Import;
|
||||
Import.Module = WS.getModuleName();
|
||||
Import.Field = WS.getName();
|
||||
Import.Module = WS.getImportModule();
|
||||
Import.Field = WS.getImportName();
|
||||
Import.Kind = wasm::WASM_EXTERNAL_FUNCTION;
|
||||
Import.SigIndex = getFunctionType(WS);
|
||||
Imports.push_back(Import);
|
||||
@ -1216,8 +1216,8 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
report_fatal_error("undefined global symbol cannot be weak");
|
||||
|
||||
wasm::WasmImport Import;
|
||||
Import.Module = WS.getModuleName();
|
||||
Import.Field = WS.getName();
|
||||
Import.Module = WS.getImportModule();
|
||||
Import.Field = WS.getImportName();
|
||||
Import.Kind = wasm::WASM_EXTERNAL_GLOBAL;
|
||||
Import.Global = WS.getGlobalType();
|
||||
Imports.push_back(Import);
|
||||
@ -1227,8 +1227,8 @@ uint64_t WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
report_fatal_error("undefined event symbol cannot be weak");
|
||||
|
||||
wasm::WasmImport Import;
|
||||
Import.Module = WS.getModuleName();
|
||||
Import.Field = WS.getName();
|
||||
Import.Module = WS.getImportModule();
|
||||
Import.Field = WS.getImportName();
|
||||
Import.Kind = wasm::WASM_EXTERNAL_EVENT;
|
||||
Import.Event.Attribute = wasm::WASM_EVENT_ATTRIBUTE_EXCEPTION;
|
||||
Import.Event.SigIndex = getEventType(WS);
|
||||
|
@ -112,8 +112,15 @@ void WebAssemblyTargetAsmStreamer::emitEventType(const MCSymbolWasm *Sym) {
|
||||
}
|
||||
|
||||
void WebAssemblyTargetAsmStreamer::emitImportModule(const MCSymbolWasm *Sym,
|
||||
StringRef ModuleName) {
|
||||
OS << "\t.import_module\t" << Sym->getName() << ", " << ModuleName << '\n';
|
||||
StringRef ImportModule) {
|
||||
OS << "\t.import_module\t" << Sym->getName() << ", "
|
||||
<< ImportModule << '\n';
|
||||
}
|
||||
|
||||
void WebAssemblyTargetAsmStreamer::emitImportName(const MCSymbolWasm *Sym,
|
||||
StringRef ImportName) {
|
||||
OS << "\t.import_name\t" << Sym->getName() << ", "
|
||||
<< ImportName << '\n';
|
||||
}
|
||||
|
||||
void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) {
|
||||
|
@ -44,7 +44,10 @@ public:
|
||||
virtual void emitEventType(const MCSymbolWasm *Sym) = 0;
|
||||
/// .import_module
|
||||
virtual void emitImportModule(const MCSymbolWasm *Sym,
|
||||
StringRef ModuleName) = 0;
|
||||
StringRef ImportModule) = 0;
|
||||
/// .import_name
|
||||
virtual void emitImportName(const MCSymbolWasm *Sym,
|
||||
StringRef ImportName) = 0;
|
||||
|
||||
protected:
|
||||
void emitValueType(wasm::ValType Type);
|
||||
@ -66,7 +69,8 @@ public:
|
||||
void emitIndIdx(const MCExpr *Value) override;
|
||||
void emitGlobalType(const MCSymbolWasm *Sym) override;
|
||||
void emitEventType(const MCSymbolWasm *Sym) override;
|
||||
void emitImportModule(const MCSymbolWasm *Sym, StringRef ModuleName) override;
|
||||
void emitImportModule(const MCSymbolWasm *Sym, StringRef ImportModule) override;
|
||||
void emitImportName(const MCSymbolWasm *Sym, StringRef ImportName) override;
|
||||
};
|
||||
|
||||
/// This part is for Wasm object output
|
||||
@ -81,7 +85,9 @@ public:
|
||||
void emitGlobalType(const MCSymbolWasm *Sym) override {}
|
||||
void emitEventType(const MCSymbolWasm *Sym) override {}
|
||||
void emitImportModule(const MCSymbolWasm *Sym,
|
||||
StringRef ModuleName) override {}
|
||||
StringRef ImportModule) override {}
|
||||
void emitImportName(const MCSymbolWasm *Sym,
|
||||
StringRef ImportName) override {}
|
||||
};
|
||||
|
||||
/// This part is for null output
|
||||
@ -97,6 +103,7 @@ public:
|
||||
void emitGlobalType(const MCSymbolWasm *) override {}
|
||||
void emitEventType(const MCSymbolWasm *) override {}
|
||||
void emitImportModule(const MCSymbolWasm *, StringRef) override {}
|
||||
void emitImportName(const MCSymbolWasm *, StringRef) override {}
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -114,9 +114,16 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||
F.hasFnAttribute("wasm-import-module")) {
|
||||
StringRef Name =
|
||||
F.getFnAttribute("wasm-import-module").getValueAsString();
|
||||
Sym->setModuleName(Name);
|
||||
Sym->setImportModule(Name);
|
||||
getTargetStreamer()->emitImportModule(Sym, Name);
|
||||
}
|
||||
if (TM.getTargetTriple().isOSBinFormatWasm() &&
|
||||
F.hasFnAttribute("wasm-import-name")) {
|
||||
StringRef Name =
|
||||
F.getFnAttribute("wasm-import-name").getValueAsString();
|
||||
Sym->setImportName(Name);
|
||||
getTargetStreamer()->emitImportName(Sym, Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -12,8 +12,9 @@ define void @test() {
|
||||
declare void @foo() #0
|
||||
declare void @plain()
|
||||
|
||||
attributes #0 = { "wasm-import-module"="bar" }
|
||||
attributes #0 = { "wasm-import-module"="bar" "wasm-import-name"="qux" }
|
||||
|
||||
; CHECK-NOT: .import_module plain
|
||||
; CHECK: .import_module foo, bar
|
||||
; CHECK: .import_name foo, qux
|
||||
; CHECK-NOT: .import_module plain
|
||||
|
@ -8,7 +8,7 @@ target triple = "wasm32-unknown-unknown"
|
||||
declare void @f0(i32) #0
|
||||
@ptr_to_f0 = hidden global void (i32)* @f0, align 4
|
||||
|
||||
attributes #0 = { "wasm-import-module"="somewhere" }
|
||||
attributes #0 = { "wasm-import-module"="somewhere" "wasm-import-name"="something" }
|
||||
|
||||
declare void @f1(i32) #1
|
||||
@ptr_to_f1 = hidden global void (i32)* @f1, align 4
|
||||
@ -47,7 +47,7 @@ define void @call(i32) {
|
||||
; CHECK-NEXT: Kind: FUNCTION
|
||||
; CHECK-NEXT: SigIndex: 1
|
||||
; CHECK: - Module: somewhere
|
||||
; CHECK-NEXT: Field: f0
|
||||
; CHECK-NEXT: Field: something
|
||||
; CHECK: - Module: env
|
||||
; CHECK-NEXT: Field: f1
|
||||
; CHECK-NEXT: Kind: FUNCTION
|
||||
|
Loading…
x
Reference in New Issue
Block a user