diff options
Diffstat (limited to 'lld/MachO/SymbolTable.cpp')
| -rw-r--r-- | lld/MachO/SymbolTable.cpp | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/lld/MachO/SymbolTable.cpp b/lld/MachO/SymbolTable.cpp index baddddcb76fb..a7db5a3ac96e 100644 --- a/lld/MachO/SymbolTable.cpp +++ b/lld/MachO/SymbolTable.cpp @@ -61,8 +61,8 @@ struct DuplicateSymbolDiag { SmallVector<DuplicateSymbolDiag> dupSymDiags; } // namespace -// Move symbols at \p fromOff in \p fromIsec into \p toIsec, unless that symbol -// is \p skip. +// Move local symbols at \p fromOff in \p fromIsec into \p toIsec, unless that +// symbol is \p skip, in which case we just remove it. static void transplantSymbolsAtOffset(InputSection *fromIsec, InputSection *toIsec, Defined *skip, uint64_t fromOff, uint64_t toOff) { @@ -78,22 +78,23 @@ static void transplantSymbolsAtOffset(InputSection *fromIsec, auto insertIt = llvm::upper_bound(toIsec->symbols, toOff, symSucceedsOff); llvm::erase_if(fromIsec->symbols, [&](Symbol *s) { auto *d = cast<Defined>(s); - if (d->value != fromOff) + if (d == skip) + return true; + if (d->value != fromOff || d->isExternal()) return false; - if (d != skip) { - // This repeated insertion will be quadratic unless insertIt is the end - // iterator. However, that is typically the case for files that have - // .subsections_via_symbols set. - insertIt = toIsec->symbols.insert(insertIt, d); - d->originalIsec = toIsec; - d->value = toOff; - // We don't want to have more than one unwindEntry at a given address, so - // drop the redundant ones. We We can safely drop the unwindEntries of - // the symbols in fromIsec since we will be adding another unwindEntry as - // we finish parsing toIsec's file. (We can assume that toIsec has its - // own unwindEntry because of the ODR.) - d->originalUnwindEntry = nullptr; - } + + // This repeated insertion will be quadratic unless insertIt is the end + // iterator. However, that is typically the case for files that have + // .subsections_via_symbols set. + insertIt = toIsec->symbols.insert(insertIt, d); + d->originalIsec = toIsec; + d->value = toOff; + // We don't want to have more than one unwindEntry at a given address, so + // drop the redundant ones. We can safely drop the unwindEntries of the + // symbols in fromIsec since we will be adding another unwindEntry as we + // finish parsing toIsec's file. (We can assume that toIsec has its own + // unwindEntry because of the ODR.) + d->originalUnwindEntry = nullptr; return true; }); } |
