aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2017-07-04 17:32:51 +0000
committerEd Maste <emaste@FreeBSD.org>2017-07-04 17:32:51 +0000
commit0a7e7475c3799552b30aca629b87531301da4faf (patch)
treed64936d2011931f5a84947f0ee9decc3af5e6d2d
parentbb07ac4d64d50f47a3e05df6d56ca59d11bb1287 (diff)
lld: [ELF] Remove unused synthetic sections from script commands
Script commands are processed before unused synthetic sections are removed. Therefore, if a linker script matches one of these sections it'll get emitted as an empty output section because the logic for removing unused synthetic sections ignores script commands which could have already matched and captured one of these sections. This patch fixes that by also removing the unused synthetic sections from the script commands. Discussed with: dim Obtained from: LLVM r307037 Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/projects/clang500-import/; revision=320649
-rw-r--r--contrib/llvm/tools/lld/ELF/Writer.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/contrib/llvm/tools/lld/ELF/Writer.cpp b/contrib/llvm/tools/lld/ELF/Writer.cpp
index 080d8e787301..551ca260de10 100644
--- a/contrib/llvm/tools/lld/ELF/Writer.cpp
+++ b/contrib/llvm/tools/lld/ELF/Writer.cpp
@@ -1149,8 +1149,17 @@ static void removeUnusedSyntheticSections(std::vector<OutputSection *> &V) {
SS->Live = false;
// If there are no other sections in the output section, remove it from the
// output.
- if (OS->Sections.empty())
+ if (OS->Sections.empty()) {
V.erase(std::find(V.begin(), V.end(), OS));
+ // Also remove script commands matching the output section.
+ auto &Cmds = Script->Opt.Commands;
+ auto I = std::remove_if(Cmds.begin(), Cmds.end(), [&](BaseCommand *Cmd) {
+ if (auto *OSCmd = dyn_cast<OutputSectionCommand>(Cmd))
+ return OSCmd->Sec == OS;
+ return false;
+ });
+ Cmds.erase(I, Cmds.end());
+ }
}
}