diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -452,7 +452,7 @@ static UndefinedGlobal * createUndefinedGlobal(StringRef name, llvm::wasm::WasmGlobalType *type) { auto *sym = cast(symtab->addUndefinedGlobal( - name, name, defaultModule, WASM_SYMBOL_UNDEFINED, nullptr, type)); + name, None, None, WASM_SYMBOL_UNDEFINED, nullptr, type)); config->allowUndefinedSymbols.insert(sym->getName()); sym->isUsedInRegularObj = true; return sym; @@ -590,7 +590,7 @@ }; static Symbol *addUndefined(StringRef name) { - return symtab->addUndefinedFunction(name, "", "", WASM_SYMBOL_UNDEFINED, + return symtab->addUndefinedFunction(name, None, None, WASM_SYMBOL_UNDEFINED, nullptr, nullptr, false); } diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -437,15 +437,22 @@ Symbol *ObjFile::createUndefined(const WasmSymbol &sym, bool isCalledDirectly) { StringRef name = sym.Info.Name; uint32_t flags = sym.Info.Flags | WASM_SYMBOL_UNDEFINED; + llvm::Optional importModule = sym.Info.ImportModule; + // For backwards compatability with older objects files that use "env" by + // defualt for all imports, treat "env" like no module was specified. + // TODO(sbc): Remove this if we ever rev the object format. + if (importModule && *importModule == defaultModule) { + importModule = None; + } switch (sym.Info.Kind) { case WASM_SYMBOL_TYPE_FUNCTION: if (sym.isBindingLocal()) return make(name, sym.Info.ImportName, - sym.Info.ImportModule, flags, this, + importModule, flags, this, sym.Signature, isCalledDirectly); return symtab->addUndefinedFunction(name, sym.Info.ImportName, - sym.Info.ImportModule, flags, this, + importModule, flags, this, sym.Signature, isCalledDirectly); case WASM_SYMBOL_TYPE_DATA: if (sym.isBindingLocal()) @@ -454,10 +461,10 @@ case WASM_SYMBOL_TYPE_GLOBAL: if (sym.isBindingLocal()) return make(name, sym.Info.ImportName, - sym.Info.ImportModule, flags, this, + importModule, flags, this, sym.GlobalType); return symtab->addUndefinedGlobal(name, sym.Info.ImportName, - sym.Info.ImportModule, flags, this, + importModule, flags, this, sym.GlobalType); case WASM_SYMBOL_TYPE_SECTION: llvm_unreachable("section symbols cannot be undefined"); @@ -526,7 +533,7 @@ if (objSym.isUndefined() || excludedByComdat) { flags |= WASM_SYMBOL_UNDEFINED; if (objSym.isExecutable()) - return symtab->addUndefinedFunction(name, "", "", flags, &f, nullptr, + return symtab->addUndefinedFunction(name, None, None, flags, &f, nullptr, true); return symtab->addUndefinedData(name, flags, &f); } diff --git a/lld/wasm/LTO.cpp b/lld/wasm/LTO.cpp --- a/lld/wasm/LTO.cpp +++ b/lld/wasm/LTO.cpp @@ -77,8 +77,8 @@ static void undefine(Symbol *s) { if (auto f = dyn_cast(s)) - replaceSymbol(f, f->getName(), "", "", 0, f->getFile(), - f->signature); + replaceSymbol(f, f->getName(), None, None, 0, + f->getFile(), f->signature); else if (isa(s)) replaceSymbol(s, s->getName(), 0, s->getFile()); else diff --git a/lld/wasm/SymbolTable.h b/lld/wasm/SymbolTable.h --- a/lld/wasm/SymbolTable.h +++ b/lld/wasm/SymbolTable.h @@ -15,6 +15,7 @@ #include "lld/Common/LLVM.h" #include "llvm/ADT/CachedHashString.h" #include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/Optional.h" namespace lld { namespace wasm { @@ -59,13 +60,13 @@ Symbol *addDefinedEvent(StringRef name, uint32_t flags, InputFile *file, InputEvent *e); - Symbol *addUndefinedFunction(StringRef name, StringRef importName, - StringRef importModule, uint32_t flags, + Symbol *addUndefinedFunction(StringRef name, llvm::Optional importName, + llvm::Optional importModule, uint32_t flags, InputFile *file, const WasmSignature *signature, bool isCalledDirectly); Symbol *addUndefinedData(StringRef name, uint32_t flags, InputFile *file); - Symbol *addUndefinedGlobal(StringRef name, StringRef importName, - StringRef importModule, uint32_t flags, + Symbol *addUndefinedGlobal(StringRef name, llvm::Optional importName, + llvm::Optional importModule, uint32_t flags, InputFile *file, const WasmGlobalType *type); void addLazy(ArchiveFile *f, const llvm::object::Archive::Symbol *sym); diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp --- a/lld/wasm/SymbolTable.cpp +++ b/lld/wasm/SymbolTable.cpp @@ -401,31 +401,32 @@ // become available when the LTO object is read. In this case we silently // replace the empty attributes with the valid ones. template -static void setImportAttributes(T *existing, StringRef importName, - StringRef importModule, InputFile *file) { - if (!importName.empty()) { - if (existing->importName.empty()) +static void setImportAttributes(T *existing, Optional importName, + Optional importModule, InputFile *file) { + if (importName) { + if (!existing->importName) existing->importName = importName; if (existing->importName != importName) error("import name mismatch for symbol: " + toString(*existing) + - "\n>>> defined as " + existing->importName + " in " + - toString(existing->getFile()) + "\n>>> defined as " + importName + + "\n>>> defined as " + *existing->importName + " in " + + toString(existing->getFile()) + "\n>>> defined as " + *importName + " in " + toString(file)); } - if (!importModule.empty()) { - if (existing->importModule.empty()) + if (importModule) { + if (!existing->importModule) existing->importModule = importModule; if (existing->importModule != importModule) error("import module mismatch for symbol: " + toString(*existing) + - "\n>>> defined as " + existing->importModule + " in " + - toString(existing->getFile()) + "\n>>> defined as " + importModule + + "\n>>> defined as " + *existing->importModule + " in " + + toString(existing->getFile()) + "\n>>> defined as " + *importModule + " in " + toString(file)); } } -Symbol *SymbolTable::addUndefinedFunction(StringRef name, StringRef importName, - StringRef importModule, +Symbol *SymbolTable::addUndefinedFunction(StringRef name, + Optional importName, + Optional importModule, uint32_t flags, InputFile *file, const WasmSignature *sig, bool isCalledDirectly) { @@ -494,8 +495,8 @@ return s; } -Symbol *SymbolTable::addUndefinedGlobal(StringRef name, StringRef importName, - StringRef importModule, uint32_t flags, +Symbol *SymbolTable::addUndefinedGlobal(StringRef name, Optional importName, + Optional importModule, uint32_t flags, InputFile *file, const WasmGlobalType *type) { LLVM_DEBUG(dbgs() << "addUndefinedGlobal: " << name << "\n"); diff --git a/lld/wasm/Symbols.h b/lld/wasm/Symbols.h --- a/lld/wasm/Symbols.h +++ b/lld/wasm/Symbols.h @@ -11,6 +11,7 @@ #include "Config.h" #include "lld/Common/LLVM.h" +#include "llvm/ADT/Optional.h" #include "llvm/Object/Archive.h" #include "llvm/Object/Wasm.h" @@ -203,8 +204,8 @@ class UndefinedFunction : public FunctionSymbol { public: - UndefinedFunction(StringRef name, StringRef importName, - StringRef importModule, uint32_t flags, + UndefinedFunction(StringRef name, llvm::Optional importName, + llvm::Optional importModule, uint32_t flags, InputFile *file = nullptr, const WasmSignature *type = nullptr, bool isCalledDirectly = true) @@ -215,8 +216,8 @@ return s->kind() == UndefinedFunctionKind; } - StringRef importName; - StringRef importModule; + llvm::Optional importName; + llvm::Optional importModule; bool isCalledDirectly; }; @@ -335,8 +336,9 @@ class UndefinedGlobal : public GlobalSymbol { public: - UndefinedGlobal(StringRef name, StringRef importName, StringRef importModule, - uint32_t flags, InputFile *file = nullptr, + UndefinedGlobal(StringRef name, llvm::Optional importName, + llvm::Optional importModule, uint32_t flags, + InputFile *file = nullptr, const WasmGlobalType *type = nullptr) : GlobalSymbol(name, UndefinedGlobalKind, flags, file, type), importName(importName), importModule(importModule) {} @@ -345,8 +347,8 @@ return s->kind() == UndefinedGlobalKind; } - StringRef importName; - StringRef importModule; + llvm::Optional importName; + llvm::Optional importModule; }; // Wasm events are features that suspend the current execution and transfer the @@ -510,7 +512,7 @@ // It is important to keep the size of SymbolUnion small for performance and // memory usage reasons. 96 bytes is a soft limit based on the size of // UndefinedFunction on a 64-bit system. -static_assert(sizeof(SymbolUnion) <= 96, "SymbolUnion too large"); +static_assert(sizeof(SymbolUnion) <= 112, "SymbolUnion too large"); void printTraceSymbol(Symbol *sym); void printTraceSymbolUndefined(StringRef name, const InputFile* file); diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -156,11 +156,11 @@ for (const Symbol *sym : importedSymbols) { WasmImport import; if (auto *f = dyn_cast(sym)) { - import.Field = f->importName; - import.Module = f->importModule; + import.Field = f->importName ? *f->importName : sym->getName(); + import.Module = f->importModule ? *f->importModule : defaultModule; } else if (auto *g = dyn_cast(sym)) { - import.Field = g->importName; - import.Module = g->importModule; + import.Field = g->importName ? *g->importName : sym->getName(); + import.Module = g->importModule ? *g->importModule : defaultModule; } else { import.Field = sym->getName(); import.Module = defaultModule; diff --git a/llvm/include/llvm/BinaryFormat/Wasm.h b/llvm/include/llvm/BinaryFormat/Wasm.h --- a/llvm/include/llvm/BinaryFormat/Wasm.h +++ b/llvm/include/llvm/BinaryFormat/Wasm.h @@ -15,6 +15,7 @@ #define LLVM_BINARYFORMAT_WASM_H #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" @@ -178,9 +179,12 @@ StringRef Name; uint8_t Kind; uint32_t Flags; - StringRef ImportModule; // For undefined symbols the module of the import - StringRef ImportName; // For undefined symbols the name of the import - StringRef ExportName; // For symbols to be exported from the final module + // For undefined symbols the module of the import + Optional ImportModule; + // For undefined symbols the name of the import + Optional ImportName; + // For symbols to be exported from the final module + Optional ExportName; union { // For function or global symbols, the index in function or global index // space. diff --git a/llvm/include/llvm/MC/MCSymbolWasm.h b/llvm/include/llvm/MC/MCSymbolWasm.h --- a/llvm/include/llvm/MC/MCSymbolWasm.h +++ b/llvm/include/llvm/MC/MCSymbolWasm.h @@ -31,8 +31,6 @@ const MCExpr *SymbolSize = nullptr; 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 *Name, bool isTemporary) : MCSymbol(SymbolKindWasm, Name, isTemporary) {} static bool classof(const MCSymbol *S) { return S->isWasm(); } @@ -75,7 +73,7 @@ if (ImportModule.hasValue()) { return ImportModule.getValue(); } - return "env"; + return ""; } void setImportModule(StringRef Name) { ImportModule = std::string(std::string(Name)); diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -1123,7 +1123,6 @@ // valid without it. In the future, we could perhaps be more clever and omit // it if there are no loads or stores. wasm::WasmImport MemImport; - MemImport.Module = "env"; MemImport.Field = "__linear_memory"; MemImport.Kind = wasm::WASM_EXTERNAL_MEMORY; Imports.push_back(MemImport); @@ -1132,7 +1131,6 @@ // valid without it. In the future, we could perhaps be more clever and omit // it if there are no indirect calls. wasm::WasmImport TableImport; - TableImport.Module = "env"; TableImport.Field = "__indirect_function_table"; TableImport.Kind = wasm::WASM_EXTERNAL_TABLE; TableImport.Table.ElemType = wasm::WASM_TYPE_FUNCREF; diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -508,13 +508,16 @@ Function.SymbolName = Info.Name; } else { wasm::WasmImport &Import = *ImportedFunctions[Info.ElementIndex]; - if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) + if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) { Info.Name = readString(Ctx); - else + Info.ImportName = Import.Field; + } else { Info.Name = Import.Field; + } Signature = &Signatures[Import.SigIndex]; - Info.ImportName = Import.Field; - Info.ImportModule = Import.Module; + if (!Import.Module.empty()) { + Info.ImportModule = Import.Module; + } } break; @@ -537,13 +540,17 @@ Global.SymbolName = Info.Name; } else { wasm::WasmImport &Import = *ImportedGlobals[Info.ElementIndex]; - if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) + if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) { Info.Name = readString(Ctx); - else + Info.ImportName = Import.Field; + } else { Info.Name = Import.Field; + } GlobalType = &Import.Global; Info.ImportName = Import.Field; - Info.ImportModule = Import.Module; + if (!Import.Module.empty()) { + Info.ImportModule = Import.Module; + } } break; @@ -597,14 +604,17 @@ } else { wasm::WasmImport &Import = *ImportedEvents[Info.ElementIndex]; - if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) + if ((Info.Flags & wasm::WASM_SYMBOL_EXPLICIT_NAME) != 0) { Info.Name = readString(Ctx); - else + Info.ImportName = Import.Field; + } else { Info.Name = Import.Field; + } EventType = &Import.Event; Signature = &Signatures[EventType->SigIndex]; - Info.ImportName = Import.Field; - Info.ImportModule = Import.Module; + if (!Import.Module.empty()) { + Info.ImportModule = Import.Module; + } } break; } diff --git a/llvm/test/MC/WebAssembly/assembler-binary.ll b/llvm/test/MC/WebAssembly/assembler-binary.ll --- a/llvm/test/MC/WebAssembly/assembler-binary.ll +++ b/llvm/test/MC/WebAssembly/assembler-binary.ll @@ -46,19 +46,19 @@ ; CHECK-NEXT: ReturnTypes: [] ; CHECK-NEXT: - Type: IMPORT ; CHECK-NEXT: Imports: -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __linear_memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Memory: ; CHECK-NEXT: Initial: 0x00000000 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __indirect_function_table ; CHECK-NEXT: Kind: TABLE ; CHECK-NEXT: Table: ; CHECK-NEXT: ElemType: FUNCREF ; CHECK-NEXT: Limits: ; CHECK-NEXT: Initial: 0x00000000 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: bar ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 1 diff --git a/llvm/test/MC/WebAssembly/comdat.ll b/llvm/test/MC/WebAssembly/comdat.ll --- a/llvm/test/MC/WebAssembly/comdat.ll +++ b/llvm/test/MC/WebAssembly/comdat.ll @@ -33,19 +33,19 @@ ; CHECK-NEXT: - I32 ; CHECK-NEXT: - Type: IMPORT ; CHECK-NEXT: Imports: -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __linear_memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Memory: ; CHECK-NEXT: Initial: 0x00000001 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __indirect_function_table ; CHECK-NEXT: Kind: TABLE ; CHECK-NEXT: Table: ; CHECK-NEXT: ElemType: FUNCREF ; CHECK-NEXT: Limits: ; CHECK-NEXT: Initial: 0x00000000 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: funcImport ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 0 diff --git a/llvm/test/MC/WebAssembly/custom-sections.ll b/llvm/test/MC/WebAssembly/custom-sections.ll --- a/llvm/test/MC/WebAssembly/custom-sections.ll +++ b/llvm/test/MC/WebAssembly/custom-sections.ll @@ -15,18 +15,18 @@ ; CHECK: Section { ; CHECK: Type: CUSTOM (0x0) ; CHECK: Size: 3 -; CHECK: Offset: 72 +; CHECK: Offset: 66 ; CHECK: Name: red ; CHECK: } ; CHECK: Section { ; CHECK: Type: CUSTOM (0x0) ; CHECK: Size: 6 -; CHECK: Offset: 85 +; CHECK: Offset: 79 ; CHECK: Name: green ; CHECK: } ; CHECK: Section { ; CHECK: Type: CUSTOM (0x0) ; CHECK: Size: 25 -; CHECK: Offset: 118 +; CHECK: Offset: 112 ; CHECK: Name: producers ; CHECK: } diff --git a/llvm/test/MC/WebAssembly/data-section.s b/llvm/test/MC/WebAssembly/data-section.s --- a/llvm/test/MC/WebAssembly/data-section.s +++ b/llvm/test/MC/WebAssembly/data-section.s @@ -40,12 +40,12 @@ # BIN-NEXT: - I32 # BIN-NEXT: - Type: IMPORT # BIN-NEXT: Imports: -# BIN-NEXT: - Module: env +# BIN-NEXT: - Module: '' # BIN-NEXT: Field: __linear_memory # BIN-NEXT: Kind: MEMORY # BIN-NEXT: Memory: # BIN-NEXT: Initial: 0x00000001 -# BIN-NEXT: - Module: env +# BIN-NEXT: - Module: '' # BIN-NEXT: Field: __indirect_function_table # BIN-NEXT: Kind: TABLE # BIN-NEXT: Table: diff --git a/llvm/test/MC/WebAssembly/debug-info.ll b/llvm/test/MC/WebAssembly/debug-info.ll --- a/llvm/test/MC/WebAssembly/debug-info.ll +++ b/llvm/test/MC/WebAssembly/debug-info.ll @@ -11,33 +11,33 @@ ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: IMPORT (0x2) -; CHECK-NEXT: Size: 58 +; CHECK-NEXT: Size: 52 ; CHECK-NEXT: Offset: 18 ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: FUNCTION (0x3) ; CHECK-NEXT: Size: 2 -; CHECK-NEXT: Offset: 82 +; CHECK-NEXT: Offset: 76 ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: ELEM (0x9) ; CHECK-NEXT: Size: 7 -; CHECK-NEXT: Offset: 90 +; CHECK-NEXT: Offset: 84 ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: DATACOUNT (0xC) ; CHECK-NEXT: Size: 1 -; CHECK-NEXT: Offset: 103 +; CHECK-NEXT: Offset: 97 ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CODE (0xA) ; CHECK-NEXT: Size: 4 -; CHECK-NEXT: Offset: 110 +; CHECK-NEXT: Offset: 104 ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: DATA (0xB) ; CHECK-NEXT: Size: 19 -; CHECK-NEXT: Offset: 120 +; CHECK-NEXT: Offset: 114 ; CHECK-NEXT: Segments [ ; CHECK-NEXT: Segment { ; CHECK-NEXT: Name: .data.foo @@ -54,79 +54,79 @@ ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 121 -; CHECK-NEXT: Offset: 145 +; CHECK-NEXT: Offset: 139 ; CHECK-NEXT: Name: .debug_str ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 86 -; CHECK-NEXT: Offset: 283 +; CHECK-NEXT: Offset: 277 ; CHECK-NEXT: Name: .debug_abbrev ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 111 -; CHECK-NEXT: Offset: 389 +; CHECK-NEXT: Offset: 383 ; CHECK-NEXT: Name: .debug_info ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 42 -; CHECK-NEXT: Offset: 518 +; CHECK-NEXT: Offset: 512 ; CHECK-NEXT: Name: .debug_pubnames ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 26 -; CHECK-NEXT: Offset: 582 +; CHECK-NEXT: Offset: 576 ; CHECK-NEXT: Name: .debug_pubtypes ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 57 -; CHECK-NEXT: Offset: 630 +; CHECK-NEXT: Offset: 624 ; CHECK-NEXT: Name: .debug_line ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 88 -; CHECK-NEXT: Offset: 705 +; CHECK-NEXT: Offset: 699 ; CHECK-NEXT: Name: linking ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 9 -; CHECK-NEXT: Offset: 807 +; CHECK-NEXT: Offset: 801 ; CHECK-NEXT: Name: reloc.DATA ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 58 -; CHECK-NEXT: Offset: 833 +; CHECK-NEXT: Offset: 827 ; CHECK-NEXT: Name: reloc..debug_info ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 6 -; CHECK-NEXT: Offset: 915 +; CHECK-NEXT: Offset: 909 ; CHECK-NEXT: Name: reloc..debug_pubnames ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 6 -; CHECK-NEXT: Offset: 949 +; CHECK-NEXT: Offset: 943 ; CHECK-NEXT: Name: reloc..debug_pubtypes ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 6 -; CHECK-NEXT: Offset: 983 +; CHECK-NEXT: Offset: 977 ; CHECK-NEXT: Name: reloc..debug_line ; CHECK-NEXT: } ; CHECK-NEXT: Section { ; CHECK-NEXT: Type: CUSTOM (0x0) ; CHECK-NEXT: Size: 77 -; CHECK-NEXT: Offset: 1013 +; CHECK-NEXT: Offset: 1007 ; CHECK-NEXT: Name: producers ; CHECK-NEXT: } ; CHECK-NEXT:] @@ -185,8 +185,6 @@ ; CHECK-NEXT: Flags [ (0x10) ; CHECK-NEXT: UNDEFINED (0x10) ; CHECK-NEXT: ] -; CHECK-NEXT: ImportName: -; CHECK-NEXT: ImportModule: ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: ptr2 diff --git a/llvm/test/MC/WebAssembly/event-section.ll b/llvm/test/MC/WebAssembly/event-section.ll --- a/llvm/test/MC/WebAssembly/event-section.ll +++ b/llvm/test/MC/WebAssembly/event-section.ll @@ -56,4 +56,4 @@ ; SEC: Type: EVENT (0xD) ; SEC-NEXT: Size: 3 -; SEC-NEXT: Offset: 97 +; SEC-NEXT: Offset: 91 diff --git a/llvm/test/MC/WebAssembly/external-func-address.ll b/llvm/test/MC/WebAssembly/external-func-address.ll --- a/llvm/test/MC/WebAssembly/external-func-address.ll +++ b/llvm/test/MC/WebAssembly/external-func-address.ll @@ -39,17 +39,17 @@ ; CHECK-NEXT: - I32 ; CHECK: - Type: IMPORT ; CHECK-NEXT: Imports: -; CHECK: - Module: env +; CHECK: - Module: '' ; CHECK-NEXT: Field: __linear_memory -; CHECK: - Module: env +; CHECK: - Module: '' ; CHECK-NEXT: Field: __indirect_function_table -; CHECK: - Module: env +; CHECK: - Module: '' ; CHECK-NEXT: Field: varargs ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 1 ; CHECK: - Module: somewhere ; CHECK-NEXT: Field: something -; CHECK: - Module: env +; CHECK: - Module: '' ; CHECK-NEXT: Field: f1 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 0 diff --git a/llvm/test/MC/WebAssembly/global-ctor-dtor.ll b/llvm/test/MC/WebAssembly/global-ctor-dtor.ll --- a/llvm/test/MC/WebAssembly/global-ctor-dtor.ll +++ b/llvm/test/MC/WebAssembly/global-ctor-dtor.ll @@ -21,35 +21,35 @@ ; CHECK: - Type: IMPORT ; CHECK-NEXT: Imports: -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __linear_memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Memory: ; CHECK-NEXT: Initial: 0x00000001 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __indirect_function_table ; CHECK-NEXT: Kind: TABLE ; CHECK-NEXT: Table: ; CHECK-NEXT: ElemType: FUNCREF ; CHECK-NEXT: Limits: ; CHECK-NEXT: Initial: 0x00000002 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: func3 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 1 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: __cxa_atexit ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 2 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: func2 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 1 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: func1 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 1 -; CHECK-NEXT: - Module: env +; CHECK-NEXT: - Module: '' ; CHECK-NEXT: Field: func0 ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: SigIndex: 1 diff --git a/llvm/test/MC/WebAssembly/import-module.s b/llvm/test/MC/WebAssembly/import-module.s --- a/llvm/test/MC/WebAssembly/import-module.s +++ b/llvm/test/MC/WebAssembly/import-module.s @@ -21,7 +21,7 @@ # CHECK-NEXT: Field: qux # CHECK-NEXT: Kind: FUNCTION -# CHECK: - Module: env +# CHECK: - Module: '' # CHECK-NEXT: Field: plain # CHECK-NEXT: Kind: FUNCTION diff --git a/llvm/test/MC/WebAssembly/reloc-pic.s b/llvm/test/MC/WebAssembly/reloc-pic.s --- a/llvm/test/MC/WebAssembly/reloc-pic.s +++ b/llvm/test/MC/WebAssembly/reloc-pic.s @@ -57,19 +57,19 @@ # CHECK-NEXT: - I32 # CHECK-NEXT: - Type: IMPORT # CHECK-NEXT: Imports: -# CHECK-NEXT: - Module: env +# CHECK-NEXT: - Module: '' # CHECK-NEXT: Field: __linear_memory # CHECK-NEXT: Kind: MEMORY # CHECK-NEXT: Memory: # CHECK-NEXT: Initial: 0x00000001 -# CHECK-NEXT: - Module: env +# CHECK-NEXT: - Module: '' # CHECK-NEXT: Field: __indirect_function_table # CHECK-NEXT: Kind: TABLE # CHECK-NEXT: Table: # CHECK-NEXT: ElemType: FUNCREF # CHECK-NEXT: Limits: # CHECK-NEXT: Initial: 0x00000000 -# CHECK-NEXT: - Module: env +# CHECK-NEXT: - Module: '' # CHECK-NEXT: Field: default_func # CHECK-NEXT: Kind: FUNCTION # CHECK-NEXT: SigIndex: 0 diff --git a/llvm/test/MC/WebAssembly/stack-ptr.ll b/llvm/test/MC/WebAssembly/stack-ptr.ll --- a/llvm/test/MC/WebAssembly/stack-ptr.ll +++ b/llvm/test/MC/WebAssembly/stack-ptr.ll @@ -12,7 +12,7 @@ ; CHECK: - Type: IMPORT ; CHECK: Imports: -; CHECK: - Module: env +; CHECK: - Module: '' ; CHECK: Field: __stack_pointer ; CHECK: Kind: GLOBAL ; CHECK: GlobalType: I32 diff --git a/llvm/test/MC/WebAssembly/type-index.s b/llvm/test/MC/WebAssembly/type-index.s --- a/llvm/test/MC/WebAssembly/type-index.s +++ b/llvm/test/MC/WebAssembly/type-index.s @@ -33,12 +33,12 @@ # BIN-NEXT: - F64 # BIN-NEXT: - Type: IMPORT # BIN-NEXT: Imports: -# BIN-NEXT: - Module: env +# BIN-NEXT: - Module: '' # BIN-NEXT: Field: __linear_memory # BIN-NEXT: Kind: MEMORY # BIN-NEXT: Memory: # BIN-NEXT: Initial: 0x00000000 -# BIN-NEXT: - Module: env +# BIN-NEXT: - Module: '' # BIN-NEXT: Field: __indirect_function_table # BIN-NEXT: Kind: TABLE # BIN-NEXT: Table: diff --git a/llvm/test/MC/WebAssembly/weak-alias.s b/llvm/test/MC/WebAssembly/weak-alias.s --- a/llvm/test/MC/WebAssembly/weak-alias.s +++ b/llvm/test/MC/WebAssembly/weak-alias.s @@ -83,12 +83,12 @@ # CHECK-NEXT: - I32 # CHECK-NEXT: - Type: IMPORT # CHECK-NEXT: Imports: -# CHECK-NEXT: - Module: env +# CHECK-NEXT: - Module: '' # CHECK-NEXT: Field: __linear_memory # CHECK-NEXT: Kind: MEMORY # CHECK-NEXT: Memory: # CHECK-NEXT: Initial: 0x00000001 -# CHECK-NEXT: - Module: env +# CHECK-NEXT: - Module: '' # CHECK-NEXT: Field: __indirect_function_table # CHECK-NEXT: Kind: TABLE # CHECK-NEXT: Table: diff --git a/llvm/test/tools/llvm-readobj/wasm/symbols.test b/llvm/test/tools/llvm-readobj/wasm/symbols.test --- a/llvm/test/tools/llvm-readobj/wasm/symbols.test +++ b/llvm/test/tools/llvm-readobj/wasm/symbols.test @@ -26,7 +26,6 @@ # CHECK-NEXT: Flags [ (0x10) # CHECK-NEXT: UNDEFINED (0x10) # CHECK-NEXT: ] -# CHECK-NEXT: ImportName: puts # CHECK-NEXT: ImportModule: env # CHECK-NEXT: ElementIndex: 0x0 # CHECK-NEXT: } @@ -44,7 +43,6 @@ # CHECK-NEXT: Flags [ (0x10) # CHECK-NEXT: UNDEFINED (0x10) # CHECK-NEXT: ] -# CHECK-NEXT: ImportName: SomeOtherFunction # CHECK-NEXT: ImportModule: env # CHECK-NEXT: ElementIndex: 0x1 # CHECK-NEXT: } diff --git a/llvm/test/tools/llvm-readobj/wasm/wasm-imports.test b/llvm/test/tools/llvm-readobj/wasm/wasm-imports.test --- a/llvm/test/tools/llvm-readobj/wasm/wasm-imports.test +++ b/llvm/test/tools/llvm-readobj/wasm/wasm-imports.test @@ -107,7 +107,6 @@ # CHECK-NEXT: Flags [ (0x10) # CHECK-NEXT: UNDEFINED (0x10) # CHECK-NEXT: ] -# CHECK-NEXT: ImportName: foo # CHECK-NEXT: ImportModule: red # CHECK-NEXT: ElementIndex: 0x0 # CHECK-NEXT: } diff --git a/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/WasmDumper.cpp --- a/llvm/tools/llvm-readobj/WasmDumper.cpp +++ b/llvm/tools/llvm-readobj/WasmDumper.cpp @@ -227,8 +227,12 @@ W.printFlags("Flags", Symbol.Info.Flags, makeArrayRef(WasmSymbolFlags)); if (Symbol.Info.Flags & wasm::WASM_SYMBOL_UNDEFINED) { - W.printString("ImportName", Symbol.Info.ImportName); - W.printString("ImportModule", Symbol.Info.ImportModule); + if (Symbol.Info.ImportName) { + W.printString("ImportName", *Symbol.Info.ImportName); + } + if (Symbol.Info.ImportModule) { + W.printString("ImportModule", *Symbol.Info.ImportModule); + } } if (Symbol.Info.Kind != wasm::WASM_SYMBOL_TYPE_DATA) { W.printHex("ElementIndex", Symbol.Info.ElementIndex);