mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-21 03:32:21 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218040 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
72f0d9515e
commit
344b66866d
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user