1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

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

llvm-svn: 218040
This commit is contained in:
Frederic Riss 2014-09-18 09:38:15 +00:00
parent 17c78e29d4
commit 2a187d6216

View 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();