Index: lld/wasm/SymbolTable.cpp =================================================================== --- lld/wasm/SymbolTable.cpp +++ lld/wasm/SymbolTable.cpp @@ -74,7 +74,7 @@ static void reportTypeError(const Symbol *Existing, const InputFile *File, StringRef Type) { error("symbol type mismatch: " + toString(*Existing) + "\n>>> defined as " + - toString(Existing->getWasmType()) + " in " + + toString(getWasmType(Existing)) + " in " + toString(Existing->getFile()) + "\n>>> defined as " + Type + " in " + toString(File)); } Index: lld/wasm/Symbols.h =================================================================== --- lld/wasm/Symbols.h +++ lld/wasm/Symbols.h @@ -91,8 +91,6 @@ uint32_t getOutputSymbolIndex() const; void setOutputSymbolIndex(uint32_t Index); - WasmSymbolType getWasmType() const; - protected: Symbol(StringRef Name, Kind K, uint32_t Flags, InputFile *F) : Name(Name), SymbolKind(K), Flags(Flags), File(F) {} @@ -315,6 +313,8 @@ return new (S) T(std::forward(Arg)...); } +WasmSymbolType getWasmType(const Symbol *Sym); + } // namespace wasm // Returns a symbol name for an error message. Index: lld/wasm/Symbols.cpp =================================================================== --- lld/wasm/Symbols.cpp +++ lld/wasm/Symbols.cpp @@ -29,22 +29,6 @@ DefinedData *WasmSym::HeapBase; DefinedGlobal *WasmSym::StackPointer; -WasmSymbolType Symbol::getWasmType() const { - switch (SymbolKind) { - case Symbol::DefinedFunctionKind: - case Symbol::UndefinedFunctionKind: - return llvm::wasm::WASM_SYMBOL_TYPE_FUNCTION; - case Symbol::DefinedDataKind: - case Symbol::UndefinedDataKind: - return llvm::wasm::WASM_SYMBOL_TYPE_DATA; - case Symbol::DefinedGlobalKind: - case Symbol::UndefinedGlobalKind: - return llvm::wasm::WASM_SYMBOL_TYPE_GLOBAL; - default: - llvm_unreachable("invalid symbol kind"); - } -} - bool Symbol::hasOutputIndex() const { if (auto *F = dyn_cast(this)) if (F->Function) @@ -182,6 +166,16 @@ Global ? &Global->getType() : nullptr), Global(Global) {} +WasmSymbolType lld::wasm::getWasmType(const Symbol *Sym) { + if (isa(Sym)) + return llvm::wasm::WASM_SYMBOL_TYPE_FUNCTION; + if (isa(Sym)) + return llvm::wasm::WASM_SYMBOL_TYPE_DATA; + if (isa(Sym)) + return llvm::wasm::WASM_SYMBOL_TYPE_GLOBAL; + llvm_unreachable("invalid symbol kind"); +} + std::string lld::toString(const wasm::Symbol &Sym) { if (Config->Demangle) if (Optional S = demangleItanium(Sym.getName())) Index: lld/wasm/Writer.cpp =================================================================== --- lld/wasm/Writer.cpp +++ lld/wasm/Writer.cpp @@ -405,7 +405,7 @@ writeUleb128(SubSection.getStream(), SymtabEntries.size(), "num symbols"); for (const Symbol *Sym : SymtabEntries) { assert(Sym->isDefined() || Sym->isUndefined()); - WasmSymbolType Kind = Sym->getWasmType(); + WasmSymbolType Kind = getWasmType(Sym); uint32_t Flags = getWasmFlags(Sym); writeUleb128(SubSection.getStream(), Kind, "sym kind");