From 344b66866d9991104bdd675efff7f510817bdb1d Mon Sep 17 00:00:00 2001 From: Frederic Riss Date: Thu, 18 Sep 2014 09:38:15 +0000 Subject: [PATCH] Fix DWARFUnitSection::getUnitForOffset(). The current code is only able to return the right unit if the passed offset is the exact offset of a section. Generalize the search function by comparing againt the offset of the next unit instead and by switching the search algorithm to upper_bound. This way, the unit returned is the first unit with a getNextUnitOffset() strictly greater than the searched offset, which is exactly what we want. Note that there is no need for testing the range of the resulting unit as the offsets of a DWARFUnitSection are in a single contiguous range from 0 inclusive to lastUnit->getNextUnitOffset() exclusive. Reviewers: dblaikie samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5262 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218040 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/DWARFUnit.h | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/DebugInfo/DWARFUnit.h b/lib/DebugInfo/DWARFUnit.h index e8205be13f4..528bfbbf89b 100644 --- a/lib/DebugInfo/DWARFUnit.h +++ b/lib/DebugInfo/DWARFUnit.h @@ -46,17 +46,9 @@ class DWARFUnitSection final : public SmallVector, 1>, public DWARFUnitSectionBase { struct UnitOffsetComparator { - bool operator()(const std::unique_ptr &LHS, - const std::unique_ptr &RHS) const { - return LHS->getOffset() < RHS->getOffset(); - } - bool operator()(const std::unique_ptr &LHS, - uint32_t RHS) const { - return LHS->getOffset() < RHS; - } bool operator()(uint32_t LHS, const std::unique_ptr &RHS) const { - return LHS < RHS->getOffset(); + return LHS < RHS->getNextUnitOffset(); } }; @@ -66,7 +58,7 @@ public: typedef llvm::iterator_range iterator_range; UnitType *getUnitForOffset(uint32_t Offset) const { - auto *CU = std::lower_bound(this->begin(), this->end(), Offset, + auto *CU = std::upper_bound(this->begin(), this->end(), Offset, UnitOffsetComparator()); if (CU != this->end()) return CU->get(); -- 2.11.0