diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index dd7fd954bc51fc..04fa48f63c0302 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -1680,34 +1680,42 @@ static uint8_t mapVisibility(GlobalValue::VisibilityTypes gvVisibility) { } template -static Symbol *createBitcodeSymbol(const std::vector &keptComdats, - const lto::InputFile::Symbol &objSym, - BitcodeFile &f) { - StringRef name = saver.save(objSym.getName()); +static void +createBitcodeSymbol(Symbol *&sym, const std::vector &keptComdats, + const lto::InputFile::Symbol &objSym, BitcodeFile &f) { uint8_t binding = objSym.isWeak() ? STB_WEAK : STB_GLOBAL; uint8_t type = objSym.isTLS() ? STT_TLS : STT_NOTYPE; uint8_t visibility = mapVisibility(objSym.getVisibility()); bool canOmitFromDynSym = objSym.canBeOmittedFromSymbolTable(); + StringRef name; + if (sym) { + name = sym->getName(); + } else { + name = saver.save(objSym.getName()); + sym = symtab->insert(name); + } + int c = objSym.getComdatIndex(); if (objSym.isUndefined() || (c != -1 && !keptComdats[c])) { Undefined newSym(&f, name, binding, visibility, type); if (canOmitFromDynSym) newSym.exportDynamic = false; - Symbol *ret = symtab->addSymbol(newSym); - ret->referenced = true; - return ret; + sym->resolve(newSym); + sym->referenced = true; + return; } - if (objSym.isCommon()) - return symtab->addSymbol( - CommonSymbol{&f, name, binding, visibility, STT_OBJECT, - objSym.getCommonAlignment(), objSym.getCommonSize()}); - - Defined newSym(&f, name, binding, visibility, type, 0, 0, nullptr); - if (canOmitFromDynSym) - newSym.exportDynamic = false; - return symtab->addSymbol(newSym); + if (objSym.isCommon()) { + sym->resolve(CommonSymbol{&f, name, binding, visibility, STT_OBJECT, + objSym.getCommonAlignment(), + objSym.getCommonSize()}); + } else { + Defined newSym(&f, name, binding, visibility, type, 0, 0, nullptr); + if (canOmitFromDynSym) + newSym.exportDynamic = false; + sym->resolve(newSym); + } } template void BitcodeFile::parse() { @@ -1719,10 +1727,11 @@ template void BitcodeFile::parse() { .second); } - symbols.assign(obj->symbols().size(), nullptr); - for (auto it : llvm::enumerate(obj->symbols())) - symbols[it.index()] = - createBitcodeSymbol(keptComdats, it.value(), *this); + symbols.resize(obj->symbols().size()); + for (auto it : llvm::enumerate(obj->symbols())) { + Symbol *&sym = symbols[it.index()]; + createBitcodeSymbol(sym, keptComdats, it.value(), *this); + } for (auto l : obj->getDependentLibraries()) addDependentLibrary(l, this); @@ -1730,9 +1739,11 @@ template void BitcodeFile::parse() { void BitcodeFile::parseLazy() { SymbolTable &symtab = *elf::symtab; - for (const lto::InputFile::Symbol &sym : obj->symbols()) - if (!sym.isUndefined()) - symtab.addSymbol(LazyObject{*this, saver.save(sym.getName())}); + symbols.resize(obj->symbols().size()); + for (auto it : llvm::enumerate(obj->symbols())) + if (!it.value().isUndefined()) + symbols[it.index()] = + symtab.addSymbol(LazyObject{*this, saver.save(it.value().getName())}); } void BinaryFile::parse() {