summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShankar Easwaran <shankare@codeaurora.org>2013-01-11 18:56:11 +0000
committerShankar Easwaran <shankare@codeaurora.org>2013-01-11 18:56:11 +0000
commitb1d09c07f1f153589b2aa0bf721e1c488cf6f3f5 (patch)
treec5276c5deeac7267ac6a363ed3aef9ce5b3e6146
parentf73d7a53ed2ab7d00bfa2fd7dffce3596b1a4001 (diff)
downloadbcm5719-llvm-b1d09c07f1f153589b2aa0bf721e1c488cf6f3f5.tar.gz
bcm5719-llvm-b1d09c07f1f153589b2aa0bf721e1c488cf6f3f5.zip
better implementation for findOutputSection
llvm-svn: 172236
-rw-r--r--lld/lib/ReaderWriter/ELF/WriterELF.cpp22
1 files changed, 6 insertions, 16 deletions
diff --git a/lld/lib/ReaderWriter/ELF/WriterELF.cpp b/lld/lib/ReaderWriter/ELF/WriterELF.cpp
index 467db99c81a..aa6c8ef4c3b 100644
--- a/lld/lib/ReaderWriter/ELF/WriterELF.cpp
+++ b/lld/lib/ReaderWriter/ELF/WriterELF.cpp
@@ -1716,23 +1716,13 @@ public:
return error_code::success();
}
- /// \biref Find an output Section given a section name.
- ///
- /// \todo Make this not O(n). We can't use _mergedSectionMap because it
- /// doesn't get virtual addresses set :(
- Chunk<target_endianness, max_align, is64Bits> *
+ /// \brief Find an output Section given a section name.
+ MergedSections<target_endianness, max_align, is64Bits> *
findOutputSection(StringRef name) {
- for (auto seg : _segments) {
- for (auto sliceI = seg->slices_begin(),
- sliceE = seg->slices_end(); sliceI != sliceE; ++sliceI) {
- for (auto secI = (*sliceI)->sections_begin(),
- secE = (*sliceI)->sections_end(); secI != secE; ++secI) {
- if ((*secI)->name() == name)
- return *secI;
- }
- }
- }
- return nullptr;
+ auto iter = _mergedSectionMap.find(name);
+ if (iter == _mergedSectionMap.end())
+ return nullptr;
+ return iter->second;
}
/// \brief find a absolute atom given a name
OpenPOWER on IntegriCloud