Fix DWARFUnitSection::getUnitForOffset().
authorFrederic Riss <friss@apple.com>
Thu, 18 Sep 2014 09:38:15 +0000 (09:38 +0000)
committerFrederic Riss <friss@apple.com>
Thu, 18 Sep 2014 09:38:15 +0000 (09:38 +0000)
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

index e8205be13f49ea1a9b32c920874d2907f1b40967..528bfbbf89b9393ad030bb14051b6234e4600e46 100644 (file)
@@ -46,17 +46,9 @@ class DWARFUnitSection final : public SmallVector<std::unique_ptr<UnitType>, 1>,
                                public DWARFUnitSectionBase {
 
   struct UnitOffsetComparator {
-    bool operator()(const std::unique_ptr<UnitType> &LHS,
-                    const std::unique_ptr<UnitType> &RHS) const {
-      return LHS->getOffset() < RHS->getOffset();
-    }
-    bool operator()(const std::unique_ptr<UnitType> &LHS,
-                    uint32_t RHS) const {
-      return LHS->getOffset() < RHS;
-    }
     bool operator()(uint32_t LHS,
                     const std::unique_ptr<UnitType> &RHS) const {
-      return LHS < RHS->getOffset();
+      return LHS < RHS->getNextUnitOffset();
     }
   };
 
@@ -66,7 +58,7 @@ public:
   typedef llvm::iterator_range<typename UnitVector::iterator> 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();