summaryrefslogtreecommitdiffstats
path: root/lld/wasm/SymbolTable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/wasm/SymbolTable.cpp')
-rw-r--r--lld/wasm/SymbolTable.cpp19
1 files changed, 15 insertions, 4 deletions
diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp
index 2a4249e3307..d1e9c054265 100644
--- a/lld/wasm/SymbolTable.cpp
+++ b/lld/wasm/SymbolTable.cpp
@@ -201,7 +201,9 @@ static bool shouldReplace(const Symbol *Existing, InputFile *NewFile,
Symbol *SymbolTable::addDefinedFunction(StringRef Name, uint32_t Flags,
InputFile *File,
InputFunction *Function) {
- LLVM_DEBUG(dbgs() << "addDefinedFunction: " << Name << "\n");
+ LLVM_DEBUG(dbgs() << "addDefinedFunction: " << Name << " ["
+ << (Function ? toString(Function->Signature) : "none")
+ << "]\n");
Symbol *S;
bool WasInserted;
std::tie(S, WasInserted) = insert(Name, File);
@@ -214,8 +216,16 @@ Symbol *SymbolTable::addDefinedFunction(StringRef Name, uint32_t Flags,
if (Function)
checkFunctionType(S, File, &Function->Signature);
- if (shouldReplace(S, File, Flags))
- replaceSymbol<DefinedFunction>(S, Name, Flags, File, Function);
+ if (shouldReplace(S, File, Flags)) {
+ // If the new defined function doesn't have signture (i.e. bitcode
+ // functions) but the old symbols does then preserve the old signature
+ const WasmSignature *OldSig = nullptr;
+ if (auto* F = dyn_cast<FunctionSymbol>(S))
+ OldSig = F->FunctionType;
+ auto NewSym = replaceSymbol<DefinedFunction>(S, Name, Flags, File, Function);
+ if (!NewSym->FunctionType)
+ NewSym->FunctionType = OldSig;
+ }
return S;
}
@@ -263,7 +273,8 @@ Symbol *SymbolTable::addDefinedGlobal(StringRef Name, uint32_t Flags,
Symbol *SymbolTable::addUndefinedFunction(StringRef Name, uint32_t Flags,
InputFile *File,
const WasmSignature *Sig) {
- LLVM_DEBUG(dbgs() << "addUndefinedFunction: " << Name << "\n");
+ LLVM_DEBUG(dbgs() << "addUndefinedFunction: " << Name <<
+ " [" << (Sig ? toString(*Sig) : "none") << "]\n");
Symbol *S;
bool WasInserted;
OpenPOWER on IntegriCloud