summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2017-05-23 22:54:06 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2017-05-23 22:54:06 +0000
commitaeb4b7d217dae0ad2d29a5aa9a67cf2309432522 (patch)
treec178714cd8705d1f1903c185bec6d20c2727e39b /lld
parent6a1aa8d9b451b9d9f1452e86ce0b02993b8fae36 (diff)
downloadbcm5719-llvm-aeb4b7d217dae0ad2d29a5aa9a67cf2309432522.tar.gz
bcm5719-llvm-aeb4b7d217dae0ad2d29a5aa9a67cf2309432522.zip
Clear OutSec->Sections.
Once the dummy linker script is created, we want it to be used for everything to avoid having two redundant representations that can get out of sync. We were already clearing OutputSections. With this patch we clear the Sections vector of every OutputSection. llvm-svn: 303703
Diffstat (limited to 'lld')
-rw-r--r--lld/ELF/MapFile.cpp17
-rw-r--r--lld/ELF/Writer.cpp15
2 files changed, 22 insertions, 10 deletions
diff --git a/lld/ELF/MapFile.cpp b/lld/ELF/MapFile.cpp
index 7b82eceba02..806e99e3d9d 100644
--- a/lld/ELF/MapFile.cpp
+++ b/lld/ELF/MapFile.cpp
@@ -132,12 +132,17 @@ void elf::writeMapFile(llvm::ArrayRef<BaseCommand *> Script) {
OS << OSec->Name << '\n';
// Dump symbols for each input section.
- for (InputSection *IS : OSec->Sections) {
- writeHeader<ELFT>(OS, OSec->Addr + IS->OutSecOff, IS->getSize(),
- IS->Alignment);
- OS << indent(1) << toString(IS) << '\n';
- for (DefinedRegular *Sym : SectionSyms[IS])
- OS << SymStr[Sym] << '\n';
+ for (BaseCommand *Base : Cmd->Commands) {
+ auto *ISD = dyn_cast<InputSectionDescription>(Base);
+ if (!ISD)
+ continue;
+ for (InputSection *IS : ISD->Sections) {
+ writeHeader<ELFT>(OS, OSec->Addr + IS->OutSecOff, IS->getSize(),
+ IS->Alignment);
+ OS << indent(1) << toString(IS) << '\n';
+ for (DefinedRegular *Sym : SectionSyms[IS])
+ OS << SymStr[Sym] << '\n';
+ }
}
}
}
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 7a21d2b9f13..0528434b97e 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -46,6 +46,7 @@ public:
void run();
private:
+ void clearOutputSections();
void createSyntheticSections();
void copyLocalSymbols();
void addSectionSymbols();
@@ -198,6 +199,15 @@ template <class ELFT> static void combineEhFrameSections() {
V.erase(std::remove(V.begin(), V.end(), nullptr), V.end());
}
+template <class ELFT> void Writer<ELFT>::clearOutputSections() {
+ // Clear the OutputSections to make sure it is not used anymore. Any
+ // code from this point on should be using the linker script
+ // commands.
+ for (OutputSection *Sec : OutputSections)
+ Sec->Sections.clear();
+ OutputSections.clear();
+}
+
// The main function of the writer.
template <class ELFT> void Writer<ELFT>::run() {
// Create linker-synthesized sections such as .got or .plt.
@@ -288,10 +298,7 @@ template <class ELFT> void Writer<ELFT>::run() {
if (ErrorCount)
return;
- // Clear the OutputSections to make sure it is not used anymore. Any
- // code from this point on should be using the linker script
- // commands.
- OutputSections.clear();
+ clearOutputSections();
// Handle -Map option.
writeMapFile<ELFT>(Script->Opt.Commands);
OpenPOWER on IntegriCloud