diff options
| author | Rui Ueyama <ruiu@google.com> | 2015-03-31 22:08:43 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2015-03-31 22:08:43 +0000 |
| commit | 6a75d842c9e279ed5e309e7cbc15d9ff1f81ca93 (patch) | |
| tree | 94057c0bc69ea76589cb2629ee6037d0e9504c49 | |
| parent | 0da48b7c19991f53cfcc4ffce07f192fe9455bce (diff) | |
| download | bcm5719-llvm-6a75d842c9e279ed5e309e7cbc15d9ff1f81ca93.tar.gz bcm5719-llvm-6a75d842c9e279ed5e309e7cbc15d9ff1f81ca93.zip | |
ELF: Fix dereferencing end() iterator.
findAbsoluteAtom() returns absoluteAtom().end() if no atom is found.
Dereferencing end() value results an undefined behavior.
llvm-svn: 233765
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h index 6c1054757ed..290f4af4180 100644 --- a/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h +++ b/lld/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h @@ -30,8 +30,7 @@ public: }; HexagonTargetLayout(HexagonLinkingContext &hti) - : TargetLayout<HexagonELFType>(hti), _sdataSection(nullptr), - _gotSymAtom(nullptr), _cachedGotSymAtom(false) { + : TargetLayout<HexagonELFType>(hti), _sdataSection() { _sdataSection = new (_alloc) SDataSection<HexagonELFType>(hti); } @@ -84,21 +83,19 @@ public: } uint64_t getGOTSymAddr() { - if (!_cachedGotSymAtom) { - auto gotAtomIter = this->findAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); - _gotSymAtom = (*gotAtomIter); - _cachedGotSymAtom = true; + if (!_gotSymAtom.hasValue()) { + auto iter = this->findAbsoluteAtom("_GLOBAL_OFFSET_TABLE_"); + _gotSymAtom = (iter == this->absoluteAtoms().end()) ? nullptr : *iter; } - if (_gotSymAtom) - return _gotSymAtom->_virtualAddr; + if (*_gotSymAtom) + return (*_gotSymAtom)->_virtualAddr; return 0; } private: llvm::BumpPtrAllocator _alloc; - SDataSection<HexagonELFType> *_sdataSection; - AtomLayout *_gotSymAtom; - bool _cachedGotSymAtom; + SDataSection<HexagonELFType> *_sdataSection = nullptr; + llvm::Optional<AtomLayout *> _gotSymAtom; }; /// \brief TargetHandler for Hexagon |

